diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/.choreo/endpoints.yaml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/.choreo/endpoints.yaml new file mode 100644 index 000000000..2d4dcf49f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/.choreo/endpoints.yaml @@ -0,0 +1,22 @@ +# +required Version of the endpoint configuration YAML +version: 0.1 + +# +required List of endpoints to create +endpoints: + # +required Unique name for the endpoint. (This name will be used when generating the managed API) +- name: Channel Service + # +required Numeric port value that gets exposed via this endpoint + port: 9091 + # +required Type of the traffic this endpoint is accepting. Example: REST, GraphQL, etc. + # Allowed values: REST, GraphQL, GRPC + type: REST + # +optional Network level visibility of this endpoint. Defaults to Project + # Accepted values: Project|Organization|Public. + networkVisibility: Public + # +optional Context (base path) of the API that is exposed via this endpoint. + # This is mandatory if the endpoint type is set to REST or GraphQL. + context: / + # +optional Path to the schema definition file. Defaults to wild card route if not provided + # This is only applicable to REST endpoint types. + # The path should be relative to the docker context. + schemaFilePath: service_openapi.yaml diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/.devcontainer.json b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/.devcontainer.json new file mode 100644 index 000000000..a78c901fb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/.devcontainer.json @@ -0,0 +1,4 @@ +{ + "image": "ballerina/ballerina-devcontainer:2201.4.0", + "extensions": ["WSO2.ballerina"], +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Ballerina.toml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Ballerina.toml new file mode 100644 index 000000000..51d126e43 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Ballerina.toml @@ -0,0 +1,14 @@ +[package] +org = "WSO2" +name = "channel_service" +version = "1.0.0" +export = ["channel_service"] +distribution = "2201.5.0" + +[build-options] +observabilityIncluded = true + +[[dependency]] +org = "pubudu538" +name = "choreo.user.info" +version = "0.1.1" diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Dependencies.toml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Dependencies.toml new file mode 100644 index 000000000..5af695287 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Dependencies.toml @@ -0,0 +1,437 @@ +# AUTO-GENERATED FILE. DO NOT MODIFY. + +# This file is auto-generated by Ballerina for managing dependency versions. +# It should not be modified by hand. + +[ballerina] +dependencies-toml-version = "2" + +[[package]] +org = "WSO2" +name = "channel_service" +version = "1.0.0" +dependencies = [ + {org = "ballerina", name = "http"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jwt"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "mime"}, + {org = "ballerina", name = "random"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "uuid"}, + {org = "ballerinai", name = "observe"}, + {org = "ballerinai", name = "transaction"}, + {org = "ballerinax", name = "java.jdbc"}, + {org = "ballerinax", name = "mysql"}, + {org = "ballerinax", name = "mysql.driver"} +] +modules = [ + {org = "WSO2", packageName = "channel_service", moduleName = "channel_service"} +] + +[[package]] +org = "ballerina" +name = "auth" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.array"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "regex"} +] + +[[package]] +org = "ballerina" +name = "cache" +version = "3.3.0" +dependencies = [ + {org = "ballerina", name = "constraint"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "constraint" +version = "1.0.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "crypto" +version = "2.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "file" +version = "1.5.0" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "os"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "http" +version = "2.5.4" +dependencies = [ + {org = "ballerina", name = "auth"}, + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "constraint"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "file"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "jwt"}, + {org = "ballerina", name = "lang.array"}, + {org = "ballerina", name = "lang.decimal"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "lang.runtime"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "mime"}, + {org = "ballerina", name = "oauth2"}, + {org = "ballerina", name = "observe"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "url"} +] +modules = [ + {org = "ballerina", packageName = "http", moduleName = "http"} +] + +[[package]] +org = "ballerina" +name = "io" +version = "1.3.1" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.value"} +] +modules = [ + {org = "ballerina", packageName = "io", moduleName = "io"} +] + +[[package]] +org = "ballerina" +name = "jballerina.java" +version = "0.0.0" + +[[package]] +org = "ballerina" +name = "jwt" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "jwt", moduleName = "jwt"} +] + +[[package]] +org = "ballerina" +name = "lang.__internal" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"} +] + +[[package]] +org = "ballerina" +name = "lang.array" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.__internal"} +] + +[[package]] +org = "ballerina" +name = "lang.decimal" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.int" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.object" +version = "0.0.0" + +[[package]] +org = "ballerina" +name = "lang.regexp" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.runtime" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.string" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.regexp"} +] + +[[package]] +org = "ballerina" +name = "lang.transaction" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.value" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "log" +version = "2.5.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "observe"} +] +modules = [ + {org = "ballerina", packageName = "log", moduleName = "log"} +] + +[[package]] +org = "ballerina" +name = "mime" +version = "2.5.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"} +] +modules = [ + {org = "ballerina", packageName = "mime", moduleName = "mime"} +] + +[[package]] +org = "ballerina" +name = "oauth2" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "observe" +version = "1.0.6" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "os" +version = "1.5.0" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "random" +version = "1.3.1" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "random", moduleName = "random"} +] + +[[package]] +org = "ballerina" +name = "regex" +version = "1.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.string"} +] + +[[package]] +org = "ballerina" +name = "sql" +version = "1.6.3" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "sql", moduleName = "sql"} +] + +[[package]] +org = "ballerina" +name = "task" +version = "2.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "time" +version = "2.2.5" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] +modules = [ + {org = "ballerina", packageName = "time", moduleName = "time"} +] + +[[package]] +org = "ballerina" +name = "url" +version = "2.2.4" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "uuid" +version = "1.4.0" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "uuid", moduleName = "uuid"} +] + +[[package]] +org = "ballerinai" +name = "observe" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "observe"} +] +modules = [ + {org = "ballerinai", packageName = "observe", moduleName = "observe"} +] + +[[package]] +org = "ballerinai" +name = "transaction" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "http"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.runtime"}, + {org = "ballerina", name = "lang.transaction"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "uuid"} +] +modules = [ + {org = "ballerinai", packageName = "transaction", moduleName = "transaction"} +] + +[[package]] +org = "ballerinax" +name = "java.jdbc" +version = "1.6.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerinax", packageName = "java.jdbc", moduleName = "java.jdbc"} +] + +[[package]] +org = "ballerinax" +name = "mysql" +version = "1.6.2" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerinax", packageName = "mysql", moduleName = "mysql"} +] + +[[package]] +org = "ballerinax" +name = "mysql.driver" +version = "1.4.1" +modules = [ + {org = "ballerinax", packageName = "mysql.driver", moduleName = "mysql.driver"} +] + + diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Module.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Module.md new file mode 100644 index 000000000..83cc6eb03 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Module.md @@ -0,0 +1,6 @@ +A simple HTTP Service implementation. +[//]: # (above is the module summary) + +# Module Overview +Provides an overview about the module when generating the API documentations. +For example, refer to https://lib.ballerina.io/ballerina/io/latest diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Package.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Package.md new file mode 100644 index 000000000..46d028dbc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/Package.md @@ -0,0 +1,5 @@ +A simple HTTP Service implementation. +[//]: # (above is the package summary) + +# Package Overview +A simple HTTP Service implementation. diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/README.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/README.md new file mode 100644 index 000000000..e642d60d5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/README.md @@ -0,0 +1,13 @@ +# Channel Service + +## Prerequisites: + +- [Ballerina](https://ballerina.io/) + - Tested version: **Ballerina 2201.3.4 (Swan Lake Update 3)** + +### Run Ballerina Service Locally + +- Execute the following command in the terminal. + ``` + bal run + ``` \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/channel_mgt_dao.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/channel_mgt_dao.bal new file mode 100644 index 000000000..1aa745df9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/channel_mgt_dao.bal @@ -0,0 +1,559 @@ +import ballerinax/java.jdbc; +import ballerina/sql; +import ballerina/log; + +function dbGetDoctorsByOrg(string org) returns Doctor[]|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT d.id, d.org, d.createdAt, d.name, d.gender, d.registrationNumber, d.specialty, + d.emailAddress, d.dateOfBirth, d.address, IFNULL(a.date, "") as date, IFNULL(a.startTime, "") as startTime, + IFNULL(a.endTime, "") as endTime, IFNULL(a.availableBookingCount, 0) as availableBookingCount FROM Doctor d + LEFT JOIN Availability a ON d.id = a.doctorId WHERE org = ${org}`; + stream doctorStream = dbClient->query(query); + + map doctorList = check getDoctorsFromStream(doctorStream); + check doctorStream.close(); + return doctorList.toArray(); + } + on fail error e { + return handleError(e); + } +} + +function dbGetDoctorByIdAndOrg(string org, string doctorId) returns Doctor|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT d.id, d.org, d.createdAt, d.name, d.gender, d.registrationNumber, d.specialty, + d.emailAddress, d.dateOfBirth, d.address, IFNULL(a.date, "") as date, IFNULL(a.startTime, "") as startTime, + IFNULL(a.endTime, "") as endTime, IFNULL(a.availableBookingCount, 0) as availableBookingCount FROM Doctor d + LEFT JOIN Availability a ON d.id = a.doctorId WHERE org = ${org} and id = ${doctorId}`; + stream doctorStream = dbClient->query(query); + + map doctorList = check getDoctorsFromStream(doctorStream); + + if doctorList.length() == 0 { + return (); + } + return doctorList.get(doctorId); + } + on fail error e { + return handleError(e); + } +} + +function dbGetDoctorByOrgAndEmail(string org, string email) returns Doctor|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT d.id, d.org, d.createdAt, d.name, d.gender, d.registrationNumber, d.specialty, + d.emailAddress, d.dateOfBirth, d.address, IFNULL(a.date, "") as date, IFNULL(a.startTime, "") as startTime, + IFNULL(a.endTime, "") as endTime, IFNULL(a.availableBookingCount, 0) as availableBookingCount FROM Doctor d + LEFT JOIN Availability a ON d.id = a.doctorId WHERE org = ${org} and emailAddress = ${email}`; + stream doctorStream = dbClient->query(query); + + map doctorList = check getDoctorsFromStream(doctorStream); + + if doctorList.length() == 0 { + return (); + } + return doctorList.get(doctorList.keys()[0]); + } + on fail error e { + return handleError(e); + } +} + +function dbGetDoctorByDoctorId(string doctorId) returns Doctor|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT d.id, d.org, d.createdAt, d.name, d.gender, d.registrationNumber, d.specialty, + d.emailAddress, d.dateOfBirth, d.address, IFNULL(a.date, "") as date, IFNULL(a.startTime, "") as startTime, + IFNULL(a.endTime, "") as endTime, IFNULL(a.availableBookingCount, 0) as availableBookingCount FROM Doctor d + LEFT JOIN Availability a ON d.id = a.doctorId WHERE id = ${doctorId}`; + stream doctorStream = dbClient->query(query); + + map doctorList = check getDoctorsFromStream(doctorStream); + + if doctorList.length() == 0 { + return (); + } + return doctorList.get(doctorId); + } + on fail error e { + return handleError(e); + } +} + +function dbDeleteDoctorById(string org, string doctorId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE from Doctor WHERE id = ${doctorId} and org = ${org}`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Doctor deleted successfully"; +} + +function dbAddDoctor(Doctor doctor) returns Doctor|error { + + log:printInfo("Adding doctor from DB"); + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + log:printInfo("DB client error"); + return handleError(dbClient); + } + + transaction { + log:printInfo("Starting transaction"); + sql:ParameterizedQuery query = `INSERT INTO Doctor (id, org, createdAt, name, gender, registrationNumber, + specialty, emailAddress, dateOfBirth, address) VALUES (${doctor.id}, ${doctor.org}, ${doctor.createdAt}, + ${doctor.name}, ${doctor.gender}, ${doctor.registrationNumber}, ${doctor.specialty}, ${doctor.emailAddress}, + ${doctor.dateOfBirth}, ${doctor.address});`; + + log:printInfo("executing query"); + + sql:ExecutionResult|sql:Error insertResult = check dbClient->execute(query); + + if insertResult is sql:Error { + log:printError("Error while inserting the doctor", insertResult); + } + + log:printInfo("Doctor added"); + log:printInfo("Adding timeslots"); + + Availability[]? availabilitySlots = doctor.availability; + sql:ExecutionResult[]|sql:Error batchResult = []; + + if availabilitySlots != null && availabilitySlots.length() > 0 { + sql:ParameterizedQuery[] batchResultinsertQueries = from Availability availability in availabilitySlots + from TimeSlot timeSlot in availability.timeSlots + select `INSERT INTO Availability (doctorId, date, startTime, endTime, availableBookingCount) + VALUES (${doctor.id}, ${availability.date}, ${timeSlot.startTime}, ${timeSlot.endTime}, + ${timeSlot.availableBookingCount})`; + batchResult = dbClient->batchExecute(batchResultinsertQueries); + } + + if batchResult is sql:Error { + log:printInfo("batchResult is sql:Error" + batchResult.toString()); + rollback; + return handleError(batchResult); + } else { + log:printInfo("batchResult is not error"); + check commit; + + Doctor|()|error addedDoctor = dbGetDoctorByDoctorId(doctor.id); + log:printInfo("added doctor: " + doctor.toString()); + if addedDoctor is () { + return error("Error while adding the doctor"); + } + + return addedDoctor; + } + } on fail error e { + log:printInfo("On fail error", e); + return handleError(e); + } +} + +function dbUpdateDoctor(Doctor doctor) returns Doctor|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + transaction { + sql:ParameterizedQuery query = `UPDATE Doctor SET name = ${doctor.name}, gender = ${doctor.gender}, + registrationNumber = ${doctor.registrationNumber}, specialty = ${doctor.specialty},emailAddress = ${doctor.emailAddress}, + dateOfBirth = ${doctor.dateOfBirth}, address = ${doctor.address} WHERE id = ${doctor.id};`; + _ = check dbClient->execute(query); + + sql:ParameterizedQuery deleteQuery = `DELETE FROM Availability WHERE doctorId = ${doctor.id};`; + _ = check dbClient->execute(deleteQuery); + + Availability[]? availabilitySlots = doctor.availability; + sql:ExecutionResult[]|sql:Error batchResult = []; + + if availabilitySlots != null { + + sql:ParameterizedQuery[] insertQueries = from Availability availability in availabilitySlots + from TimeSlot timeSlot in availability.timeSlots + select `INSERT INTO Availability (doctorId, date, startTime, endTime, availableBookingCount) + VALUES (${doctor.id}, ${availability.date}, ${timeSlot.startTime}, ${timeSlot.endTime}, + ${timeSlot.availableBookingCount})`; + batchResult = dbClient->batchExecute(insertQueries); + } + + if batchResult is sql:Error { + rollback; + return handleError(batchResult); + } else { + check commit; + + Doctor|()|error updatedDoctor = dbGetDoctorByDoctorId(doctor.id); + if updatedDoctor is () { + return error("Error while updating the doctor"); + } + return updatedDoctor; + } + + } on fail error e { + return handleError(e); + } +} + +function dbAddThumbnailById(string doctorId, Thumbnail thumbnail) returns string|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `INSERT INTO Thumbnail (doctorId, fileName, content) + VALUES (${doctorId}, ${thumbnail.fileName}, ${thumbnail.content.toBytes()});`; + _ = check dbClient->execute(query); + + return "Thumbnail added successfully"; + } + on fail error e { + return handleError(e); + } +} + +function dbDeleteThumbnailById(string doctorId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE FROM Thumbnail WHERE doctorId = ${doctorId};`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Thumbnail deleted successfully"; +} + +function dbGetThumbnailById(string doctorId) returns Thumbnail|string|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `SELECT fileName, content FROM Thumbnail WHERE doctorId = ${doctorId}`; + Thumbnail|sql:Error result = dbClient->queryRow(query); + + if result is sql:NoRowsError { + return "No thumbnail found for doctorId: " + doctorId; + } else if result is sql:Error { + return handleError(result); + } else { + return result; + } +} + +function dbGetBookingsByOrgAndEmail(string org, string email) returns Booking[]|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT id, org, referenceNumber, emailAddress, createdAt, petOwnerName, + mobileNumber, doctorId, petId, petName, petType, petDoB, status, date, sessionStartTime, sessionEndTime, + appointmentNumber from Booking WHERE org = ${org} and emailAddress = ${email}`; + stream bookingStream = dbClient->query(query); + + Booking[] bookings = check from Booking booking in bookingStream + select booking; + check bookingStream.close(); + return bookings; + } + on fail error e { + return handleError(e); + } +} + +function dbGetActiveBookingsByDoctorId(string org, string doctorId, string date, string sessionStartTime, string sessionEndTime) returns int|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT COUNT(*) FROM Booking WHERE org = ${org} AND doctorId = ${doctorId} + AND date = ${date} AND sessionStartTime = ${sessionStartTime} AND sessionEndTime = ${sessionEndTime}`; + int|sql:Error result = dbClient->queryRow(query); + return result; + } + on fail error e { + return handleError(e); + } +} + +function dbGetBookingsByOrgAndDoctorId(string org, string doctorId, string date) returns Booking[]|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT id, org, referenceNumber, emailAddress, createdAt, petOwnerName, + mobileNumber, doctorId, petId, petName, petType, petDoB, status, date, sessionStartTime, sessionEndTime, + appointmentNumber from Booking WHERE org = ${org} and doctorId = ${doctorId}`; + + if date != "" { + sql:ParameterizedQuery queryWithDate = ` and date = ${date}`; + query = sql:queryConcat(query, queryWithDate); + } + + stream bookingStream = dbClient->query(query); + + Booking[] bookings = check from Booking booking in bookingStream + select booking; + check bookingStream.close(); + return bookings; + } + on fail error e { + return handleError(e); + } +} + +function dbGetBookingsByOrgAndId(string org, string id) returns Booking|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `SELECT id, org, referenceNumber, emailAddress, createdAt, petOwnerName, + mobileNumber, doctorId, petId, petName, petType, petDoB, status, date, sessionStartTime, sessionEndTime, + appointmentNumber from Booking WHERE org = ${org} and id = ${id}`; + + Booking|sql:Error result = dbClient->queryRow(query); + + if result is sql:NoRowsError { + return (); + } else if result is sql:Error { + return handleError(result); + } else { + return result; + } +} + +function dbAddBooking(Booking booking) returns Booking|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `INSERT INTO Booking (id, org, referenceNumber, emailAddress, createdAt, + petOwnerName, mobileNumber, doctorId, petId, petName, petType, petDoB, status, date, sessionStartTime, + sessionEndTime, appointmentNumber) VALUES (${booking.id}, ${booking.org}, ${booking.referenceNumber}, + ${booking.emailAddress}, ${booking.createdAt}, ${booking.petOwnerName}, ${booking.mobileNumber}, + ${booking.doctorId}, ${booking.petId}, ${booking.petName}, ${booking.petType}, ${booking.petDoB}, + ${booking.status}, ${booking.date}, ${booking.sessionStartTime}, ${booking.sessionEndTime}, + ${booking.appointmentNumber});`; + _ = check dbClient->execute(query); + + Booking|()|error addedBooking = dbGetBookingsByOrgAndId(booking.org, booking.id); + if addedBooking is () { + return error("Error while adding the booking"); + } + return addedBooking; + } + on fail error e { + return handleError(e); + } +} + +function dbUpdateBooking(Booking booking) returns Booking|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `UPDATE Booking SET petOwnerName = ${booking.petOwnerName}, + mobileNumber = ${booking.mobileNumber}, doctorId = ${booking.doctorId}, petId = ${booking.petId}, + petName = ${booking.petName}, petType = ${booking.petType}, petDoB = ${booking.petDoB}, status = ${booking.status}, + date = ${booking.date}, sessionStartTime = ${booking.sessionStartTime}, sessionEndTime = ${booking.sessionEndTime}, + appointmentNumber = ${booking.appointmentNumber} WHERE id = ${booking.id};`; + _ = check dbClient->execute(query); + + Booking|()|error updatedBooking = dbGetBookingsByOrgAndId(booking.org, booking.id); + if updatedBooking is () { + return error("Error while updating the booking"); + } + return updatedBooking; + } + on fail error e { + return handleError(e); + } +} + +function dbDeleteBookingById(string bookingId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE FROM Booking WHERE id = ${bookingId};`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Booking deleted successfully"; +} + +function dbUpdateOrgInfoByOrg(OrgInfo orgInfo) returns OrgInfo|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `INSERT INTO OrgInfo (orgName, name, address, telephoneNumber, registrationNumber) + VALUES (${orgInfo.orgName}, ${orgInfo.name}, ${orgInfo.address}, ${orgInfo.telephoneNumber}, ${orgInfo.registrationNumber}) + ON DUPLICATE KEY UPDATE name = ${orgInfo.name}, address = ${orgInfo.address}, telephoneNumber = ${orgInfo.telephoneNumber};`; + _ = check dbClient->execute(query); + + OrgInfo|()|error updatedOrgInfo = dbGetOrgInfoByOrg(orgInfo.orgName); + + if updatedOrgInfo is () { + return error("Error while updating the org info"); + } + return updatedOrgInfo; + } + on fail error e { + return handleError(e); + } +} + +function dbGetOrgInfoByOrg(string org) returns OrgInfo|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `SELECT orgName, name, address, telephoneNumber, registrationNumber from OrgInfo + WHERE orgName = ${org}`; + + OrgInfo|sql:Error result = dbClient->queryRow(query); + + if result is sql:NoRowsError { + return (); + } else if result is sql:Error { + return handleError(result); + } else { + return result; + } +} + +function handleError(error err) returns error { + log:printError("Error while processing the request", err); + return error("Error while processing the request"); +} + +function getDoctorsFromStream(stream doctorStream) returns map|error { + + map doctors = {}; + + check from DoctorAvailabilityRecord entry in doctorStream + do { + boolean isDoctorAvailable = doctors.hasKey(entry.id); + if !isDoctorAvailable { + + Doctor doctor = { + id: entry.id, + name: entry.name, + createdAt: entry.createdAt, + specialty: entry.specialty, + emailAddress: entry.emailAddress, + gender: entry.gender, + org: entry.org, + registrationNumber: entry.registrationNumber, + availability: [] + }; + + TimeSlot timeSlot = { + availableBookingCount: entry.availableBookingCount, + startTime: entry.startTime, + endTime: entry.endTime + }; + + Availability availability = { + date: entry.date, + timeSlots: [timeSlot] + }; + + doctor.availability.push(availability); + doctors[doctor.id] = doctor; + } else { + + TimeSlot timeSlot = { + availableBookingCount: entry.availableBookingCount, + startTime: entry.startTime, + endTime: entry.endTime + }; + + Availability availability = { + date: entry.date, + timeSlots: [timeSlot] + }; + + Doctor d = doctors.get(entry.id); + d.availability.push(availability); + } + }; + + return doctors; +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/channel_mgt_impl.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/channel_mgt_impl.bal new file mode 100644 index 000000000..90b80b160 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/channel_mgt_impl.bal @@ -0,0 +1,660 @@ +import ballerinax/java.jdbc; +import ballerinax/mysql.driver as _; +import ballerina/uuid; +import ballerina/sql; +import ballerina/log; +import ballerinax/mysql; +import ballerina/time; +import ballerina/http; +import ballerina/random; +import ballerina/io; + +configurable string dbHost = "localhost"; +configurable string dbUsername = "admin"; +configurable string dbPassword = "admin"; +configurable string dbDatabase = "CHANNEL_DB"; +configurable int dbPort = 3306; +configurable string emailService = "localhost:9090"; + +table key(org, id) doctorRecords = table []; +table key(org, id) bookingRecords = table []; +table key(orgName) orgRecords = table []; + +final mysql:Client|error dbClient; +boolean useDB = false; +map thumbnailMap = {}; + +const BOOKING_STATUS_CONFIRMED = "Confirmed"; +const BOOKING_STATUS_COMPLETED = "Completed"; + +function init() returns error? { + + if dbHost != "localhost" && dbHost != "" { + useDB = true; + } + + sql:ConnectionPool connPool = { + maxOpenConnections: 20, + minIdleConnections: 20, + maxConnectionLifeTime: 300 + }; + + mysql:Options mysqlOptions = { + connectTimeout: 10 + }; + + dbClient = new (dbHost, dbUsername, dbPassword, dbDatabase, dbPort, options = mysqlOptions, connectionPool = connPool); + + if dbClient is sql:Error { + if (!useDB) { + log:printInfo("DB configurations are not given. Hence storing the data locally"); + } else { + log:printError("DB configuraitons are not correct. Please check the configuration", 'error = dbClient); + return error("DB configuraitons are not correct. Please check the configuration"); + } + } + + if useDB { + log:printInfo("DB configurations are given. Hence storing the data in DB"); + } + +} + +function getConnection() returns jdbc:Client|error { + return dbClient; +} + +function getDoctors(string org) returns Doctor[]|error { + + if (useDB) { + return dbGetDoctorsByOrg(org); + } else { + Doctor[] doctorList = []; + doctorRecords.forEach(function(Doctor doctor) { + if doctor.org == org { + doctorList.push(doctor); + } + }); + return doctorList; + } +} + +function getDoctorByIdAndOrg(string org, string doctorId) returns Doctor|()|error { + + if (useDB) { + return dbGetDoctorByIdAndOrg(org, doctorId); + } else { + Doctor? doctor = doctorRecords[org, doctorId]; + if doctor is () { + return (); + } + return doctor; + } +} + +function getDoctorById(string doctorId) returns Doctor|()|error { + + Doctor doctor = { + id: "", + org: "", + emailAddress: "", + address: "", + specialty: "", + gender: "", + registrationNumber: "", + name: "", + availability: [], + createdAt: "" + }; + if (useDB) { + return dbGetDoctorByDoctorId(doctorId); + } else { + foreach Doctor doc in doctorRecords { + if doc.id == doctorId { + doctor = doc; + break; + } + } + + if doctor.id == "" { + return (); + } + return doctor; + } +} + +function getDoctorByOrgAndEmail(string org, string emailAddress) returns Doctor|()|error { + + if (useDB) { + return dbGetDoctorByOrgAndEmail(org, emailAddress); + } else { + foreach Doctor doc in doctorRecords { + if doc.org == org && doc.emailAddress == emailAddress { + return doc; + } + } + return (); + } + +} + +function updateDoctorById(string org, string doctorId, DoctorItem updatedDoctorItem) returns Doctor|()|error { + + if (useDB) { + Doctor|() oldDoctor = check dbGetDoctorByIdAndOrg(org, doctorId); + if oldDoctor is () { + return (); + } + + Doctor doctor = {id: doctorId, org: org, createdAt: oldDoctor.createdAt, ...updatedDoctorItem}; + Doctor|error updatedDoctor = dbUpdateDoctor(doctor); + + if updatedDoctor is error { + return updatedDoctor; + } + return updatedDoctor; + } else { + Doctor? oldeDoctorRecord = doctorRecords[org, doctorId]; + if oldeDoctorRecord is () { + return (); + } + _ = doctorRecords.remove([org, doctorId]); + doctorRecords.put({id: doctorId, org: org, createdAt: oldeDoctorRecord.createdAt, ...updatedDoctorItem}); + Doctor? doctor = doctorRecords[org, doctorId]; + return doctor; + } +} + +function deleteDoctorById(string org, string doctorId) returns string|()|error { + + if (useDB) { + return dbDeleteDoctorById(org, doctorId); + } else { + Doctor? doctorRecord = doctorRecords[org, doctorId]; + if doctorRecord is () { + return (); + } + _ = doctorRecords.remove([org, doctorId]); + return "Doctor deleted successfully"; + } +} + +function addDoctor(DoctorItem doctorItem, string org) returns Doctor|error { + + string docId = doctorItem.emailAddress; + time:Utc currentUtc = time:utcNow(); + time:Civil currentTime = time:utcToCivil(currentUtc); + string timeString = civilToIso8601(currentTime); + + Doctor doctor = { + id: docId, + org: org, + createdAt: timeString, + ...doctorItem + }; + + if (useDB) { + return dbAddDoctor(doctor); + } else { + doctorRecords.put(doctor); + Doctor addedDoctor = doctorRecords[org, docId]; + return addedDoctor; + } +} + +function updateThumbnailByDoctorId(string org, string doctorId, Thumbnail thumbnail) returns string|()|error { + + if (useDB) { + + string|()|error deleteResult = dbDeleteThumbnailById(doctorId); + + if deleteResult is error { + return deleteResult; + } + + if thumbnail.fileName != "" { + string|error result = dbAddThumbnailById(doctorId, thumbnail); + + if result is error { + return result; + } + } + + return "Thumbnail updated successfully"; + } else { + + string thumbnailKey = getThumbnailKey(org, doctorId); + if thumbnail.fileName == "" { + if thumbnailMap.hasKey(thumbnailKey) { + _ = thumbnailMap.remove(thumbnailKey); + } + + } else { + thumbnailMap[thumbnailKey] = thumbnail; + } + + return "Thumbnail updated successfully"; + } +} + +function getThumbnailByDoctorId(string org, string doctorId) returns Thumbnail|()|string|error { + + if (useDB) { + + Thumbnail|string|error getResult = dbGetThumbnailById(doctorId); + + if getResult is error { + return getResult; + } else if getResult is string { + return getResult; + } else { + return getResult; + } + } else { + + string thumbnailKey = getThumbnailKey(org, doctorId); + if thumbnailMap.hasKey(thumbnailKey) { + Thumbnail thumbnail = thumbnailMap[thumbnailKey]; + return thumbnail; + } else { + return (); + } + } +} + +function getBookingsByOrgAndEmail(string org, string email) returns Booking[]|error { + + if (useDB) { + return dbGetBookingsByOrgAndEmail(org, email); + } else { + Booking[] bookingList = []; + bookingRecords.forEach(function(Booking booking) { + if booking.org == org && booking.emailAddress == email { + bookingList.push(booking); + } + }); + return bookingList; + } +} + +function getBookingsByDoctorId(string org, string doctorId, string date) returns Booking[]|error { + + if (useDB) { + return dbGetBookingsByOrgAndDoctorId(org, doctorId, date); + } else { + Booking[] bookingList = []; + bookingRecords.forEach(function(Booking booking) { + if date is "" { + if booking.org == org && booking.doctorId == doctorId { + bookingList.push(booking); + } + } else { + if booking.org == org && booking.doctorId == doctorId && booking.date == date { + bookingList.push(booking); + } + } + }); + + return bookingList; + } +} + +function getNextAppointmentNumber(string org, string doctorId, string date, + string sessionStartTime, string sessionEndTime) returns NextAppointment|()|error { + + boolean isValid = isValidDoctorSession(org, doctorId, date, sessionStartTime, sessionEndTime); + + if !isValid { + return (); + } + + NextAppointment nextAppointment = { + date: date, + doctorId: doctorId, + sessionEndTime: sessionEndTime, + sessionStartTime: sessionStartTime, + activeBookingCount: 0, + nextAppointmentNumber: 0 + }; + + int activeBookingCount = 0; + if (useDB) { + int result = check dbGetActiveBookingsByDoctorId(org, doctorId, date, sessionStartTime, sessionEndTime); + activeBookingCount = result; + } else { + bookingRecords.forEach(function(Booking booking) { + if booking.org == org && booking.doctorId == doctorId && booking.date == date && + booking.sessionStartTime == sessionStartTime && booking.sessionEndTime == sessionEndTime { + activeBookingCount = activeBookingCount + 1; + } + }); + } + + nextAppointment.activeBookingCount = activeBookingCount; + nextAppointment.nextAppointmentNumber = activeBookingCount + 1; + + return nextAppointment; +} + +function isValidDoctorSession(string org, string doctorId, string date, + string sessionStartTime, string sessionEndTime) returns boolean { + + boolean isValidDoctorSession = false; + Doctor|()|error doctor = getDoctorByIdAndOrg(org, doctorId); + + io:println("doctor: ", doctor); + + if doctor is Doctor { + Availability[] doctorAvailability = doctor.availability; + + foreach Availability availability in doctorAvailability { + if availability.date == date { + TimeSlot[] timeSlots = availability.timeSlots; + foreach TimeSlot timeSlot in timeSlots { + if timeSlot.startTime == sessionStartTime && timeSlot.endTime == sessionEndTime { + isValidDoctorSession = true; + break; + } else { + isValidDoctorSession = false; + } + } + } + } + + } + + return isValidDoctorSession; +} + +function addBooking(BookingItem bookingItem, string org, string emailAddress) returns Booking|error { + + string bookingId = uuid:createType1AsString(); + time:Utc currentUtc = time:utcNow(); + time:Civil currentTime = time:utcToCivil(currentUtc); + string timeString = civilToIso8601(currentTime); + string refNumber = getReferenceNumber(); + + NextAppointment|()|error nextAppointment = getNextAppointmentNumber(org, bookingItem.doctorId, bookingItem.date, + bookingItem.sessionStartTime, bookingItem.sessionEndTime); + + if nextAppointment is NextAppointment { + + Booking booking = { + id: bookingId, + org: org, + referenceNumber: refNumber, + emailAddress: emailAddress, + createdAt: timeString, + status: CONFIRMED, + appointmentNumber: nextAppointment.nextAppointmentNumber, + ...bookingItem + }; + if (useDB) { + return dbAddBooking(booking); + } else { + bookingRecords.put(booking); + Booking addedBooking = bookingRecords[org, bookingId]; + return addedBooking; + } + } else if nextAppointment is () { + return error("Invalid doctor session"); + } else { + return nextAppointment; + } + +} + +function getBookingByIdAndOrg(string org, string bookingId) returns Booking|()|error { + + if (useDB) { + return dbGetBookingsByOrgAndId(org, bookingId); + } else { + Booking? booking = bookingRecords[org, bookingId]; + if booking is () { + return (); + } + return booking; + } +} + +function updateBookingById(string org, string bookingId, BookingItemUpdated updatedBookingItem) returns Booking|()|error { + + Booking|()|error oldeBookingRecord = getBookingByIdAndOrg(org, bookingId); + + if oldeBookingRecord is error { + return oldeBookingRecord; + } else if oldeBookingRecord is () { + return (); + } else { + + Booking booking = { + id: bookingId, + org: org, + referenceNumber: oldeBookingRecord.referenceNumber, + emailAddress: oldeBookingRecord.emailAddress, + createdAt: oldeBookingRecord.createdAt, + appointmentNumber: oldeBookingRecord.appointmentNumber, + ...updatedBookingItem + }; + + if (useDB) { + return dbUpdateBooking(booking); + } else { + bookingRecords.put(booking); + Booking? updatedBooking = bookingRecords[org, bookingId]; + return updatedBooking; + } + } +} + +function deleteBookingById(string org, string bookingId) returns string|()|error { + + if (useDB) { + return dbDeleteBookingById(bookingId); + } else { + Booking? bookingRecord = bookingRecords[org, bookingId]; + if bookingRecord is () { + return (); + } + _ = bookingRecords.remove([org, bookingId]); + return "Booking deleted successfully"; + } +} + +function getOrgInfo(string org) returns OrgInfo|()|error { + + if (useDB) { + return dbGetOrgInfoByOrg(org); + } else { + OrgInfo? orgInfo = orgRecords[org]; + if orgInfo is () { + return (); + } + return orgInfo; + } +} + +function updateOrgInfo(string org, OrgInfoItem orgInfoItem) returns OrgInfo|error { + + OrgInfo orgInfo = { + orgName: org, + ...orgInfoItem + }; + + if (useDB) { + return dbUpdateOrgInfoByOrg(orgInfo); + } else { + orgRecords.put(orgInfo); + OrgInfo updatedOrgInfo = orgRecords[org]; + return updatedOrgInfo; + } +} + +# Converts time:Civil time to string 2022-07-12T05:42:35Z +# +# + time - time:Civil time record. +# + return - Converted ISO 8601 string. +function civilToIso8601(time:Civil time) returns string { + string year = time.year.toString(); + string month = time.month < 10 ? string `0${time.month}` : time.month.toString(); + string day = time.day < 10 ? string `0${time.day}` : time.day.toString(); + string hour = time.hour < 10 ? string `0${time.hour}` : time.hour.toString(); + string minute = time.minute < 10 ? string `0${time.minute}` : time.minute.toString(); + + decimal? seconds = time.second; + string second = seconds is () ? "00" : (seconds < 10.0d ? string `0${seconds}` : seconds.toString()); + + time:ZoneOffset? zoneOffset = time.utcOffset; + string timeZone = "Z"; + if zoneOffset is time:ZoneOffset { + if zoneOffset.hours == 0 && zoneOffset.minutes == 0 { + timeZone = "Z"; + } else { + string hours = zoneOffset.hours.abs() < 10 ? string `0${zoneOffset.hours.abs()}` : zoneOffset.hours.abs().toString(); + string minutes = zoneOffset.minutes.abs() < 10 ? string `0${zoneOffset.minutes.abs()}` : zoneOffset.minutes.abs().toString(); + timeZone = zoneOffset.hours < 0 ? string `-${hours}${minutes}` : string `+${hours}${minutes}`; + } + } + return string `${year}-${month}-${day}T${hour}:${minute}:${second}${timeZone}`; +} + +function getThumbnailKey(string org, string doctorId) returns string { + return org + "-" + doctorId; +} + +function sendEmail(Booking booking, Doctor doctor) returns error? { + + http:Client httpClient = check new (emailService); + + string emailSubject = "[Pet Care App][Booking Confirmation] Your booking is confirmed."; + string emailAddress = booking.emailAddress; + + Property[] properties = [ + addProperty("currentDate", getCurrentDate()), + addProperty("emailAddress", emailAddress), + addProperty("bookingId", booking.referenceNumber), + addProperty("appointmentDate", booking.date), + addProperty("appointmentTimeSlot", booking.sessionStartTime + " - " + booking.sessionEndTime), + addProperty("appointmentNo", booking.appointmentNumber.toString()), + addProperty("appointmentFee", "$30"), + addProperty("petName", booking.petName), + addProperty("petType", booking.petType), + addProperty("petDoB", booking.petDoB), + addProperty("doctorName", doctor.name), + addProperty("doctorSpecialty", doctor.specialty), + addProperty("hospitalName", "Hospital Name"), + addProperty("hospitalAddress", "Hospital Address"), + addProperty("hospitalTelephone", "Hospital Telephone") + ]; + + EmailContent emailContent = { + emailType: BOOKING_CONFIRMED, + receipient: emailAddress, + emailSubject: emailSubject, + properties: properties + }; + + http:Request request = new; + request.setJsonPayload(emailContent); + http:Response response = check httpClient->/messages.post(request); + + if (response.statusCode == 200) { + return; + } + else { + return error("Error while sending email, " + response.reasonPhrase); + } +} + +function addProperty(string name, string value) returns Property { + Property prop = {name: name, value: value}; + return prop; +} + +function getCurrentDate() returns string { + time:Utc currentUtc = time:utcNow(); + time:Civil currentTime = time:utcToCivil(currentUtc); + + string year; + string month; + string day; + [year, month, day] = getDateFromCivilTime(currentTime); + + int|error currentMonth = int:fromString(month); + if (currentMonth is error) { + log:printError("Error while converting month to int: " + currentMonth.toString()); + return ""; + } + return getMonthName(currentMonth) + " " + day + ", " + year; +} + +function getDateFromCivilTime(time:Civil time) returns [string, string, string] { + + string year = time.year.toString(); + string month = time.month < 10 ? string `0${time.month}` : time.month.toString(); + string day = time.day < 10 ? string `0${time.day}` : time.day.toString(); + return [year, month, day]; +} + +function getMonthName(int index) returns string { + match index { + 1 => { + return "January"; + } + 2 => { + return "February"; + } + 3 => { + return "March"; + } + 4 => { + return "April"; + } + 5 => { + return "May"; + } + 6 => { + return "June"; + } + 7 => { + return "July"; + } + 8 => { + return "August"; + } + 9 => { + return "September"; + } + 10 => { + return "October"; + } + 11 => { + return "November"; + } + 12 => { + return "December"; + } + _ => { + return ""; + } + } +} + +function getReferenceNumber() returns string { + + time:Utc currentUtc = time:utcNow(); + time:Civil currentTime = time:utcToCivil(currentUtc); + + string year; + string month; + string day; + [year, month, day] = getDateFromCivilTime(currentTime); + int|random:Error randomInteger = random:createIntInRange(1000, 10000); + + if (randomInteger is random:Error) { + log:printError("Error while generating random number: " + randomInteger.toString()); + return year + month + day + "xxxxx"; + } + + return year + month + day + randomInteger.toString(); +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/resources/.keep b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/resources/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/service.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/service.bal new file mode 100644 index 000000000..96f3bb666 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/service.bal @@ -0,0 +1,382 @@ +import ballerina/http; +import ballerina/mime; +import ballerina/log; + +UserInfoResolver userInfoResolver = new; + +# A service representing a network-accessible API +# bound to port `9091`. +@http:ServiceConfig { + cors: { + allowOrigins: ["*"] + } +} +service / on new http:Listener(9091) { + + # Get all doctors + # + return - List of doctors or error + resource function get doctors(http:Headers headers) returns Doctor[]|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + return getDoctors(userInfo.organization); + } + + # Create a new doctor + # + newDoctor - basic doctor details + # + return - created doctor record or error + resource function post doctors(http:Headers headers, @http:Payload DoctorItem newDoctor) returns Doctor|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Doctor|error doctor = addDoctor(newDoctor, userInfo.organization); + return doctor; + } + + # Get a doctor by ID + # + doctorId - ID of the doctor + # + return - Doctor details or not found + resource function get doctors/[string doctorId](http:Headers headers) returns Doctor|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Doctor|()|error result = getDoctorByIdAndOrg(userInfo.organization, doctorId); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Update a doctor + # + doctorId - ID of the doctor + # + updatedDoctorItem - updated doctor details + # + return - Doctor details or not found + resource function put doctors/[string doctorId](http:Headers headers, @http:Payload DoctorItem updatedDoctorItem) returns Doctor|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Doctor|()|error result = updateDoctorById(userInfo.organization, doctorId, updatedDoctorItem); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Delete a doctor + # + doctorId - ID of the doctor + # + return - Ok response or error + resource function delete doctors/[string doctorId](http:Headers headers) returns http:NoContent|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string|()|error result = deleteDoctorById(userInfo.organization, doctorId); + if result is () { + return http:NOT_FOUND; + } else if result is error { + return result; + } + return http:NO_CONTENT; + } + + # Update the thumbnail image of a doctor + # + doctorId - ID of the doctor + # + return - Ok response or error + resource function put doctors/[string doctorId]/thumbnail(http:Request request, http:Headers headers) + returns http:Ok|http:NotFound|http:BadRequest|error { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + var bodyParts = check request.getBodyParts(); + Thumbnail thumbnail; + if bodyParts.length() == 0 { + thumbnail = {fileName: "", content: ""}; + } else { + Thumbnail|error? handleContentResult = handleContent(bodyParts[0]); + if handleContentResult is error { + return http:BAD_REQUEST; + } + thumbnail = handleContentResult; + } + + string|()|error thumbnailByDoctorId = updateThumbnailByDoctorId(userInfo.organization, doctorId, thumbnail); + + if thumbnailByDoctorId is error { + return thumbnailByDoctorId; + } else if thumbnailByDoctorId is () { + return http:NOT_FOUND; + } + + return http:OK; + } + + # Get the thumbnail image of a doctor + # + doctorId - ID of the doctor + # + return - Return the thumbnail image or not found + resource function get doctors/[string doctorId]/thumbnail(http:Headers headers) returns http:Response|http:NotFound|error { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Thumbnail|()|string|error thumbnail = getThumbnailByDoctorId(userInfo.organization, doctorId); + http:Response response = new; + + if thumbnail is () { + return http:NOT_FOUND; + } else if thumbnail is error { + return thumbnail; + } else if thumbnail is string { + return response; + } else { + + string fileName = thumbnail.fileName; + byte[] encodedContent = thumbnail.content.toBytes(); + byte[] base64Decoded = (check mime:base64Decode(encodedContent)); + + response.setHeader("Content-Type", "application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=" + fileName); + response.setBinaryPayload(base64Decoded); + } + + return response; + } + + # Get all bookings of a doctor + # + doctorId - ID of the doctor + # + date - Date of the boookings (Format: yyyy-MM-dd) + # + return - List of bookings or error + resource function get doctors/[string doctorId]/bookings(http:Headers headers, string? date) returns Booking[]|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string dateValue = ""; + if date != null { + dateValue = date; + } + return getBookingsByDoctorId(userInfo.organization, doctorId, dateValue); + } + + # Get next appointment number of a doctor + # + doctorId - ID of the doctor + # + date - Date of the boookings (Format: yyyy-MM-dd) + # + sessionStartTime - Start time of the session (Format: HH:mm AM/PM) + # + sessionEndTime - End time of the session (Format: HH:mm AM/PM) + # + return - List of bookings or error + resource function get doctors/[string doctorId]/next\-appointment\-number(http:Headers headers, string date, + string sessionStartTime, string sessionEndTime) returns NextAppointment|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + NextAppointment|()|error nextAppointmentNumber = getNextAppointmentNumber(userInfo.organization, doctorId, date, + sessionStartTime, sessionEndTime); + if nextAppointmentNumber is () { + return http:NOT_FOUND; + } else { + return nextAppointmentNumber; + } + } + + # Get doctor's details + # + return - Doctor details or not found + resource function get me(http:Headers headers) returns Doctor|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string email = userInfo.emailAddress; + + Doctor|()|error result = getDoctorByOrgAndEmail(org, email); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Get all bookings + # + return - List of bookings or error + resource function get bookings(http:Headers headers) returns Booking[]|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string email = userInfo.emailAddress; + + return getBookingsByOrgAndEmail(org, email); + } + + # Create a new booking + # + newBooking - basic booking details + # + return - created booking record or error + resource function post bookings(http:Headers headers, @http:Payload BookingItem newBooking) returns Booking|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string email = userInfo.emailAddress; + + Booking|error booking = addBooking(newBooking, org, email); + if booking is error { + return booking; + } + + Doctor|()|error doctor = getDoctorByIdAndOrg(org, newBooking.doctorId); + if doctor is Doctor { + error? sendEmailResult = sendEmail(booking, doctor); + if sendEmailResult is error { + log:printError("Error while sending email for the booking: ", sendEmailResult); + } + } else { + log:printError("Error while getting doctor details: ", doctor); + } + + return booking; + } + + # Get a booking by ID + # + bookingId - ID of the booking + # + return - Booking details or not found + resource function get bookings/[string bookingId](http:Headers headers) returns Booking|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Booking|()|error result = getBookingByIdAndOrg(userInfo.organization, bookingId); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Update a booking + # + bookingId - ID of the booking + # + updatedBookingItem - updated booking details + # + return - Booking details or not found + resource function put bookings/[string bookingId](http:Headers headers, @http:Payload BookingItemUpdated updatedBookingItem) + returns Booking|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Booking|()|error result = updateBookingById(userInfo.organization, bookingId, updatedBookingItem); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Delete a booking + # + bookingId - ID of the booking + # + return - Ok response or error + resource function delete bookings/[string bookingId](http:Headers headers) returns http:NoContent|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string|()|error result = deleteBookingById(userInfo.organization, bookingId); + if result is () { + return http:NOT_FOUND; + } else if result is error { + return result; + } + return http:NO_CONTENT; + } + + # Get information about the organization + # + return - Organization information or error + resource function get org\-info(http:Headers headers) returns OrgInfo|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + OrgInfo|()|error orgInfo = getOrgInfo(userInfo.organization); + if orgInfo is OrgInfo { + return orgInfo; + } else if orgInfo is () { + return http:NOT_FOUND; + } else { + return orgInfo; + } + } + + # Update organization information + # + updatedOrgInfo - updated organization details + # + return - Organization information or error + resource function put org\-info(http:Headers headers, @http:Payload OrgInfoItem updatedOrgInfo) returns OrgInfo|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + return updateOrgInfo(userInfo.organization, updatedOrgInfo); + } +} + +function handleContent(mime:Entity bodyPart) returns Thumbnail|error? { + + var mediaType = mime:getMediaType(bodyPart.getContentType()); + mime:ContentDisposition contentDisposition = bodyPart.getContentDisposition(); + string fileName = contentDisposition.fileName; + + if mediaType is mime:MediaType { + + string baseType = mediaType.getBaseType(); + if mime:IMAGE_JPEG == baseType || mime:IMAGE_GIF == baseType || mime:IMAGE_PNG == baseType { + + byte[] bytes = check bodyPart.getByteArray(); + byte[] base64Encoded = (check mime:base64Encode(bytes)); + string base64EncodedString = check string:fromBytes(base64Encoded); + + Thumbnail thumbnail = { + fileName: fileName, + content: base64EncodedString + }; + + return thumbnail; + } + } + + return error("Unsupported media type found"); +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/service_openapi.yaml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/service_openapi.yaml new file mode 100644 index 000000000..36a08a709 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/service_openapi.yaml @@ -0,0 +1,648 @@ +openapi: 3.0.1 +info: + title: Service Openapi Yaml + version: 1.0.0 +servers: +- url: "{server}:{port}/" + variables: + server: + default: http://localhost + port: + default: "9091" +paths: + /doctors: + get: + summary: Get all doctors + operationId: getDoctors + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Doctor' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + post: + summary: Create a new doctor + operationId: postDoctors + requestBody: + description: basic doctor details + content: + application/json: + schema: + $ref: '#/components/schemas/DoctorItem' + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}: + get: + summary: Get a doctor by ID + operationId: getDoctorsDoctorid + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update a doctor + operationId: putDoctorsDoctorid + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + requestBody: + description: updated doctor details + content: + application/json: + schema: + $ref: '#/components/schemas/DoctorItem' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + delete: + summary: Delete a doctor + operationId: deleteDoctorsDoctorid + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + responses: + "204": + description: NoContent + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}/thumbnail: + get: + summary: Get the thumbnail image of a doctor + operationId: getDoctorsDoctoridThumbnail + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + responses: + default: + description: Any Response + content: + '*/*': + schema: + description: Any type of entity body + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update the thumbnail image of a doctor + operationId: putDoctorsDoctoridThumbnail + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + requestBody: + content: + '*/*': + schema: + description: Any type of entity body + responses: + "200": + description: Ok + "404": + description: NotFound + "400": + description: BadRequest + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}/bookings: + get: + summary: Get all bookings of a doctor + operationId: getDoctorsDoctoridBookings + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + - name: date + in: query + description: "Date of the boookings (Format: yyyy-MM-dd)" + schema: + type: string + nullable: true + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Booking' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}/next-appointment-number: + get: + summary: Get next appointment number of a doctor + operationId: getDoctorsDoctoridNextAppointmentNumber + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + - name: date + in: query + description: "Date of the boookings (Format: yyyy-MM-dd)" + required: true + schema: + type: string + - name: sessionStartTime + in: query + description: "Start time of the session (Format: HH:mm AM/PM)" + required: true + schema: + type: string + - name: sessionEndTime + in: query + description: "End time of the session (Format: HH:mm AM/PM)" + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/NextAppointment' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /me: + get: + summary: Get doctor's details + operationId: getMe + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /bookings: + get: + summary: Get all bookings + operationId: getBookings + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Booking' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + post: + summary: Create a new booking + operationId: postBookings + requestBody: + description: basic booking details + content: + application/json: + schema: + $ref: '#/components/schemas/BookingItem' + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /bookings/{bookingId}: + get: + summary: Get a booking by ID + operationId: getBookingsBookingid + parameters: + - name: bookingId + in: path + description: ID of the booking + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update a booking + operationId: putBookingsBookingid + parameters: + - name: bookingId + in: path + description: ID of the booking + required: true + schema: + type: string + requestBody: + description: updated booking details + content: + application/json: + schema: + $ref: '#/components/schemas/BookingItemUpdated' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + delete: + summary: Delete a booking + operationId: deleteBookingsBookingid + parameters: + - name: bookingId + in: path + description: ID of the booking + required: true + schema: + type: string + responses: + "204": + description: NoContent + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /org-info: + get: + summary: Get information about the organization + operationId: getOrgInfo + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/OrgInfo' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update organization information + operationId: putOrgInfo + requestBody: + description: updated organization details + content: + application/json: + schema: + $ref: '#/components/schemas/OrgInfoItem' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/OrgInfo' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string +components: + schemas: + Availability: + required: + - date + - timeSlots + type: object + properties: + date: + type: string + timeSlots: + type: array + items: + $ref: '#/components/schemas/TimeSlot' + OrgInfo: + allOf: + - $ref: '#/components/schemas/OrgInfoItem' + - required: + - orgName + type: object + properties: + orgName: + type: string + AppointmentItem: + required: + - date + - sessionEndTime + - sessionStartTime + type: object + properties: + date: + type: string + sessionStartTime: + type: string + sessionEndTime: + type: string + BookingItem: + required: + - date + - doctorId + - petDoB + - petId + - petName + - petOwnerName + - petType + - sessionEndTime + - sessionStartTime + type: object + properties: + petOwnerName: + type: string + mobileNumber: + type: string + doctorId: + type: string + petId: + type: string + petName: + type: string + petType: + type: string + petDoB: + type: string + date: + type: string + sessionStartTime: + type: string + sessionEndTime: + type: string + OrgInfoItem: + required: + - address + - name + - telephoneNumber + type: object + properties: + name: + type: string + address: + type: string + telephoneNumber: + type: string + registrationNumber: + type: string + DoctorItem: + required: + - availability + - emailAddress + - gender + - name + - registrationNumber + - specialty + type: object + properties: + name: + type: string + gender: + type: string + registrationNumber: + type: string + specialty: + type: string + emailAddress: + type: string + dateOfBirth: + type: string + address: + type: string + availability: + type: array + items: + $ref: '#/components/schemas/Availability' + Booking: + allOf: + - $ref: '#/components/schemas/BookingItem' + - required: + - appointmentNumber + - createdAt + - emailAddress + - id + - org + - referenceNumber + - status + type: object + properties: + appointmentNumber: + type: integer + format: int64 + status: + oneOf: + - {} + - {} + - type: string + id: + type: string + org: + type: string + referenceNumber: + type: string + emailAddress: + type: string + createdAt: + type: string + Doctor: + allOf: + - $ref: '#/components/schemas/DoctorItem' + - required: + - createdAt + - id + - org + type: object + properties: + id: + type: string + org: + type: string + createdAt: + type: string + TimeSlot: + required: + - availableBookingCount + - endTime + - startTime + type: object + properties: + startTime: + type: string + endTime: + type: string + availableBookingCount: + type: integer + format: int64 + BookingItemUpdated: + allOf: + - $ref: '#/components/schemas/BookingItem' + - required: + - status + type: object + properties: + status: + oneOf: + - {} + - {} + - type: string + NextAppointment: + required: + - activeBookingCount + - date + - doctorId + - nextAppointmentNumber + - sessionEndTime + - sessionStartTime + type: object + properties: + doctorId: + type: string + date: + type: string + sessionStartTime: + type: string + sessionEndTime: + type: string + activeBookingCount: + type: integer + format: int64 + nextAppointmentNumber: + type: integer + format: int64 diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/types.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/types.bal new file mode 100644 index 000000000..c0b40f50d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/types.bal @@ -0,0 +1,133 @@ +type DoctorItem record {| + string name; + string gender; + string registrationNumber; + string specialty; + string emailAddress; + string dateOfBirth?; + string address?; + Availability[] availability; +|}; + +type Doctor record {| + *DoctorItem; + readonly string id; + readonly string org; + readonly string createdAt; +|}; + +type DoctorAvailabilityRecord record {| + string name; + string gender; + string registrationNumber; + string specialty; + string emailAddress; + string dateOfBirth?; + string address?; + string id; + string org; + string createdAt; + string date; + string startTime; + string endTime; + int availableBookingCount; +|}; + +type Thumbnail record {| + string fileName; + string content; +|}; + +type Availability record {| + string date; + TimeSlot[] timeSlots; +|}; + +type TimeSlot record {| + string startTime; + string endTime; + int availableBookingCount; +|}; + +type BookingItem record {| + string petOwnerName; + string mobileNumber?; + string doctorId; + string petId; + string petName; + string petType; + string petDoB; + *AppointmentItem; +|}; + +type BookingItemUpdated record {| + *BookingItem; + BookingStatus|string status; +|}; + +enum Status { + CONFIRMED = "Confirmed", + COMPLETED = "Completed" +} + +type BookingStatus CONFIRMED|COMPLETED; + +type Appointment record {| + *AppointmentItem; + int appointmentNumber; + BookingStatus|string status; +|}; + +type AppointmentItem record {| + string date; + string sessionStartTime; + string sessionEndTime; +|}; + +type NextAppointment record {| + string doctorId; + string date; + string sessionStartTime; + string sessionEndTime; + int activeBookingCount; + int nextAppointmentNumber; +|}; + +type Booking record {| + *BookingItem; + int appointmentNumber; + BookingStatus|string status; + readonly string id; + readonly string org; + readonly string referenceNumber; + readonly string emailAddress; + readonly string createdAt; +|}; + +type EmailContent record {| + EmailType emailType; + Property[] properties; + string receipient; + string emailSubject; +|}; + +type Property record {| + string name; + string value; +|}; + +enum EmailType { + BOOKING_CONFIRMED = "Booking Confirmed" +} + +type OrgInfo record {| + *OrgInfoItem; + readonly string orgName; +|}; + +type OrgInfoItem record {| + string name; + string address?; + string telephoneNumber?; + string registrationNumber?; +|}; diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/user_info_resolver.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/user_info_resolver.bal new file mode 100644 index 000000000..0b2964cf6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/channel-service/user_info_resolver.bal @@ -0,0 +1,91 @@ +import ballerina/http; +import ballerina/jwt; + +public type UserInfo record {| + string organization; + string userId; + string emailAddress?; + string[] groups?; +|}; + +public isolated class UserInfoResolver { + + # Returns the user information. + # + # + headers - headers in the request + # + return - UserInfo record or error + public isolated function retrieveUserInfo(http:Headers headers) returns UserInfo|error { + + var jwtHeader = headers.getHeader("x-jwt-assertion"); + + if jwtHeader is http:HeaderNotFoundError { + var authHeader = headers.getHeader("Authorization"); + if authHeader is http:HeaderNotFoundError { + return authHeader; + } else { + if (authHeader.startsWith("Bearer ")) { + jwtHeader = authHeader.substring(7); + } + } + } + + if (jwtHeader is http:HeaderNotFoundError) { + return jwtHeader; + } + + [jwt:Header, jwt:Payload] [_, payload] = check jwt:decode(jwtHeader); + string org = self.getOrgFromPayload(payload); + string user = self.getUserFromPayload(payload); + string email = self.getEmail(payload); + string[] groups = self.getGroups(payload); + + UserInfo userInfo = { + organization: org, + userId: user, + emailAddress: email, + groups: groups + }; + + return userInfo; + } + + private isolated function getUserFromPayload(jwt:Payload payload) returns string { + + string? subClaim = payload.sub; + if subClaim is () { + subClaim = "Test_Key_User"; + } + + return subClaim; + } + + private isolated function getOrgFromPayload(jwt:Payload payload) returns string { + + string? user_org = payload["user_org"].toString(); + if user_org is "" { + user_org = "Test_Key_Org"; + } + + return user_org; + } + + private isolated function getEmail(jwt:Payload payload) returns string { + return payload["email"].toString(); + } + + private isolated function getGroups(jwt:Payload payload) returns string[] { + + if payload["groups"] is () { + return []; + } + + json[] groups = payload["groups"]; + string[] groupList = []; + foreach json item in groups { + groupList.push(item); + } + + return groupList; + } + +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/.choreo/endpoints.yaml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/.choreo/endpoints.yaml new file mode 100644 index 000000000..9677a45d3 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/.choreo/endpoints.yaml @@ -0,0 +1,23 @@ +# +required Version of the endpoint configuration YAML +version: 0.1 + +# +required List of endpoints to create +endpoints: + # +required Unique name for the endpoint. (This name will be used when generating the managed API) +- name: Personalization Service + # +required Numeric port value that gets exposed via this endpoint + port: 9093 + # +required Type of the traffic this endpoint is accepting. Example: REST, GraphQL, etc. + # Allowed values: REST, GraphQL, GRPC + type: REST + # +optional Network level visibility of this endpoint. Defaults to Project + # Accepted values: Project|Organization|Public. + networkVisibility: Public + # +optional Context (base path) of the API that is exposed via this endpoint. + # This is mandatory if the endpoint type is set to REST or GraphQL. + context: / + # +optional Path to the schema definition file. Defaults to wild card route if not provided + # This is only applicable to REST endpoint types. + # The path should be relative to the docker context. + schemaFilePath: service_openapi.yaml + \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/.devcontainer.json b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/.devcontainer.json new file mode 100644 index 000000000..a78c901fb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/.devcontainer.json @@ -0,0 +1,4 @@ +{ + "image": "ballerina/ballerina-devcontainer:2201.4.0", + "extensions": ["WSO2.ballerina"], +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Ballerina.toml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Ballerina.toml new file mode 100644 index 000000000..59ef9d289 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Ballerina.toml @@ -0,0 +1,14 @@ +[package] +org = "WSO2" +name = "personalization_service" +version = "1.0.0" +export = ["personalization_service"] +distribution = "2201.5.0" + +[build-options] +observabilityIncluded = true + +[[dependency]] +org = "pubudu538" +name = "choreo.user.info" +version = "0.1.1" diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Dependencies.toml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Dependencies.toml new file mode 100644 index 000000000..4f5a2b9ab --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Dependencies.toml @@ -0,0 +1,370 @@ +# AUTO-GENERATED FILE. DO NOT MODIFY. + +# This file is auto-generated by Ballerina for managing dependency versions. +# It should not be modified by hand. + +[ballerina] +dependencies-toml-version = "2" + +[[package]] +org = "WSO2" +name = "personalization_service" +version = "1.0.0" +dependencies = [ + {org = "ballerina", name = "http"}, + {org = "ballerina", name = "jwt"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "os"}, + {org = "ballerina", name = "sql"}, + {org = "ballerinai", name = "observe"}, + {org = "ballerinax", name = "java.jdbc"}, + {org = "ballerinax", name = "mysql"}, + {org = "ballerinax", name = "mysql.driver"} +] +modules = [ + {org = "WSO2", packageName = "personalization_service", moduleName = "personalization_service"} +] + +[[package]] +org = "ballerina" +name = "auth" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.array"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "regex"} +] + +[[package]] +org = "ballerina" +name = "cache" +version = "3.3.0" +dependencies = [ + {org = "ballerina", name = "constraint"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "constraint" +version = "1.0.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "crypto" +version = "2.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "file" +version = "1.5.0" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "os"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "http" +version = "2.5.4" +dependencies = [ + {org = "ballerina", name = "auth"}, + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "constraint"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "file"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "jwt"}, + {org = "ballerina", name = "lang.array"}, + {org = "ballerina", name = "lang.decimal"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "lang.runtime"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "mime"}, + {org = "ballerina", name = "oauth2"}, + {org = "ballerina", name = "observe"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "url"} +] +modules = [ + {org = "ballerina", packageName = "http", moduleName = "http"} +] + +[[package]] +org = "ballerina" +name = "io" +version = "1.3.1" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.value"} +] + +[[package]] +org = "ballerina" +name = "jballerina.java" +version = "0.0.0" + +[[package]] +org = "ballerina" +name = "jwt" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "jwt", moduleName = "jwt"} +] + +[[package]] +org = "ballerina" +name = "lang.__internal" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"} +] + +[[package]] +org = "ballerina" +name = "lang.array" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.__internal"} +] + +[[package]] +org = "ballerina" +name = "lang.decimal" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.int" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.object" +version = "0.0.0" + +[[package]] +org = "ballerina" +name = "lang.regexp" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.runtime" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.string" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.regexp"} +] + +[[package]] +org = "ballerina" +name = "lang.value" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "log" +version = "2.5.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "observe"} +] +modules = [ + {org = "ballerina", packageName = "log", moduleName = "log"} +] + +[[package]] +org = "ballerina" +name = "mime" +version = "2.5.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"} +] + +[[package]] +org = "ballerina" +name = "oauth2" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "observe" +version = "1.0.6" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "os" +version = "1.5.0" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"} +] +modules = [ + {org = "ballerina", packageName = "os", moduleName = "os"} +] + +[[package]] +org = "ballerina" +name = "regex" +version = "1.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.string"} +] + +[[package]] +org = "ballerina" +name = "sql" +version = "1.6.3" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "sql", moduleName = "sql"} +] + +[[package]] +org = "ballerina" +name = "task" +version = "2.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "time" +version = "2.2.5" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "url" +version = "2.2.4" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerinai" +name = "observe" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "observe"} +] +modules = [ + {org = "ballerinai", packageName = "observe", moduleName = "observe"} +] + +[[package]] +org = "ballerinax" +name = "java.jdbc" +version = "1.6.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerinax", packageName = "java.jdbc", moduleName = "java.jdbc"} +] + +[[package]] +org = "ballerinax" +name = "mysql" +version = "1.6.2" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerinax", packageName = "mysql", moduleName = "mysql"} +] + +[[package]] +org = "ballerinax" +name = "mysql.driver" +version = "1.4.1" +modules = [ + {org = "ballerinax", packageName = "mysql.driver", moduleName = "mysql.driver"} +] + + diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Module.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Module.md new file mode 100644 index 000000000..83cc6eb03 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Module.md @@ -0,0 +1,6 @@ +A simple HTTP Service implementation. +[//]: # (above is the module summary) + +# Module Overview +Provides an overview about the module when generating the API documentations. +For example, refer to https://lib.ballerina.io/ballerina/io/latest diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Package.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Package.md new file mode 100644 index 000000000..46d028dbc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/Package.md @@ -0,0 +1,5 @@ +A simple HTTP Service implementation. +[//]: # (above is the package summary) + +# Package Overview +A simple HTTP Service implementation. diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/README.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/README.md new file mode 100644 index 000000000..e642d60d5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/README.md @@ -0,0 +1,13 @@ +# Channel Service + +## Prerequisites: + +- [Ballerina](https://ballerina.io/) + - Tested version: **Ballerina 2201.3.4 (Swan Lake Update 3)** + +### Run Ballerina Service Locally + +- Execute the following command in the terminal. + ``` + bal run + ``` \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/config.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/config.bal new file mode 100644 index 000000000..dca83bdb4 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/config.bal @@ -0,0 +1,9 @@ +import ballerina/os; + +public string issuer = check getValueFromEnvVariables("ISSUER", "https://localhost:9443/t/carbon.super/oauth2/token"); +public string jwksUrl = check getValueFromEnvVariables("JWKS_URL", "https://localhost:9443/t/carbon.super/oauth2/jwks"); + +function getValueFromEnvVariables(string variable, string defaultValue) returns string { + string value = os:getEnv(variable); + return value != "" ? value : defaultValue; +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/personalization_mgt_dao.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/personalization_mgt_dao.bal new file mode 100644 index 000000000..f082b1c71 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/personalization_mgt_dao.bal @@ -0,0 +1,76 @@ +import ballerinax/java.jdbc; +import ballerina/sql; +import ballerina/log; +import ballerina/http; + +function dbGetPersonalization(string org) returns Personalization|error|http:NotFound { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `SELECT org, logoUrl, logoAltText, faviconUrl, primaryColor, secondaryColor from Branding + WHERE org = ${org}`; + + Personalization|sql:Error result = dbClient->queryRow(query); + + if result is sql:NoRowsError { + return http:NOT_FOUND; + } else if result is sql:Error { + return handleError(result); + } else { + return result; + } +} + +function dbUpdatePersonalization(Personalization personalization) returns Personalization|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `INSERT INTO Branding (org, logoUrl, logoAltText, faviconUrl, primaryColor, secondaryColor) + VALUES (${personalization.org}, ${personalization.logoUrl}, ${personalization.logoAltText}, ${personalization.faviconUrl}, + ${personalization.primaryColor}, ${personalization.secondaryColor}) + ON DUPLICATE KEY UPDATE logoUrl = VALUES(logoUrl), logoAltText = VALUES(logoAltText), faviconUrl = VALUES(faviconUrl), + primaryColor = VALUES(primaryColor), secondaryColor = VALUES(secondaryColor);`; + _ = check dbClient->execute(query); + + Personalization|http:NotFound|error updatedInfo = dbGetPersonalization(personalization.org); + + if updatedInfo is http:NotFound|error { + return error("Error while updating the org info"); + } + return updatedInfo; + } + on fail error e { + return handleError(e); + } +} + +function dbDeletePersonalization(string orgId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE FROM Branding WHERE org = ${orgId};`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Branding deleted successfully"; +} + +function handleError(error err) returns error { + log:printError("Error while processing the request", err); + return error("Error while processing the request"); +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/personalization_mgt_impl.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/personalization_mgt_impl.bal new file mode 100644 index 000000000..f2d76369c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/personalization_mgt_impl.bal @@ -0,0 +1,97 @@ +import ballerina/http; +import ballerinax/mysql; +import ballerina/sql; +import ballerina/log; +import ballerinax/java.jdbc; +import ballerinax/mysql.driver as _; + +configurable string dbHost = "localhost"; +configurable string dbUsername = "admin"; +configurable string dbPassword = "admin"; +configurable string dbDatabase = "CHANNEL_DB"; +configurable int dbPort = 3306; + +table key(org) personalizationRecords = table []; + +final mysql:Client|error dbClient; +boolean useDB = false; + +function init() returns error? { + + if dbHost != "localhost" && dbHost != "" { + useDB = true; + } + + sql:ConnectionPool connPool = { + maxOpenConnections: 20, + minIdleConnections: 20, + maxConnectionLifeTime: 300 + }; + + mysql:Options mysqlOptions = { + connectTimeout: 10 + }; + + dbClient = new (dbHost, dbUsername, dbPassword, dbDatabase, dbPort, options = mysqlOptions, connectionPool = connPool); + + if dbClient is sql:Error { + if (!useDB) { + log:printInfo("DB configurations are not given. Hence storing the data locally"); + } else { + log:printError("DB configuraitons are not correct. Please check the configuration", 'error = dbClient); + return error("DB configuraitons are not correct. Please check the configuration"); + } + } + + if useDB { + log:printInfo("DB configurations are given. Hence storing the data in DB"); + } + +} + +function getConnection() returns jdbc:Client|error { + return dbClient; +} + +function getPersonalization(string org) returns Personalization|error|http:NotFound { + + if (useDB) { + return dbGetPersonalization(org); + } else { + Personalization? personalization = personalizationRecords[org]; + if personalization is () { + return http:NOT_FOUND; + } + return personalization; + } +} + +function updatePersonalization(string org, Personalization personalization) returns Personalization|error { + + if (useDB) { + return dbUpdatePersonalization(personalization); + } else { + Personalization? oldPersonalizationRecord = personalizationRecords[org]; + if oldPersonalizationRecord !is () { + _ = personalizationRecords.remove(org); + } + personalizationRecords.put({ + ...personalization + }); + return personalization; + } +} + +function deletePersonalization(string org) returns string|()|error { + + if (useDB) { + return dbDeletePersonalization(org); + } else { + Personalization? oldPersonalizationRecord = personalizationRecords[org]; + if oldPersonalizationRecord !is () { + _ = personalizationRecords.remove(org); + } + + return "Branding deleted successfully"; + } +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/resources/.keep b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/resources/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/service.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/service.bal new file mode 100644 index 000000000..89900f49a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/service.bal @@ -0,0 +1,54 @@ +import ballerina/http; + +UserInfoResolver userInfoResolver = new; + +@http:ServiceConfig { + cors: { + allowOrigins: ["*"] + } +} +service / on new http:Listener(9093) { + + resource function get personalization/org/[string orgId](http:Headers headers) returns Personalization|http:NotFound|error? { + + return getPersonalization(orgId); + } + + @http:ResourceConfig { + auth: { + scopes: "create_branding" + } + } + resource function post personalization(http:Headers headers, @http:Payload Personalization newPersonalization) returns Personalization|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + Personalization|error personalization = updatePersonalization(userInfo.organization, newPersonalization); + return personalization; + } + + @http:ResourceConfig { + auth: { + scopes: "delete_branding" + } + } + resource function delete personalization(http:Headers headers) returns http:NoContent|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string|()|error result = deletePersonalization(userInfo.organization); + + if result is () { + return http:NOT_FOUND; + } else if result is error { + return result; + } + return http:NO_CONTENT; + } +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/service_openapi.yaml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/service_openapi.yaml new file mode 100644 index 000000000..544f635c5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/service_openapi.yaml @@ -0,0 +1,648 @@ +openapi: 3.0.1 +info: + title: Service Openapi Yaml + version: 1.0.0 +servers: +- url: "{server}:{port}/" + variables: + server: + default: http://localhost + port: + default: "9093" +paths: + /doctors: + get: + summary: Get branding preferences + operationId: getPersonalization + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Personalization' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + post: + summary: Update branding preferences + operationId: updatePersonalization + requestBody: + description: branding preferences + content: + application/json: + schema: + $ref: '#/components/schemas/Personalization' + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Personalization' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}: + get: + summary: Get a doctor by ID + operationId: getDoctorsDoctorid + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update a doctor + operationId: putDoctorsDoctorid + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + requestBody: + description: updated doctor details + content: + application/json: + schema: + $ref: '#/components/schemas/DoctorItem' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + delete: + summary: Delete a doctor + operationId: deleteDoctorsDoctorid + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + responses: + "204": + description: NoContent + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}/thumbnail: + get: + summary: Get the thumbnail image of a doctor + operationId: getDoctorsDoctoridThumbnail + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + responses: + default: + description: Any Response + content: + '*/*': + schema: + description: Any type of entity body + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update the thumbnail image of a doctor + operationId: putDoctorsDoctoridThumbnail + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + requestBody: + content: + '*/*': + schema: + description: Any type of entity body + responses: + "200": + description: Ok + "404": + description: NotFound + "400": + description: BadRequest + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}/bookings: + get: + summary: Get all bookings of a doctor + operationId: getDoctorsDoctoridBookings + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + - name: date + in: query + description: "Date of the boookings (Format: yyyy-MM-dd)" + schema: + type: string + nullable: true + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Booking' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /doctors/{doctorId}/next-appointment-number: + get: + summary: Get next appointment number of a doctor + operationId: getDoctorsDoctoridNextAppointmentNumber + parameters: + - name: doctorId + in: path + description: ID of the doctor + required: true + schema: + type: string + - name: date + in: query + description: "Date of the boookings (Format: yyyy-MM-dd)" + required: true + schema: + type: string + - name: sessionStartTime + in: query + description: "Start time of the session (Format: HH:mm AM/PM)" + required: true + schema: + type: string + - name: sessionEndTime + in: query + description: "End time of the session (Format: HH:mm AM/PM)" + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/NextAppointment' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /me: + get: + summary: Get doctor's details + operationId: getMe + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Doctor' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /bookings: + get: + summary: Get all bookings + operationId: getBookings + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Booking' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + post: + summary: Create a new booking + operationId: postBookings + requestBody: + description: basic booking details + content: + application/json: + schema: + $ref: '#/components/schemas/BookingItem' + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /bookings/{bookingId}: + get: + summary: Get a booking by ID + operationId: getBookingsBookingid + parameters: + - name: bookingId + in: path + description: ID of the booking + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update a booking + operationId: putBookingsBookingid + parameters: + - name: bookingId + in: path + description: ID of the booking + required: true + schema: + type: string + requestBody: + description: updated booking details + content: + application/json: + schema: + $ref: '#/components/schemas/BookingItemUpdated' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Booking' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + delete: + summary: Delete a booking + operationId: deleteBookingsBookingid + parameters: + - name: bookingId + in: path + description: ID of the booking + required: true + schema: + type: string + responses: + "204": + description: NoContent + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /org-info: + get: + summary: Get information about the organization + operationId: getOrgInfo + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/OrgInfo' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update organization information + operationId: putOrgInfo + requestBody: + description: updated organization details + content: + application/json: + schema: + $ref: '#/components/schemas/OrgInfoItem' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/OrgInfo' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string +components: + schemas: + Availability: + required: + - date + - timeSlots + type: object + properties: + date: + type: string + timeSlots: + type: array + items: + $ref: '#/components/schemas/TimeSlot' + OrgInfo: + allOf: + - $ref: '#/components/schemas/OrgInfoItem' + - required: + - orgName + type: object + properties: + orgName: + type: string + AppointmentItem: + required: + - date + - sessionEndTime + - sessionStartTime + type: object + properties: + date: + type: string + sessionStartTime: + type: string + sessionEndTime: + type: string + BookingItem: + required: + - date + - doctorId + - petDoB + - petId + - petName + - petOwnerName + - petType + - sessionEndTime + - sessionStartTime + type: object + properties: + petOwnerName: + type: string + mobileNumber: + type: string + doctorId: + type: string + petId: + type: string + petName: + type: string + petType: + type: string + petDoB: + type: string + date: + type: string + sessionStartTime: + type: string + sessionEndTime: + type: string + OrgInfoItem: + required: + - address + - name + - telephoneNumber + type: object + properties: + name: + type: string + address: + type: string + telephoneNumber: + type: string + registrationNumber: + type: string + DoctorItem: + required: + - availability + - emailAddress + - gender + - name + - registrationNumber + - specialty + type: object + properties: + name: + type: string + gender: + type: string + registrationNumber: + type: string + specialty: + type: string + emailAddress: + type: string + dateOfBirth: + type: string + address: + type: string + availability: + type: array + items: + $ref: '#/components/schemas/Availability' + Booking: + allOf: + - $ref: '#/components/schemas/BookingItem' + - required: + - appointmentNumber + - createdAt + - emailAddress + - id + - org + - referenceNumber + - status + type: object + properties: + appointmentNumber: + type: integer + format: int64 + status: + oneOf: + - {} + - {} + - type: string + id: + type: string + org: + type: string + referenceNumber: + type: string + emailAddress: + type: string + createdAt: + type: string + Doctor: + allOf: + - $ref: '#/components/schemas/DoctorItem' + - required: + - createdAt + - id + - org + type: object + properties: + id: + type: string + org: + type: string + createdAt: + type: string + TimeSlot: + required: + - availableBookingCount + - endTime + - startTime + type: object + properties: + startTime: + type: string + endTime: + type: string + availableBookingCount: + type: integer + format: int64 + BookingItemUpdated: + allOf: + - $ref: '#/components/schemas/BookingItem' + - required: + - status + type: object + properties: + status: + oneOf: + - {} + - {} + - type: string + NextAppointment: + required: + - activeBookingCount + - date + - doctorId + - nextAppointmentNumber + - sessionEndTime + - sessionStartTime + type: object + properties: + doctorId: + type: string + date: + type: string + sessionStartTime: + type: string + sessionEndTime: + type: string + activeBookingCount: + type: integer + format: int64 + nextAppointmentNumber: + type: integer + format: int64 diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/types.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/types.bal new file mode 100644 index 000000000..8364aec3b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/types.bal @@ -0,0 +1,8 @@ +type Personalization record {| + readonly string org; + string logoUrl; + string logoAltText; + string faviconUrl; + string primaryColor; + string secondaryColor; +|}; diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/user_info_resolver.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/user_info_resolver.bal new file mode 100644 index 000000000..0b2964cf6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/personalization-service/user_info_resolver.bal @@ -0,0 +1,91 @@ +import ballerina/http; +import ballerina/jwt; + +public type UserInfo record {| + string organization; + string userId; + string emailAddress?; + string[] groups?; +|}; + +public isolated class UserInfoResolver { + + # Returns the user information. + # + # + headers - headers in the request + # + return - UserInfo record or error + public isolated function retrieveUserInfo(http:Headers headers) returns UserInfo|error { + + var jwtHeader = headers.getHeader("x-jwt-assertion"); + + if jwtHeader is http:HeaderNotFoundError { + var authHeader = headers.getHeader("Authorization"); + if authHeader is http:HeaderNotFoundError { + return authHeader; + } else { + if (authHeader.startsWith("Bearer ")) { + jwtHeader = authHeader.substring(7); + } + } + } + + if (jwtHeader is http:HeaderNotFoundError) { + return jwtHeader; + } + + [jwt:Header, jwt:Payload] [_, payload] = check jwt:decode(jwtHeader); + string org = self.getOrgFromPayload(payload); + string user = self.getUserFromPayload(payload); + string email = self.getEmail(payload); + string[] groups = self.getGroups(payload); + + UserInfo userInfo = { + organization: org, + userId: user, + emailAddress: email, + groups: groups + }; + + return userInfo; + } + + private isolated function getUserFromPayload(jwt:Payload payload) returns string { + + string? subClaim = payload.sub; + if subClaim is () { + subClaim = "Test_Key_User"; + } + + return subClaim; + } + + private isolated function getOrgFromPayload(jwt:Payload payload) returns string { + + string? user_org = payload["user_org"].toString(); + if user_org is "" { + user_org = "Test_Key_Org"; + } + + return user_org; + } + + private isolated function getEmail(jwt:Payload payload) returns string { + return payload["email"].toString(); + } + + private isolated function getGroups(jwt:Payload payload) returns string[] { + + if payload["groups"] is () { + return []; + } + + json[] groups = payload["groups"]; + string[] groupList = []; + foreach json item in groups { + groupList.push(item); + } + + return groupList; + } + +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/.choreo/endpoints.yaml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/.choreo/endpoints.yaml new file mode 100644 index 000000000..e2effdec5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/.choreo/endpoints.yaml @@ -0,0 +1,22 @@ +# +required Version of the endpoint configuration YAML +version: 0.1 + +# +required List of endpoints to create +endpoints: + # +required Unique name for the endpoint. (This name will be used when generating the managed API) +- name: Pet Management Service + # +required Numeric port value that gets exposed via this endpoint + port: 9092 + # +required Type of the traffic this endpoint is accepting. Example: REST, GraphQL, etc. + # Allowed values: REST, GraphQL, GRPC + type: REST + # +optional Network level visibility of this endpoint. Defaults to Project + # Accepted values: Project|Organization|Public. + networkVisibility: Public + # +optional Context (base path) of the API that is exposed via this endpoint. + # This is mandatory if the endpoint type is set to REST or GraphQL. + context: / + # +optional Path to the schema definition file. Defaults to wild card route if not provided + # This is only applicable to REST endpoint types. + # The path should be relative to the docker context. + schemaFilePath: service_openapi.yaml diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/.devcontainer.json b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/.devcontainer.json new file mode 100644 index 000000000..a78c901fb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/.devcontainer.json @@ -0,0 +1,4 @@ +{ + "image": "ballerina/ballerina-devcontainer:2201.4.0", + "extensions": ["WSO2.ballerina"], +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Ballerina.toml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Ballerina.toml new file mode 100644 index 000000000..7c00104f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Ballerina.toml @@ -0,0 +1,14 @@ +[package] +org = "WSO2" +name = "pet_management_service" +version = "1.0.0" +export = ["pet_management_service"] +distribution = "2201.5.0" + +[build-options] +observabilityIncluded = true + +[[dependency]] +org = "pubudu538" +name = "choreo.user.info" +version = "0.1.1" diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Dependencies.toml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Dependencies.toml new file mode 100644 index 000000000..d0e6f4b04 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Dependencies.toml @@ -0,0 +1,424 @@ +# AUTO-GENERATED FILE. DO NOT MODIFY. + +# This file is auto-generated by Ballerina for managing dependency versions. +# It should not be modified by hand. + +[ballerina] +dependencies-toml-version = "2" + +[[package]] +org = "WSO2" +name = "pet_management_service" +version = "1.0.0" +dependencies = [ + {org = "ballerina", name = "http"}, + {org = "ballerina", name = "jwt"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "mime"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "uuid"}, + {org = "ballerinai", name = "observe"}, + {org = "ballerinai", name = "transaction"}, + {org = "ballerinax", name = "java.jdbc"}, + {org = "ballerinax", name = "mysql"}, + {org = "ballerinax", name = "mysql.driver"} +] +modules = [ + {org = "WSO2", packageName = "pet_management_service", moduleName = "pet_management_service"} +] + +[[package]] +org = "ballerina" +name = "auth" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.array"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "regex"} +] + +[[package]] +org = "ballerina" +name = "cache" +version = "3.3.0" +dependencies = [ + {org = "ballerina", name = "constraint"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "constraint" +version = "1.0.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "crypto" +version = "2.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "file" +version = "1.5.0" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "os"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "http" +version = "2.5.4" +dependencies = [ + {org = "ballerina", name = "auth"}, + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "constraint"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "file"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "jwt"}, + {org = "ballerina", name = "lang.array"}, + {org = "ballerina", name = "lang.decimal"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "lang.runtime"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "mime"}, + {org = "ballerina", name = "oauth2"}, + {org = "ballerina", name = "observe"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "url"} +] +modules = [ + {org = "ballerina", packageName = "http", moduleName = "http"} +] + +[[package]] +org = "ballerina" +name = "io" +version = "1.3.1" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.value"} +] + +[[package]] +org = "ballerina" +name = "jballerina.java" +version = "0.0.0" + +[[package]] +org = "ballerina" +name = "jwt" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "lang.string"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "jwt", moduleName = "jwt"} +] + +[[package]] +org = "ballerina" +name = "lang.__internal" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"} +] + +[[package]] +org = "ballerina" +name = "lang.array" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.__internal"} +] + +[[package]] +org = "ballerina" +name = "lang.decimal" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.int" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.object" +version = "0.0.0" + +[[package]] +org = "ballerina" +name = "lang.regexp" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.runtime" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.string" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.regexp"} +] + +[[package]] +org = "ballerina" +name = "lang.transaction" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "lang.value" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "log" +version = "2.5.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "observe"} +] +modules = [ + {org = "ballerina", packageName = "log", moduleName = "log"} +] + +[[package]] +org = "ballerina" +name = "mime" +version = "2.5.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"} +] +modules = [ + {org = "ballerina", packageName = "mime", moduleName = "mime"} +] + +[[package]] +org = "ballerina" +name = "oauth2" +version = "2.5.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "time"} +] + +[[package]] +org = "ballerina" +name = "observe" +version = "1.0.6" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "os" +version = "1.5.0" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "regex" +version = "1.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.string"} +] + +[[package]] +org = "ballerina" +name = "sql" +version = "1.6.3" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "sql", moduleName = "sql"} +] + +[[package]] +org = "ballerina" +name = "task" +version = "2.3.2" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "task", moduleName = "task"} +] + +[[package]] +org = "ballerina" +name = "time" +version = "2.2.5" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] +modules = [ + {org = "ballerina", packageName = "time", moduleName = "time"} +] + +[[package]] +org = "ballerina" +name = "url" +version = "2.2.4" +dependencies = [ + {org = "ballerina", name = "jballerina.java"} +] + +[[package]] +org = "ballerina" +name = "uuid" +version = "1.4.0" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.int"}, + {org = "ballerina", name = "regex"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerina", packageName = "uuid", moduleName = "uuid"} +] + +[[package]] +org = "ballerinai" +name = "observe" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "observe"} +] +modules = [ + {org = "ballerinai", packageName = "observe", moduleName = "observe"} +] + +[[package]] +org = "ballerinai" +name = "transaction" +version = "0.0.0" +dependencies = [ + {org = "ballerina", name = "cache"}, + {org = "ballerina", name = "http"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.runtime"}, + {org = "ballerina", name = "lang.transaction"}, + {org = "ballerina", name = "lang.value"}, + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"}, + {org = "ballerina", name = "uuid"} +] +modules = [ + {org = "ballerinai", packageName = "transaction", moduleName = "transaction"} +] + +[[package]] +org = "ballerinax" +name = "java.jdbc" +version = "1.6.1" +dependencies = [ + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerinax", packageName = "java.jdbc", moduleName = "java.jdbc"} +] + +[[package]] +org = "ballerinax" +name = "mysql" +version = "1.6.2" +dependencies = [ + {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "io"}, + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "sql"}, + {org = "ballerina", name = "time"} +] +modules = [ + {org = "ballerinax", packageName = "mysql", moduleName = "mysql"} +] + +[[package]] +org = "ballerinax" +name = "mysql.driver" +version = "1.4.1" +modules = [ + {org = "ballerinax", packageName = "mysql.driver", moduleName = "mysql.driver"} +] + + diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Module.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Module.md new file mode 100644 index 000000000..83cc6eb03 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Module.md @@ -0,0 +1,6 @@ +A simple HTTP Service implementation. +[//]: # (above is the module summary) + +# Module Overview +Provides an overview about the module when generating the API documentations. +For example, refer to https://lib.ballerina.io/ballerina/io/latest diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Package.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Package.md new file mode 100644 index 000000000..46d028dbc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/Package.md @@ -0,0 +1,5 @@ +A simple HTTP Service implementation. +[//]: # (above is the package summary) + +# Package Overview +A simple HTTP Service implementation. diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/README.md b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/README.md new file mode 100644 index 000000000..52decaaf6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/README.md @@ -0,0 +1,13 @@ +# Pet Management Service + +## Prerequisites: + +- [Ballerina](https://ballerina.io/) + - Tested version: **Ballerina 2201.3.4 (Swan Lake Update 3)** + +### Run Ballerina Service Locally + +- Execute the following command in the terminal. + ``` + bal run + ``` \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/pet_mgt_dao.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/pet_mgt_dao.bal new file mode 100644 index 000000000..956fb87a1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/pet_mgt_dao.bal @@ -0,0 +1,523 @@ +import ballerinax/java.jdbc; +import ballerina/sql; +import ballerina/log; + +function dbGetPetsByOwner(string org, string owner) returns Pet[]|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT p.id, p.name, p.breed, p.dateOfBirth, p.owner, p.org, v.name as vaccinationName, + v.lastVaccinationDate, v.nextVaccinationDate, v.enableAlerts FROM Pet p LEFT JOIN Vaccination v + ON p.id = v.petId WHERE p.owner = ${owner} and p.org = ${org}`; + stream petsStream = dbClient->query(query); + + map pets = check getPetsForPetsStream(petsStream); + check petsStream.close(); + return pets.toArray(); + } + on fail error e { + return handleError(e); + } +} + +function dbGetPetByOwnerAndPetId(string owner, string petId) returns Pet|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT p.id, p.name, p.breed, p.dateOfBirth, p.owner, p.org, v.name as vaccinationName, + v.lastVaccinationDate, v.nextVaccinationDate, v.enableAlerts FROM Pet p LEFT JOIN Vaccination v + ON p.id = v.petId WHERE p.owner = ${owner} and p.id = ${petId}`; + stream petsStream = dbClient->query(query); + + map pets = check getPetsForPetsStream(petsStream); + check petsStream.close(); + + if pets.length() == 0 { + return (); + } + return pets.get(petId); + } + on fail error e { + return handleError(e); + } +} + +function dbGetPetByPetId(string petId) returns Pet|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT p.id, p.name, p.breed, p.dateOfBirth, p.owner, p.org, v.name as vaccinationName, + v.lastVaccinationDate, v.nextVaccinationDate, v.enableAlerts FROM Pet p LEFT JOIN Vaccination v + ON p.id = v.petId WHERE p.id = ${petId}`; + stream petsStream = dbClient->query(query); + + map pets = check getPetsForPetsStream(petsStream); + check petsStream.close(); + + if pets.length() == 0 { + return (); + } + return pets.get(petId); + } + on fail error e { + return handleError(e); + } +} + +function dbDeletePetById(string owner, string petId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE from Pet WHERE id = ${petId} and owner = ${owner}`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Pet deleted successfully"; +} + +function dbAddPet(Pet pet) returns Pet|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + transaction { + sql:ParameterizedQuery query = `INSERT INTO Pet (id, name, breed, dateOfBirth, owner, org) + VALUES (${pet.id}, ${pet.name}, ${pet.breed}, ${pet.dateOfBirth}, ${pet.owner}, ${pet.org});`; + _ = check dbClient->execute(query); + + Vaccination[]? vacs = pet.vaccinations; + sql:ExecutionResult[]|sql:Error batchResult = []; + + if vacs != null { + + foreach Vaccination vac in vacs { + if vac.enableAlerts == null { + vac.enableAlerts = false; + } else if (vac.nextVaccinationDate == null) { + vac.nextVaccinationDate = null; + } + } + + sql:ParameterizedQuery[] insertQueries = from Vaccination vac in vacs + select `INSERT INTO Vaccination (petId, name, lastVaccinationDate, nextVaccinationDate,enableAlerts) + VALUES (${pet.id}, ${vac.name}, ${vac.lastVaccinationDate}, ${vac.nextVaccinationDate}, ${vac.enableAlerts})`; + batchResult = dbClient->batchExecute(insertQueries); + } + + if batchResult is sql:Error { + rollback; + return handleError(batchResult); + } else { + check commit; + return pet; + } + + } on fail error e { + return handleError(e); + } +} + +function dbUpdatePet(Pet pet) returns Pet|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + transaction { + sql:ParameterizedQuery query = `UPDATE Pet SET name = ${pet.name}, breed = ${pet.breed}, + dateOfBirth = ${pet.dateOfBirth} WHERE id = ${pet.id};`; + _ = check dbClient->execute(query); + + sql:ParameterizedQuery deleteQuery = `DELETE FROM Vaccination WHERE petId = ${pet.id};`; + _ = check dbClient->execute(deleteQuery); + + Vaccination[]? vacs = pet.vaccinations; + sql:ExecutionResult[]|sql:Error batchResult = []; + + if vacs != null { + + foreach Vaccination vac in vacs { + if vac.enableAlerts == null { + vac.enableAlerts = false; + } else if (vac.nextVaccinationDate == null) { + vac.nextVaccinationDate = null; + } + } + + sql:ParameterizedQuery[] insertQueries = from Vaccination vac in vacs + select `INSERT INTO Vaccination (petId, name, lastVaccinationDate, nextVaccinationDate,enableAlerts) + VALUES (${pet.id}, ${vac.name}, ${vac.lastVaccinationDate}, ${vac.nextVaccinationDate}, ${vac.enableAlerts})`; + batchResult = dbClient->batchExecute(insertQueries); + } + + if batchResult is sql:Error { + rollback; + return handleError(batchResult); + } else { + check commit; + return pet; + } + + } on fail error e { + return handleError(e); + } +} + +function dbAddThumbnailById(string petId, Thumbnail thumbnail) returns string|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `INSERT INTO Thumbnail (petId, fileName, content) + VALUES (${petId}, ${thumbnail.fileName}, ${thumbnail.content.toBytes()});`; + _ = check dbClient->execute(query); + + return "Thumbnail added successfully"; + } + on fail error e { + return handleError(e); + } +} + +function dbDeleteThumbnailById(string petId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE FROM Thumbnail WHERE petId = ${petId};`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Thumbnail deleted successfully"; +} + +function dbGetThumbnailById(string petId) returns Thumbnail|string|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `SELECT fileName, content FROM Thumbnail WHERE petId = ${petId}`; + Thumbnail|sql:Error result = dbClient->queryRow(query); + + if result is sql:NoRowsError { + return "No thumbnail found for petId: " + petId; + } else if result is sql:Error { + return handleError(result); + } else { + return result; + } +} + +function dbAddOrUpdateMedicalRecord(string petId, MedicalReport medicalReport, boolean updateEntry) returns MedicalReport|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + transaction { + sql:ParameterizedQuery query = `INSERT INTO MedicalReport (reportId, diagnosis, treatment, createdAt, updatedAt, petId) + VALUES (${medicalReport.reportId}, ${medicalReport.diagnosis}, ${medicalReport.treatment}, ${medicalReport.createdAt}, + ${medicalReport.updatedAt}, ${petId}) ON DUPLICATE KEY UPDATE diagnosis = ${medicalReport.diagnosis}, + treatment = ${medicalReport.treatment}, updatedAt = ${medicalReport.updatedAt};`; + _ = check dbClient->execute(query); + + if updateEntry { + sql:ParameterizedQuery deleteQuery = `DELETE FROM Medication WHERE reportId = ${medicalReport.reportId};`; + _ = check dbClient->execute(deleteQuery); + } + + Medication[]? medications = medicalReport.medications; + sql:ExecutionResult[]|sql:Error batchResult = []; + + if medications != null { + sql:ParameterizedQuery[] insertQueries = from Medication med in medications + select `INSERT INTO Medication (reportId, drugName, dosage, duration) + VALUES (${medicalReport.reportId}, ${med.drugName}, ${med.dosage}, ${med.duration})`; + batchResult = dbClient->batchExecute(insertQueries); + } + + if batchResult is sql:Error { + rollback; + return handleError(batchResult); + } else { + check commit; + return medicalReport; + } + + } on fail error e { + return handleError(e); + } +} + +function dbGetMedicalReportsByPetId(string petId) returns MedicalReport[]|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT p.reportId, p.diagnosis, p.treatment, p.createdAt, p.updatedAt, + m.drugName, m.dosage, m.duration FROM MedicalReport p LEFT JOIN Medication m + ON p.reportId = m.reportId WHERE p.petId = ${petId}`; + stream medStream = dbClient->query(query); + + map medicalReports = check getMedicalReportFromMedStream(medStream); + check medStream.close(); + return medicalReports.toArray(); + } + on fail error e { + return handleError(e); + } +} + +function dbGetMedicalReportsByPetIdAndReportId(string petId, string reportId) returns MedicalReport|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `SELECT p.reportId, p.diagnosis, p.treatment, p.createdAt, p.updatedAt, + m.drugName, m.dosage, m.duration FROM MedicalReport p LEFT JOIN Medication m + ON p.reportId = m.reportId WHERE p.petId = ${petId} and p.reportId = ${reportId}`; + stream medStream = dbClient->query(query); + + map medicalReports = check getMedicalReportFromMedStream(medStream); + check medStream.close(); + + if medicalReports.length() == 0 { + return (); + } + return medicalReports.get(reportId); + } + on fail error e { + return handleError(e); + } +} + +function dbDeleteMedicalReportByReportId(string petId, string reportId) returns string|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `DELETE FROM MedicalReport WHERE reportId = ${reportId} and petId = ${petId};`; + sql:ExecutionResult|sql:Error result = dbClient->execute(query); + + if result is sql:Error { + return handleError(result); + } else if result.affectedRowCount == 0 { + return (); + } + + return "Medical Report deleted successfully"; +} + +function dbGetOwnerSettings(string org, string owner) returns Settings|()|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + sql:ParameterizedQuery query = `SELECT notifications_enabled as enabled, notifications_emailAddress + as emailAddress FROM Settings WHERE owner = ${owner} and org = ${org}`; + Notifications|sql:Error result = dbClient->queryRow(query); + + if result is sql:NoRowsError { + return (); + } else if result is sql:Error { + return handleError(result); + } else { + Settings settings = {notifications: result}; + return settings; + } + +} + +function dbUpdateSettingsByOwner(SettingsRecord settingsRecord) returns string|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + do { + sql:ParameterizedQuery query = `INSERT INTO Settings (owner, org, notifications_enabled, notifications_emailAddress) + VALUES (${settingsRecord.owner}, ${settingsRecord.org}, ${settingsRecord.notifications.enabled}, + ${settingsRecord.notifications.emailAddress}) + ON DUPLICATE KEY UPDATE notifications_enabled = ${settingsRecord.notifications.enabled} + ,notifications_emailAddress = ${settingsRecord.notifications.emailAddress};`; + + _ = check dbClient->execute(query); + + return "Settings updated successfully"; + } + on fail error e { + return handleError(e); + } +} + +function dbGetPetIdsForEnabledAlerts(string date) returns string[]|error { + + jdbc:Client|error dbClient = getConnection(); + if dbClient is error { + return handleError(dbClient); + } + + string[] petIds = []; + sql:ParameterizedQuery query = `SELECT Pet.id FROM Pet LEFT JOIN Vaccination v ON Pet.id = v.petId + WHERE v.enableAlerts = true AND v.nextVaccinationDate = ${date}`; + stream resultStream = dbClient->query(query); + + check from record {} entry in resultStream + do { + petIds.push(entry["id"].toString()); + }; + check resultStream.close(); + + return petIds; +} + +function handleError(error err) returns error { + log:printError("Error while processing the request", err); + return error("Error while processing the request"); +} + +function getPetsForPetsStream(stream petsStream) returns map|error { + + map pets = {}; + + check from PetVaccinationRecord pet in petsStream + do { + boolean isPetAvailable = pets.hasKey(pet.id); + if !isPetAvailable { + + Pet p = { + id: pet.id, + org: pet.org, + owner: pet.owner, + name: pet.name, + breed: pet.breed, + dateOfBirth: pet.dateOfBirth + }; + + if (pet.vaccinationName != null) { + Vaccination[] vacs = [ + { + name: pet.vaccinationName, + lastVaccinationDate: pet.lastVaccinationDate, + nextVaccinationDate: pet.nextVaccinationDate, + enableAlerts: pet.enableAlerts + } + ]; + p.vaccinations = vacs; + } + + pets[pet.id] = p; + } else { + + if (pet.vaccinationName != null) { + Vaccination vac = { + name: pet.vaccinationName ?: "", + lastVaccinationDate: pet.lastVaccinationDate ?: "", + nextVaccinationDate: pet.nextVaccinationDate, + enableAlerts: pet.enableAlerts + }; + + Pet p = pets.get(pet.id); + Vaccination[] vacarray = p.vaccinations; + vacarray.push(vac); + } + } + }; + + return pets; +} + +function getMedicalReportFromMedStream(stream medStream) returns map|error { + + map medReports = {}; + + check from MedicalReportRecord med in medStream + do { + boolean isReportAvailable = medReports.hasKey(med.reportId); + if !isReportAvailable { + + MedicalReport medReport = { + reportId: med.reportId, + diagnosis: med.diagnosis, + treatment: med.treatment, + createdAt: med.createdAt, + updatedAt: med.updatedAt + }; + + if (med.drugName != "") { + Medication[] meds = [ + { + drugName: med.drugName, + dosage: med.dosage, + duration: med.duration + } + ]; + medReport.medications = meds; + } + + medReports[medReport.reportId] = medReport; + } else { + + if (med.drugName != "") { + Medication medication = { + drugName: med.drugName, + dosage: med.dosage, + duration: med.duration + }; + + MedicalReport report = medReports.get(med.reportId); + Medication[] medArray = report.medications; + medArray.push(medication); + } + } + }; + + return medReports; +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/pet_mgt_impl.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/pet_mgt_impl.bal new file mode 100644 index 000000000..ec8160e93 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/pet_mgt_impl.bal @@ -0,0 +1,636 @@ +import ballerinax/java.jdbc; +import ballerinax/mysql.driver as _; +import ballerina/uuid; +import ballerina/sql; +import ballerina/log; +import ballerinax/mysql; +import ballerina/time; + +configurable string dbHost = "localhost"; +configurable string dbUsername = "admin"; +configurable string dbPassword = "admin"; +configurable string dbDatabase = "PET_DB"; +configurable int dbPort = 3306; + +table key(org, owner, id) petRecords = table []; +table key(org, owner) settingsRecords = table []; +final mysql:Client|error dbClient; +boolean useDB = false; +map thumbnailMap = {}; + +function init() returns error? { + + if dbHost != "localhost" && dbHost != "" { + useDB = true; + } + + sql:ConnectionPool connPool = { + maxOpenConnections: 20, + minIdleConnections: 20, + maxConnectionLifeTime: 300 + }; + + mysql:Options mysqlOptions = { + connectTimeout: 10 + }; + + dbClient = new (dbHost, dbUsername, dbPassword, dbDatabase, dbPort, options = mysqlOptions, connectionPool = connPool); + + if dbClient is sql:Error { + if (!useDB) { + log:printInfo("DB configurations are not given. Hence storing the data locally"); + } else { + log:printError("DB configuraitons are not correct. Please check the configuration", 'error = dbClient); + return error("DB configuraitons are not correct. Please check the configuration"); + } + } + + if useDB { + log:printInfo("DB configurations are given. Hence storing the data in DB"); + } + +} + +function getConnection() returns jdbc:Client|error { + return dbClient; +} + +function getPets(string org, string owner) returns Pet[]|error { + + Pet[] pets = []; + if (useDB) { + pets = check dbGetPetsByOwner(org, owner); + } else { + petRecords.forEach(function(PetRecord petRecord) { + if petRecord.org == org && petRecord.owner == owner { + Pet pet = getPetDetails(petRecord); + pets.push(pet); + } + }); + } + return pets; +} + +function getPetByIdAndOwner(string org, string owner, string petId) returns Pet|()|error { + + if (useDB) { + return dbGetPetByOwnerAndPetId(owner, petId); + } else { + PetRecord? petRecord = petRecords[org, owner, petId]; + if petRecord is () { + return (); + } + return getPetDetails(petRecord); + } +} + +function getPetById(string petId) returns Pet|() { + + if (useDB) { + Pet|()|error petResult = dbGetPetByPetId(petId); + + if petResult is Pet { + return petResult; + } else { + return (); + } + } else { + OwnerInfo[] ownerInfo = from var petRecord in petRecords + where petRecord.id == petId + select {org: petRecord.org, owner: petRecord.owner}; + + if ownerInfo.length() == 0 { + return (); + } + + string org = ownerInfo[0]["org"]; + string owner = ownerInfo[0]["owner"]; + + PetRecord? petRecord = petRecords[org, owner, petId]; + if petRecord is () { + return (); + } + + return getPetDetails(petRecord); + } +} + +function updatePetById(string org, string owner, string email, string petId, PetItem updatedPetItem) returns Pet|()|error { + + if (useDB) { + Pet|() oldPet = check dbGetPetByOwnerAndPetId(owner, petId); + if oldPet is () { + return (); + } + + Pet pet = {id: petId, org: org, owner: owner, ...updatedPetItem}; + Pet|error updatedPet = dbUpdatePet(pet); + + if updatedPet is error { + return updatedPet; + } + enableAlerts(org, owner, email, updatedPet); + return updatedPet; + + } else { + PetRecord? oldePetRecord = petRecords[org, owner, petId]; + if oldePetRecord is () { + return (); + } + petRecords.put({id: petId, org: org, owner: owner, ...updatedPetItem}); + PetRecord petRecord = petRecords[org, owner, petId]; + Pet pet = getPetDetails(petRecord); + enableAlerts(org, owner, email, pet); + return pet; + } +} + +function deletePetById(string org, string owner, string petId) returns string|()|error { + + if (useDB) { + return dbDeletePetById(owner, petId); + } else { + PetRecord? oldePetRecord = petRecords[org, owner, petId]; + if oldePetRecord is () { + return (); + } + _ = petRecords.remove([org, owner, petId]); + return "Pet deleted successfully"; + } +} + +function addPet(PetItem petItem, string org, string owner, string email) returns Pet|error { + + string petId = uuid:createType1AsString(); + + if (useDB) { + Pet pet = {id: petId, org: org, owner: owner, ...petItem}; + Pet addedPet = check dbAddPet(pet); + enableAlerts(org, owner, email, addedPet); + return addedPet; + } else { + petRecords.put({id: petId, org: org, owner: owner, ...petItem}); + PetRecord petRecord = petRecords[org, owner, petId]; + Pet pet = getPetDetails(petRecord); + enableAlerts(org, owner, email, pet); + return pet; + } +} + +function updateThumbnailByPetId(string org, string owner, string petId, Thumbnail thumbnail) returns string|()|error { + + if (useDB) { + + string|()|error deleteResult = dbDeleteThumbnailById(petId); + + if deleteResult is error { + return deleteResult; + } + + if thumbnail.fileName != "" { + string|error result = dbAddThumbnailById(petId, thumbnail); + + if result is error { + return result; + } + } + + return "Thumbnail updated successfully"; + } else { + + string thumbnailKey = getThumbnailKey(org, owner, petId); + + if thumbnail.fileName == "" { + if thumbnailMap.hasKey(thumbnailKey) { + _ = thumbnailMap.remove(thumbnailKey); + } + + } else { + thumbnailMap[thumbnailKey] = thumbnail; + } + + return "Thumbnail updated successfully"; + } +} + +function getThumbnailByPetId(string org, string owner, string petId) returns Thumbnail|()|string|error { + + if (useDB) { + + Thumbnail|string|error getResult = dbGetThumbnailById(petId); + + if getResult is error { + return getResult; + } else if getResult is string { + return getResult; + } else { + return getResult; + } + + } else { + + string thumbnailKey = getThumbnailKey(org, owner, petId); + if thumbnailMap.hasKey(thumbnailKey) { + Thumbnail thumbnail = thumbnailMap[thumbnailKey]; + return thumbnail; + } else { + return (); + } + + } +} + +function getMedicalReportsByPetId(string petId) returns MedicalReport[]|error { + + MedicalReport[] medicalReports = []; + if (useDB) { + return dbGetMedicalReportsByPetId(petId); + } else { + PetRecord petRecord = {id: "", org: "", owner: "", name: "", dateOfBirth: "", breed: ""}; + petRecords.forEach(function(PetRecord petRecordValue) { + if petRecordValue.id == petId { + petRecord = petRecordValue; + } + }); + + if petRecord.id is "" { + log:printInfo("Pet record not found: " + petId); + return medicalReports; + } + + MedicalReport[]? availableMedicalReports = petRecord.medicalReports; + + if availableMedicalReports is () { + return medicalReports; + } + + medicalReports = availableMedicalReports; + return medicalReports; + } +} + +function getMedicalReportsByPetIdAndReportId(string petId, string reportId) returns MedicalReport|()|error { + + MedicalReport[] medicalReports = []; + if (useDB) { + return dbGetMedicalReportsByPetIdAndReportId(petId, reportId); + } else { + + PetRecord petRecord = {id: "", org: "", owner: "", name: "", dateOfBirth: "", breed: ""}; + petRecords.forEach(function(PetRecord petRecordValue) { + if petRecordValue.id == petId { + petRecord = petRecordValue; + } + }); + + if petRecord.id is "" { + return (); + } + + MedicalReport[]? availableMedicalReports = petRecord.medicalReports; + if availableMedicalReports is () { + return (); + } + + medicalReports = availableMedicalReports; + foreach MedicalReport item in medicalReports { + + if (item.reportId == reportId) { + return item; + } + } + return (); + } +} + +function addMedicalReport(string petId, MedicalReportItem medicalReportItem) returns MedicalReport|()|error { + + string reportId = uuid:createType1AsString(); + string createdAt = getCurrentDateTime(); + MedicalReport medicalReport = {reportId: reportId, createdAt: createdAt, updatedAt: createdAt, ...medicalReportItem}; + + if (useDB) { + return dbAddOrUpdateMedicalRecord(petId, medicalReport, false); + } else { + PetRecord petRecord = {id: "", org: "", owner: "", name: "", dateOfBirth: "", breed: ""}; + petRecords.forEach(function(PetRecord petRecordValue) { + if petRecordValue.id == petId { + petRecord = petRecordValue; + } + }); + + if petRecord.id == "" { + return (); + } + + MedicalReport[]? medicalReports = petRecord.medicalReports; + if medicalReports is () { + medicalReports = [medicalReport]; + } else { + medicalReports.push(medicalReport); + } + + petRecord.medicalReports = medicalReports; + petRecords.put({...petRecord}); + return medicalReport; + } +} + +function updateMedicalReport(string petId, string reportId, MedicalReportItem updatedMedicalReportItem) +returns MedicalReport|()|error { + + MedicalReport|()|error oldMedicalReport = getMedicalReportsByPetIdAndReportId(petId, reportId); + + if oldMedicalReport is error { + return oldMedicalReport; + } else if oldMedicalReport is () { + return (); + } else { + + string updatedAt = getCurrentDateTime(); + string createdAt = oldMedicalReport.createdAt; + MedicalReport medicalReport = {reportId: reportId, createdAt: createdAt, updatedAt: updatedAt, ...updatedMedicalReportItem}; + + if (useDB) { + return dbAddOrUpdateMedicalRecord(petId, medicalReport, true); + } else { + PetRecord petRecord = {id: "", org: "", owner: "", name: "", dateOfBirth: "", breed: ""}; + petRecords.forEach(function(PetRecord petRecordValue) { + if petRecord.id == petId { + petRecord = petRecordValue; + } + }); + + if petRecord.id == "" { + return (); + } + + MedicalReport[]? medicalReports = petRecord.medicalReports; + if medicalReports != () { + MedicalReport[] filtered = medicalReports.filter(i => i != oldMedicalReport); + filtered.push(medicalReport); + petRecord.medicalReports = filtered; + petRecords.put({...petRecord}); + } + return medicalReport; + } + } +} + +function deleteMedicalReportById(string petId, string reportId) returns string|()|error { + + MedicalReport|()|error oldMedicalReport = getMedicalReportsByPetIdAndReportId(petId, reportId); + + if oldMedicalReport is error { + return oldMedicalReport; + } else if oldMedicalReport is () { + return (); + } else { + + if (useDB) { + return dbDeleteMedicalReportByReportId(petId, reportId); + } else { + PetRecord petRecord = {id: "", org: "", owner: "", name: "", dateOfBirth: "", breed: ""}; + petRecords.forEach(function(PetRecord petRecordValue) { + if petRecord.id == petId { + petRecord = petRecordValue; + } + }); + + if petRecord.id == "" { + return (); + } + + MedicalReport[]? medicalReports = petRecord.medicalReports; + if medicalReports != () { + MedicalReport[] filtered = medicalReports.filter(i => i != oldMedicalReport); + petRecord.medicalReports = filtered; + petRecords.put({...petRecord}); + return "Medical report deleted successfully"; + } + return (); + } + } +} + +function updateSettings(SettingsRecord settingsRecord) returns string|error { + + if (useDB) { + string|error updatedResult = dbUpdateSettingsByOwner(settingsRecord); + if updatedResult is error { + return updatedResult; + } + + } else { + settingsRecords.put(settingsRecord); + } + + return "Settings updated successfully"; +} + +function getSettings(string org, string owner, string email) returns Settings|error { + + if (useDB) { + + Settings|()|error settings = dbGetOwnerSettings(org, owner); + + if settings is error { + return settings; + } else if settings is () { + Settings newSettings = getDefaultSettings(email); + SettingsRecord settingsRecord = {org: org, owner: owner, ...newSettings}; + string|error updatedResult = dbUpdateSettingsByOwner(settingsRecord); + if updatedResult is error { + return updatedResult; + } + return newSettings; + } else { + return settings; + } + + } else { + SettingsRecord? settingsRecord = settingsRecords[org, owner]; + + if settingsRecord is () { + Settings settings = getDefaultSettings(email); + settingsRecords.put({org: org, owner: owner, ...settings}); + return settings; + } + return {notifications: settingsRecord.notifications}; + } + +} + +function getSettingsByOwner(string org, string owner) returns Settings|() { + + if (useDB) { + + Settings|()|error settings = dbGetOwnerSettings(org, owner); + + if settings is Settings { + return settings; + } else { + return (); + } + + } else { + SettingsRecord? settingsRecord = settingsRecords[org, owner]; + + if settingsRecord is () { + return (); + } + + return {notifications: settingsRecord.notifications}; + } + +} + +function getAvailableAlerts(string nextDay) returns PetAlert[] { + + PetAlert[] petAlerts = []; + string[] petIds = getPetIdsForEnabledAlerts(nextDay); + + foreach var petId in petIds { + Pet|() pet = getPetById(petId); + + if pet != () { + Settings|() settings = getSettingsByOwner(pet.org, pet.owner); + + if settings != () && settings.notifications.enabled && settings.notifications.emailAddress != "" { + + string email = settings.notifications.emailAddress; + Vaccination[] selectedVaccinations = []; + Vaccination[] vaccinations = pet.vaccinations; + + foreach var vac in vaccinations { + if vac.nextVaccinationDate == nextDay && vac.enableAlerts == true { + selectedVaccinations.push(vac); + } + } + + pet.vaccinations = selectedVaccinations; + PetAlert petAlert = {...pet, emailAddress: email}; + petAlerts.push(petAlert); + } + } + } + + return petAlerts; +} + +function getPetIdsForEnabledAlerts(string nextDay) returns string[] { + + string[] petIds = []; + if (useDB) { + string[]|error dbGetPetIdsForEnabledAlertsResult = dbGetPetIdsForEnabledAlerts(nextDay); + + if dbGetPetIdsForEnabledAlertsResult is error { + return petIds; + } else { + return dbGetPetIdsForEnabledAlertsResult; + } + + } else { + petRecords.forEach(function(PetRecord petRecord) { + + if petRecord.vaccinations is () { + return; + } + + Vaccination[] vaccinations = petRecord.vaccinations; + vaccinations.forEach(function(Vaccination vaccination) { + + if vaccination.nextVaccinationDate == nextDay && vaccination.enableAlerts { + petIds.push(petRecord.id); + } + }); + }); + } + + return petIds; +} + +function getPetDetails(PetRecord petRecord) returns Pet { + + Pet pet = { + id: petRecord.id, + org: petRecord.org, + owner: petRecord.owner, + name: petRecord.name, + breed: petRecord.breed, + dateOfBirth: petRecord.dateOfBirth, + vaccinations: petRecord.vaccinations + }; + + return pet; +} + +function getDefaultSettings(string email) returns Settings { + + boolean enabled = false; + if email != "" { + enabled = true; + } + + Settings settings = {notifications: {enabled: enabled, emailAddress: email}}; + return settings; +} + +function enableAlerts(string org, string owner, string email, Pet pet) { + + Vaccination[]? vaccinations = pet.vaccinations; + + if vaccinations is () { + return; + } + + foreach var vac in vaccinations { + + if vac.enableAlerts == true { + Settings|error settings = getSettings(org, owner, email); + if settings is error { + log:printError("Error getting settings", 'error = settings); + } + break; + } + } + +} + +function getThumbnailKey(string org, string owner, string petId) returns string { + return org + "-" + owner + "-" + petId; +} + +function getCurrentDateTime() returns string { + time:Utc currentUtc = time:utcNow(); + time:Civil currentTime = time:utcToCivil(currentUtc); + return civilToIso8601(currentTime); +} + +# Converts time:Civil time to string 2022-07-12T05:42:35Z +# +# + time - time:Civil time record. +# + return - Converted ISO 8601 string. +function civilToIso8601(time:Civil time) returns string { + string year = time.year.toString(); + string month = time.month < 10 ? string `0${time.month}` : time.month.toString(); + string day = time.day < 10 ? string `0${time.day}` : time.day.toString(); + string hour = time.hour < 10 ? string `0${time.hour}` : time.hour.toString(); + string minute = time.minute < 10 ? string `0${time.minute}` : time.minute.toString(); + + decimal? seconds = time.second; + string second = seconds is () ? "00" : (seconds < 10.0d ? string `0${seconds}` : seconds.toString()); + + time:ZoneOffset? zoneOffset = time.utcOffset; + string timeZone = "Z"; + if zoneOffset is time:ZoneOffset { + if zoneOffset.hours == 0 && zoneOffset.minutes == 0 { + timeZone = "Z"; + } else { + string hours = zoneOffset.hours.abs() < 10 ? string `0${zoneOffset.hours.abs()}` : zoneOffset.hours.abs().toString(); + string minutes = zoneOffset.minutes.abs() < 10 ? string `0${zoneOffset.minutes.abs()}` : zoneOffset.minutes.abs().toString(); + timeZone = zoneOffset.hours < 0 ? string `-${hours}${minutes}` : string `+${hours}${minutes}`; + } + } + return string `${year}-${month}-${day}T${hour}:${minute}:${second}${timeZone}`; +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/resources/.keep b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/resources/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/schedule_job.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/schedule_job.bal new file mode 100644 index 000000000..e7acd749c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/schedule_job.bal @@ -0,0 +1,202 @@ +import ballerina/task; +import ballerina/time; +import ballerina/log; +import ballerina/http; + +configurable string emailService = "localhost"; + +map emailOutbox = {}; + +class Job { + + *task:Job; + + public function execute() { + + time:Utc currentUtc = time:utcNow(); + time:Civil currentTime = time:utcToCivil(currentUtc); + + string year; + string month; + string day; + string vacDate; + [year, month, day] = getDateFromCivilTime(currentTime); + + int|error currentDay = int:fromString(day); + if (currentDay is error) { + log:printError("Error while converting day to int: " + currentDay.toString()); + return; + } + vacDate = year + "-" + month + "-" + (currentDay + 1).toString(); + + PetAlert[] petAlerts = getAvailableAlerts(vacDate); + foreach var petAlert in petAlerts { + + Vaccination[] selectedVaccinations = []; + Vaccination[] vaccinations = petAlert.vaccinations; + + foreach var vac in vaccinations { + string key = petAlert.id + "-" + vac.name + "-" + vac.nextVaccinationDate; + if !emailOutbox.hasKey(key) { + selectedVaccinations.push(vac); + } + } + petAlert.vaccinations = selectedVaccinations; + + if selectedVaccinations.length() > 0 { + + int|error currentMonth = int:fromString(month); + if (currentMonth is error) { + log:printError("Error while converting month to int: " + currentMonth.toString()); + return; + } + string currentDate = getMonthName(currentMonth) + " " + day + ", " + year; + sendEmail(petAlert, currentDate, vacDate); + } + + } + + } + + isolated function init() { + } +} + +public function main() returns error? { + + decimal jobIntervalInSeconds = 10; + + task:JobId|task:Error scheduledJob = task:scheduleJobRecurByFrequency(new Job(), jobIntervalInSeconds); + if (scheduledJob is task:JobId) { + log:printInfo("Job scheduled to run every " + jobIntervalInSeconds.toString() + " seconds."); + } else { + log:printError("Could not schedule the job due to an error." + scheduledJob.toString()); + } + +} + +function sendEmail(PetAlert petAlert, string currentDate, string vacDate) { + + if emailService == "localhost" { + log:printWarn("Email not configured. Hence not sending the email for the pet alert: " + petAlert.toString()); + updateEmailOutbox(petAlert); + return; + } + + error? sendEmail1Result = connectWithEmailService(petAlert, currentDate, vacDate); + if sendEmail1Result is error { + log:printError("Error while sending the email for the pet: " + petAlert.name + ", error: " + sendEmail1Result.toString()); + } + updateEmailOutbox(petAlert); + +} + +function getDateFromCivilTime(time:Civil time) returns [string, string, string] { + + string year = time.year.toString(); + string month = time.month < 10 ? string `0${time.month}` : time.month.toString(); + string day = time.day < 10 ? string `0${time.day}` : time.day.toString(); + return [year, month, day]; +} + +function updateEmailOutbox(PetAlert petAlert) { + + Vaccination[] vaccinations = petAlert.vaccinations; + foreach var vac in vaccinations { + string key = petAlert.id + "-" + vac.name + "-" + vac.nextVaccinationDate; + emailOutbox[key] = key; + } +} + +function getMonthName(int index) returns string { + match index { + 1 => { + return "January"; + } + 2 => { + return "February"; + } + 3 => { + return "March"; + } + 4 => { + return "April"; + } + 5 => { + return "May"; + } + 6 => { + return "June"; + } + 7 => { + return "July"; + } + 8 => { + return "August"; + } + 9 => { + return "September"; + } + 10 => { + return "October"; + } + 11 => { + return "November"; + } + 12 => { + return "December"; + } + _ => { + return ""; + } + } +} + +function connectWithEmailService(PetAlert petAlert, string currentDate, string vacDate) returns error? { + + http:Client httpClient = check new (emailService); + string emailSubject = "[Pet Care App][Reminder] You have to take your " + petAlert.breed + ", " + petAlert.name + + " to the vaccination on " + vacDate + "."; + + Vaccination[] vaccinations = petAlert.vaccinations; + string emailAddress = petAlert.emailAddress; + string petName = petAlert.name; + string petBreed = petAlert.breed; + string petDOB = petAlert.dateOfBirth; + string vaccineName = vaccinations[0].name; + string lastVaccinationDate = vaccinations[0].lastVaccinationDate; + + Property[] properties = [ + addProperty("emailAddress", emailAddress), + addProperty("currentDate", currentDate), + addProperty("nextVaccinationDate", vacDate), + addProperty("petName", petName), + addProperty("petBreed", petBreed), + addProperty("petDOB", petDOB), + addProperty("vaccineName", vaccineName), + addProperty("lastVaccinationDate", lastVaccinationDate) + ]; + + EmailContent emailContent = { + emailType: VACCINATION_ALERT, + receipient: emailAddress, + emailSubject: emailSubject, + properties: properties + }; + + http:Request request = new; + request.setJsonPayload(emailContent); + + http:Response response = check httpClient->/messages.post(request); + + if (response.statusCode == 200) { + return; + } else { + return error("Error while sending email, " + response.reasonPhrase); + } +} + +function addProperty(string name, string value) returns Property { + Property prop = {name: name, value: value}; + return prop; +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/service.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/service.bal new file mode 100644 index 000000000..65e3ae02a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/service.bal @@ -0,0 +1,320 @@ +import ballerina/http; +import ballerina/mime; + +UserInfoResolver userInfoResolver = new; + +# A service representing a network-accessible API +# bound to port `9092`. +@http:ServiceConfig { + cors: { + allowOrigins: ["*"] + } +} +service / on new http:Listener(9092) { + + # Get all pets + # + return - List of pets or error + resource function get pets(http:Headers headers) returns Pet[]|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + + return getPets(org, owner); + } + + # Create a new pet + # + newPet - Basic pet details + # + return - Created pet record or error + resource function post pets(http:Headers headers, @http:Payload PetItem newPet) returns Pet|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + string email = userInfo.emailAddress; + + Pet|error pet = addPet(newPet, org, owner, email); + return pet; + } + + # Get a pet by ID + # + petId - ID of the pet + # + return - Pet details or not found + resource function get pets/[string petId](http:Headers headers) returns Pet|http:NotFound|error? { + + Pet|() result = getPetById(petId); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Update a pet + # + petId - ID of the pet + # + updatedPetItem - Updated pet details + # + return - Pet details or not found + resource function put pets/[string petId](http:Headers headers, @http:Payload PetItem updatedPetItem) returns Pet|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + string email = userInfo.emailAddress; + + Pet|()|error result = updatePetById(org, owner, email, petId, updatedPetItem); + if result is () { + return http:NOT_FOUND; + } + return result; + } + + # Delete a pet + # + petId - ID of the pet + # + return - No Content response or error + resource function delete pets/[string petId](http:Headers headers) returns http:NoContent|http:NotFound|error? { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + + string|()|error result = deletePetById(org, owner, petId); + if result is () { + return http:NOT_FOUND; + } else if result is error { + return result; + } + return http:NO_CONTENT; + } + + # Update thumbnail for the pet + # + petId - ID of the pet + # + return - Ok response or error + resource function put pets/[string petId]/thumbnail(http:Request request, http:Headers headers) + returns http:Ok|http:NotFound|http:BadRequest|error { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + + var bodyParts = check request.getBodyParts(); + Thumbnail thumbnail; + if bodyParts.length() == 0 { + thumbnail = {fileName: "", content: ""}; + } else { + Thumbnail|error? handleContentResult = handleContent(bodyParts[0]); + if handleContentResult is error { + return http:BAD_REQUEST; + } + thumbnail = handleContentResult; + } + + string|()|error thumbnailByPetId = updateThumbnailByPetId(org, owner, petId, thumbnail); + + if thumbnailByPetId is error { + return thumbnailByPetId; + } else if thumbnailByPetId is () { + return http:NOT_FOUND; + } + + return http:OK; + } + + # Get thumbnail for the pet + # + petId - ID of the pet + # + return - Ok response or error + resource function get pets/[string petId]/thumbnail(http:Headers headers) returns http:Response|http:NotFound|error { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + + Thumbnail|()|string|error thumbnail = getThumbnailByPetId(org, owner, petId); + http:Response response = new; + + if thumbnail is () { + return http:NOT_FOUND; + } else if thumbnail is error { + return thumbnail; + } else if thumbnail is string { + return response; + } else { + + string fileName = thumbnail.fileName; + byte[] encodedContent = thumbnail.content.toBytes(); + byte[] base64Decoded = (check mime:base64Decode(encodedContent)); + + response.setHeader("Content-Type", "application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=" + fileName); + response.setBinaryPayload(base64Decoded); + } + + return response; + } + + # Get medical reports of the pet + # + petId - ID of the pet + # + return - Medical report record or error + resource function get pets/[string petId]/medical\-reports(http:Headers headers) returns MedicalReport[]|error? { + + return getMedicalReportsByPetId(petId); + } + + # Create a new medical report + # + medicalReportItem - Medical report details + # + return - Created medical report record or error + resource function post pets/[string petId]/medical\-reports(http:Headers headers, + @http:Payload MedicalReportItem medicalReportItem) returns MedicalReport|http:NotFound|error? { + + MedicalReport|()|error medicalReport = addMedicalReport(petId, medicalReportItem); + if medicalReport is () { + return http:NOT_FOUND; + } + + return medicalReport; + } + + # Get medical reports of the pet + # + petId - ID of the pet + # + reportId - ID of the report + # + return - Medical report record or error + resource function get pets/[string petId]/medical\-reports/[string reportId](http:Headers headers) returns MedicalReport| + http:NotFound|error? { + + MedicalReport|()|error medicalReportsByPetIdAndReportId = getMedicalReportsByPetIdAndReportId(petId, reportId); + if medicalReportsByPetIdAndReportId is () { + return http:NOT_FOUND; + } + + return medicalReportsByPetIdAndReportId; + } + + # Update medical reports of the pet + # + petId - ID of the pet + # + reportId - ID of the report + # + updatedMedicalReportItem - Updated medical report details + # + return - Medical report record or error + resource function put pets/[string petId]/medical\-reports/[string reportId](http:Headers headers, + @http:Payload MedicalReportItem updatedMedicalReportItem) returns http:Ok|http:NotFound|error? { + + MedicalReport|()|error medicalReport = updateMedicalReport(petId, reportId, updatedMedicalReportItem); + if medicalReport is MedicalReport { + return http:OK; + } else if medicalReport is () { + return http:NOT_FOUND; + } else { + return medicalReport; + } + } + + # Delete medical reports of the pet + # + petId - ID of the pet + # + reportId - ID of the report + # + return - No Content response or error + resource function delete pets/[string petId]/medical\-reports/[string reportId](http:Headers headers) returns + http:NoContent|http:NotFound|error? { + + string|()|error medicalReportById = deleteMedicalReportById(petId, reportId); + if medicalReportById is string { + return http:NO_CONTENT; + } else if medicalReportById is () { + return http:NOT_FOUND; + } else { + return medicalReportById; + } + } + + # Get settings for the user + # + return - Settings response or error + resource function get settings(http:Headers headers) returns Settings|error { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + string email = userInfo.emailAddress; + + Settings|error settings = getSettings(org, owner, email); + + if settings is error { + return settings; + } + + return settings; + } + + # Updated settings for the user + # + settings - Settings details + # + return - OK response or error + resource function put settings(http:Headers headers, @http:Payload Settings settings) returns http:Ok|error { + + UserInfo|error userInfo = userInfoResolver.retrieveUserInfo(headers); + if userInfo is error { + return userInfo; + } + + string org = userInfo.organization; + string owner = userInfo.userId; + + SettingsRecord settingsRecord = {org: org, owner: owner, ...settings}; + string|error result = updateSettings(settingsRecord); + + if result is error { + return result; + } + return http:OK; + } + +} + +function handleContent(mime:Entity bodyPart) returns Thumbnail|error? { + + var mediaType = mime:getMediaType(bodyPart.getContentType()); + mime:ContentDisposition contentDisposition = bodyPart.getContentDisposition(); + string fileName = contentDisposition.fileName; + + if mediaType is mime:MediaType { + + string baseType = mediaType.getBaseType(); + if mime:IMAGE_JPEG == baseType || mime:IMAGE_GIF == baseType || mime:IMAGE_PNG == baseType { + + byte[] bytes = check bodyPart.getByteArray(); + byte[] base64Encoded = (check mime:base64Encode(bytes)); + string base64EncodedString = check string:fromBytes(base64Encoded); + + Thumbnail thumbnail = { + fileName: fileName, + content: base64EncodedString + }; + + return thumbnail; + } + } + + return error("Unsupported media type found"); +} diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/service_openapi.yaml b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/service_openapi.yaml new file mode 100644 index 000000000..9f64af6fa --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/service_openapi.yaml @@ -0,0 +1,478 @@ +openapi: 3.0.1 +info: + title: Service Openapi Yaml + version: 1.0.0 +servers: +- url: "{server}:{port}/" + variables: + server: + default: http://localhost + port: + default: "9092" +paths: + /pets: + get: + summary: Get all pets + operationId: getPets + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + post: + summary: Create a new pet + operationId: postPets + requestBody: + description: Basic pet details + content: + application/json: + schema: + $ref: '#/components/schemas/PetItem' + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /pets/{petId}: + get: + summary: Get a pet by ID + operationId: getPetsPetid + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update a pet + operationId: putPetsPetid + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + requestBody: + description: Updated pet details + content: + application/json: + schema: + $ref: '#/components/schemas/PetItem' + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + delete: + summary: Delete a pet + operationId: deletePetsPetid + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + responses: + "204": + description: NoContent + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /pets/{petId}/thumbnail: + get: + summary: Get thumbnail for the pet + operationId: getPetsPetidThumbnail + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + responses: + default: + description: Any Response + content: + '*/*': + schema: + description: Any type of entity body + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update thumbnail for the pet + operationId: putPetsPetidThumbnail + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + requestBody: + content: + '*/*': + schema: + description: Any type of entity body + responses: + "200": + description: Ok + "404": + description: NotFound + "400": + description: BadRequest + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /pets/{petId}/medical-reports: + get: + summary: Get medical reports of the pet + operationId: getPetsPetidMedicalReports + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MedicalReport' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + post: + summary: Create a new medical report + operationId: postPetsPetidMedicalReports + parameters: + - name: petId + in: path + required: true + schema: + type: string + requestBody: + description: Medical report details + content: + application/json: + schema: + $ref: '#/components/schemas/MedicalReportItem' + responses: + "201": + description: Created + content: + application/json: + schema: + $ref: '#/components/schemas/MedicalReport' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /pets/{petId}/medical-reports/{reportId}: + get: + summary: Get medical reports of the pet + operationId: getPetsPetidMedicalReportsReportid + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + - name: reportId + in: path + description: ID of the report + required: true + schema: + type: string + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/MedicalReport' + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Update medical reports of the pet + operationId: putPetsPetidMedicalReportsReportid + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + - name: reportId + in: path + description: ID of the report + required: true + schema: + type: string + requestBody: + description: Updated medical report details + content: + application/json: + schema: + $ref: '#/components/schemas/MedicalReportItem' + responses: + "200": + description: Ok + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + delete: + summary: Delete medical reports of the pet + operationId: deletePetsPetidMedicalReportsReportid + parameters: + - name: petId + in: path + description: ID of the pet + required: true + schema: + type: string + - name: reportId + in: path + description: ID of the report + required: true + schema: + type: string + responses: + "204": + description: NoContent + "404": + description: NotFound + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + /settings: + get: + summary: Get settings for the user + operationId: getSettings + responses: + "200": + description: Ok + content: + application/json: + schema: + $ref: '#/components/schemas/Settings' + "500": + description: Internal server error + content: + text/plain: + schema: + type: string + put: + summary: Updated settings for the user + operationId: putSettings + requestBody: + description: Settings details + content: + application/json: + schema: + $ref: '#/components/schemas/Settings' + responses: + "200": + description: Ok + "500": + description: Internal server error + content: + text/plain: + schema: + type: string +components: + schemas: + PetItem: + required: + - breed + - dateOfBirth + - name + type: object + properties: + name: + type: string + breed: + type: string + dateOfBirth: + type: string + vaccinations: + type: array + items: + $ref: '#/components/schemas/Vaccination' + Vaccination: + required: + - lastVaccinationDate + - name + type: object + properties: + name: + type: string + lastVaccinationDate: + type: string + nextVaccinationDate: + type: string + enableAlerts: + type: boolean + Medication: + required: + - dosage + - drugName + - duration + type: object + properties: + drugName: + type: string + dosage: + type: string + duration: + type: string + MedicalReport: + allOf: + - $ref: '#/components/schemas/MedicalReportItem' + - required: + - createdAt + - reportId + - updatedAt + type: object + properties: + createdAt: + type: string + updatedAt: + type: string + reportId: + type: string + OwnerInfo: + required: + - org + - owner + type: object + properties: + owner: + type: string + org: + type: string + MedicalReportItem: + required: + - diagnosis + type: object + properties: + diagnosis: + type: string + treatment: + type: string + medications: + type: array + items: + $ref: '#/components/schemas/Medication' + Notifications: + required: + - enabled + type: object + properties: + enabled: + type: boolean + emailAddress: + type: string + Pet: + allOf: + - $ref: '#/components/schemas/PetItem' + - $ref: '#/components/schemas/OwnerInfo' + - required: + - id + type: object + properties: + id: + type: string + Settings: + required: + - notifications + type: object + properties: + notifications: + $ref: '#/components/schemas/Notifications' diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/types.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/types.bal new file mode 100644 index 000000000..85131c45c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/types.bal @@ -0,0 +1,108 @@ +type PetItem record {| + string name; + string breed; + string dateOfBirth; + Vaccination[] vaccinations?; +|}; + +type Pet record {| + *PetItem; + readonly string id; + *OwnerInfo; +|}; + +type Thumbnail record {| + string fileName; + string content; +|}; + +type Vaccination record {| + string name; + string lastVaccinationDate; + string nextVaccinationDate?; + boolean enableAlerts?; +|}; + +type PetRecord record {| + *Pet; + record { + *Thumbnail; + } thumbnail?; + MedicalReport[] medicalReports?; +|}; + +type PetVaccinationRecord record {| + *OwnerInfo; + string id; + string name; + string breed; + string dateOfBirth; + string vaccinationName?; + string lastVaccinationDate?; + string nextVaccinationDate?; + boolean enableAlerts?; +|}; + +type Notifications record {| + boolean enabled; + string emailAddress?; +|}; + +type Settings record {| + Notifications notifications; +|}; + +type SettingsRecord record {| + *OwnerInfo; + *Settings; +|}; + +type PetAlert record {| + *Pet; + string emailAddress; +|}; + +type OwnerInfo record {| + readonly string owner; + readonly string org; +|}; + +type EmailContent record {| + EmailType emailType; + Property[] properties; + string receipient; + string emailSubject; +|}; + +type Property record {| + string name; + string value; +|}; + +enum EmailType { + VACCINATION_ALERT = "Vaccination Alert" +} + +type MedicalReportItem record {| + string diagnosis; + string treatment?; + Medication[] medications?; +|}; + +type MedicalReport record {| + *MedicalReportItem; + string createdAt; + string updatedAt; + readonly string reportId; +|}; + +type Medication record {| + string drugName; + string dosage; + string duration; +|}; + +type MedicalReportRecord record {| + *Medication; + *MedicalReport; +|}; diff --git a/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/user_info_resolver.bal b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/user_info_resolver.bal new file mode 100644 index 000000000..56e56cbc8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/apis/ballerina/pet-management-service/user_info_resolver.bal @@ -0,0 +1,91 @@ +import ballerina/http; +import ballerina/jwt; + +public type UserInfo record {| + string organization; + string userId; + string emailAddress?; + string[] groups?; +|}; + +public isolated class UserInfoResolver { + + # Returns the user information. + # + # + headers - headers in the request + # + return - UserInfo record or error + public isolated function retrieveUserInfo(http:Headers headers) returns UserInfo|error { + + var jwtHeader = headers.getHeader("x-jwt-assertion"); + + if jwtHeader is http:HeaderNotFoundError { + var authHeader = headers.getHeader("Authorization"); + if authHeader is http:HeaderNotFoundError { + return authHeader; + } else { + if (authHeader.startsWith("Bearer ")) { + jwtHeader = authHeader.substring(7); + } + } + } + + if (jwtHeader is http:HeaderNotFoundError) { + return jwtHeader; + } + + [jwt:Header, jwt:Payload] [_, payload] = check jwt:decode(jwtHeader); + string org = self.getOrgFromPayload(payload); + string user = self.getUserFromPayload(payload); + string email = self.getEmail(payload); + string[] groups = self.getGroups(payload); + + UserInfo userInfo = { + organization: org, + userId: user, + emailAddress: email, + groups: groups + }; + + return userInfo; + } + + private isolated function getUserFromPayload(jwt:Payload payload) returns string { + + string? subClaim = payload.sub; + if subClaim is () { + subClaim = "Test_Key_User"; + } + + return subClaim; + } + + private isolated function getOrgFromPayload(jwt:Payload payload) returns string { + + string? user_org = payload["user_organization"].toString(); + if user_org is "" { + user_org = "Test_Key_Org"; + } + + return user_org; + } + + private isolated function getEmail(jwt:Payload payload) returns string { + return payload["email"].toString(); + } + + private isolated function getGroups(jwt:Payload payload) returns string[] { + + if payload["groups"] is () { + return []; + } + + json[] groups = payload["groups"]; + string[] groupList = []; + foreach json item in groups { + groupList.push(item); + } + + return groupList; + } + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/.eslintrc.js b/petcare-sample/b2b/web-app/petvet/web/nextjs/.eslintrc.js new file mode 100644 index 000000000..76c1f1456 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/.eslintrc.js @@ -0,0 +1,331 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const fs = require("fs"); +const path = require("path"); + +// Base ESLint Config which can be extended to be used in the development environment. + +const LICENSE_HEADER_PATTERN_OVERRIDE_FILE_NAME = "license-header-override.js"; + +const LINE_PADDING_RULES = [ + 1, + // Add a new line after const, let, var declarations. + { blankLine: "always", next: "*", prev: [ "const", "let", "var" ] }, + { blankLine: "any", next: [ "const", "let", "var" ], prev: [ "const", "let", "var" ] }, + // Add a new line after directive declarations like `use strict` etc. + { blankLine: "always", next: "*", prev: "directive" }, + { blankLine: "any", next: "directive", prev: "directive" }, + // Add a new line before return statements. + { blankLine: "always", next: "return", prev: "*" }, + // Add a new line try blocks. + { blankLine: "always", next: "try", prev: "*" }, + // Add a new line break statements. + { blankLine: "always", next: "break", prev: "*" }, + // Add a new line continue statements. + { blankLine: "always", next: "continue", prev: "*" }, + // Add a new line before exports. + { blankLine: "always", next: "export", prev: "*" }, + { blankLine: "any", next: "export", prev: "export" }, + // Add a new line before for loops. + { blankLine: "always", next: "for", prev: "*" }, + // Add a new line before classes. + { blankLine: "always", next: "class", prev: "*" }, + // Add a new line after import statements. + { blankLine: "always", next: "*", prev: "import" }, + { blankLine: "any", next: "import", prev: "import" } +]; + +/** + * Check if an override license header file is defined , if so, + * return that else return the default license header pattern. + * + * @example + * Here's a simple example of overriding the license header pattern.: + * ``` + * // create a `license-header-override.js` at the same level of `.eslintrc.js` + * module.exports = [ + * " * New Company.", + " * Copyright 2022.", + * ]; + * ``` + * + * @returns License Header Pattern. + */ +const getLicenseHeaderPattern = () => { + + const LICENSE_HEADER_DEFAULT_PATTERN = [ + "*", + { + pattern: " Copyright \\(c\\) \\d{4}, WSO2 LLC. \\(https://www.wso2.com\\). All Rights Reserved.", + template: ` * Copyright (c) ${ + new Date().getFullYear() + }, WSO2 LLC. (https://www.wso2.com). All Rights Reserved.` + }, + " *", + " * WSO2 LLC. licenses this file to you under the Apache License,", + " * Version 2.0 (the \"License\"); you may not use this file except", + " * in compliance with the License.", + " * You may obtain a copy of the License at", + " *", + " * http://www.apache.org/licenses/LICENSE-2.0", + " *", + " * Unless required by applicable law or agreed to in writing,", + " * software distributed under the License is distributed on an", + " * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY", + " * KIND, either express or implied. See the License for the", + " * specific language governing permissions and limitations", + " * under the License.", + " " + ]; + + if (!fs.existsSync(path.resolve(__dirname, LICENSE_HEADER_PATTERN_OVERRIDE_FILE_NAME))) { + return LICENSE_HEADER_DEFAULT_PATTERN; + } + + return require(path.resolve(__dirname, LICENSE_HEADER_PATTERN_OVERRIDE_FILE_NAME)); +}; + +module.exports = { + env: { + browser: true, + es6: true, + jest: true, + node: true + }, + extends: [ + "eslint:recommended", + "plugin:import/typescript", + "plugin:react-hooks/recommended", + "plugin:@next/next/recommended" + ], + globals: { + JSX: false, + // no-undef complains about globalThis @see {@link https://github.com/eslint/eslint/issues/11553} + globalThis: false + }, + overrides: [ + { + env: { + browser: true, + es6: true, + node: true + }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + files: [ "**/*.tsx", "**/*.ts" ], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 9, + sourceType: "module" + }, + rules: { + "@typescript-eslint/ban-types": 1, + "@typescript-eslint/explicit-function-return-type": 0, + "@typescript-eslint/no-empty-function": [ + "error", + { + allow: [ "constructors" ] + } + ], + "@typescript-eslint/no-explicit-any": 0, + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + argsIgnorePattern: "^_", + caughtErrorsIgnorePattern: "^_", + varsIgnorePattern: "^_" + } + ], + "@typescript-eslint/no-use-before-define": [ + "warn", + { + classes: false, + functions: false, + typedefs: false, + variables: false + } + ], + "@typescript-eslint/padding-line-between-statements": [ ...LINE_PADDING_RULES ], + "eol-last": "error", + // In development, error level is set to `warn`. This will be overridden + // by the production env linting config. + "no-debugger": 1, + // `no-undef` is discouraged in Typescript projects. + // https://github.com/typescript-eslint/typescript-eslint/issues/2477#issuecomment-686892459 + "no-undef": 0, + "no-use-before-define": "off", + "padding-line-between-statements": "off" + }, + settings: { + react: { + version: "detect" + } + } + } + ], + parserOptions: { + ecmaVersion: 9, + sourceType: "module" + }, + plugins: [ + "import", + "eslint-plugin-tsdoc", + "header" + ], + root: true, + rules: { + "array-bracket-spacing": [ 1, "always" ], + "comma-dangle": [ "warn", "never" ], + "eol-last": "error", + "header/header": [ + "warn", + "block", + getLicenseHeaderPattern() + ], + "import/order": [ + "warn", + { + alphabetize: { + caseInsensitive: true, + order: "asc" + }, + groups: [ "builtin", "external", "index", "sibling", "parent", "internal" ] + } + ], + indent: [ + 1, + 4, + { + SwitchCase: 1 + } + ], + "jsx-quotes": [ "warn", "prefer-double" ], + "lines-between-class-members": [ + 1, + "always", + { + exceptAfterSingleLine: true + } + ], + "max-len": [ + "warn", + { + code: 120 + } + ], + "no-alert": 1, + "no-console": "warn", + "no-duplicate-imports": "warn", + "no-restricted-imports": [ + "error", + { + paths: [ + { + message: "Please use import foo from 'lodash-es/foo' instead.", + name: "lodash" + }, + { + message: "Avoid using chain since it is non tree-shakable. Try out flow instead.", + name: "lodash-es/chain" + }, + { + importNames: [ "chain" ], + message: "Avoid using chain since it is non tree-shakable. Try out flow instead.", + name: "lodash-es" + }, + { + message: "Please use import foo from 'lodash-es/foo' instead.", + name: "lodash-es" + } + ], + patterns: [ "@wso2is/**/dist/**", "lodash/**", "lodash/fp/**" ] + } + ], + "no-unreachable": "error", + "object-curly-spacing": [ "warn", "always" ], + "padding-line-between-statements": [ ...LINE_PADDING_RULES ], + quotes: [ "warn", "double" ], + "react-hooks/exhaustive-deps": [ "off" ], + "react/display-name": 0, + "react/jsx-curly-spacing": [ + "warn", + { + allowMultiline: true, + children: { + when: "always" + }, + spacing: { + objectLiterals: "always" + }, + when: "always" + } + ], + "react/jsx-first-prop-new-line": [ 1, "multiline" ], + "react/jsx-max-props-per-line": [ + 1, + { + maximum: 1, + when: "multiline" + } + ], + "react/jsx-wrap-multilines": [ + "warn", + { + arrow: "parens", + assignment: "parens", + condition: "parens", + declaration: "parens", + logical: "parens", + prop: "parens", + return: "parens" + } + ], + "react/no-children-prop": 0, + "react/prop-types": 1, + "react/react-in-jsx-scope": "off", + semi: 1, + "sort-imports": [ + "warn", + { + ignoreCase: false, + ignoreDeclarationSort: true, + ignoreMemberSort: false + } + ], + "sort-keys": [ + "warn", + "asc", + { + caseSensitive: true, + minKeys: 2, + natural: false + } + ], + "tsdoc/syntax": "warn" + }, + settings: { + react: { + version: "detect" + } + } +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/.eslintrc.json new file mode 100644 index 000000000..31a8f1558 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/.eslintrc.json @@ -0,0 +1,71 @@ +{ + "extends": [ + "./.eslintrc.js" + ], + "root": true, + "ignorePatterns": [ + "**/*" + ], + "plugins": [ + "@nrwl/nx" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": { + "@nrwl/nx/enforce-module-boundaries": [ + "error", + { + "enforceBuildableLibDependency": true, + "allow": [], + "depConstraints": [ + { + "sourceTag": "*", + "onlyDependOnLibsWithTags": [ + "*" + ] + } + ] + } + ] + } + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "extends": [ + "plugin:@nrwl/nx/typescript" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "extends": [ + "plugin:@nrwl/nx/javascript" + ], + "rules": {} + }, + { + "files": [ + "*.spec.ts", + "*.spec.tsx", + "*.spec.js", + "*.spec.jsx" + ], + "env": { + "jest": true + }, + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/.gitignore b/petcare-sample/b2b/web-app/petvet/web/nextjs/.gitignore new file mode 100644 index 000000000..33bd83e5b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/.gitignore @@ -0,0 +1,39 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +.vscode + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env +.env*.local + +# vercel +.vercel +.idea/** + +# Next.js +.next diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/Dockerfile b/petcare-sample/b2b/web-app/petvet/web/nextjs/Dockerfile new file mode 100644 index 000000000..aaf101a48 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/Dockerfile @@ -0,0 +1,45 @@ +FROM node:18-alpine AS base +FROM base AS deps + +RUN apk --no-cache add --virtual .builds-deps build-base python3 libc6-compat + +ARG USER_ID=10001 +ARG USER_GROUP_ID=10001 +ARG USER_HOME=/home/app + +WORKDIR ${USER_HOME} +COPY package.json package-lock.json ./ +RUN npm ci + +# Builder +FROM base AS builder + +ARG USER_HOME=/home/app +WORKDIR ${USER_HOME} +COPY --from=deps ${USER_HOME}/node_modules ./node_modules +COPY . . + +RUN npx nx build business-admin-app:build:production + +# Runner +FROM base AS runner + +ARG USER_HOME=/home/app +ARG USER_ID=10001 +ARG USER_GROUP_ID=10001 + +WORKDIR ${USER_HOME} + +COPY --from=builder --chown=${USER_ID}:${USER_GROUP_ID} /home/app/dist/apps/business-admin-app ./ +COPY --from=builder --chown=${USER_ID}:${USER_GROUP_ID} /home/app/dist/apps/business-admin-app/.next ./.next +COPY --from=builder --chown=${USER_ID}:${USER_GROUP_ID} /home/app/node_modules ./node_modules +COPY --from=builder --chown=${USER_ID}:${USER_GROUP_ID} /home/app/server.js /home/app/ + +USER 10001 +EXPOSE 3002 + +ENV NODE_ENV=production +ENV PORT 3002 +ENV NEXTAUTH_SECRET=V9Ogd83zDs4BtBqZf7rw7fVx/7KrYQfA+8LO2BMuJvo= + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/README.md b/petcare-sample/b2b/web-app/petvet/web/nextjs/README.md new file mode 100644 index 000000000..707bd4b3c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/README.md @@ -0,0 +1,48 @@ +# Pet Management Web App + +## Prerequisites: + +- Node.js (version 10 or above). + +### Build the source + +```bash +npm install +``` + +### Export Environment Variables + +Replace the values correctly, then export them to the terminal. +``` +export NEXTAUTH_URL=http://localhost:3001 +export BASE_ORG_URL=https://api.asgardeo.io/t/ +export CHANNELLING_SERVICE_URL= +export PET_MANAGEMENT_SERVICE_URL= +export HOSTED_URL=http://localhost:3001 +export SHARED_APP_NAME= +export CLIENT_ID= +export CLIENT_SECRET= +export MANAGEMENT_APP_CLIENT_ID= +export MANAGEMENT_APP_CLIENT_SECRET= +``` + +### Run the Application + +- Run in Developer Mode + ```bash + npx nx serve business-admin-app + ``` + +- Run in Production Mode + ```bash + npx nx serve business-admin-app:build:production + cp server.js dist/apps/business-admin-app/ + cd dist/apps/business-admin-app/ + export NODE_ENV=production + export NEXTAUTH_SECRET=V9Ogd83zDs4BtBqZf7rw7fVx/7KrYQfA+8LO2BMuJvo= + node server.js + ``` + + The app should open at [`http://localhost:3001`](http://localhost:3001) + + \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/.eslintrc.json new file mode 100644 index 000000000..9a86e14a6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/.eslintrc.json @@ -0,0 +1,48 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react-typescript", + "next", + "next/core-web-vitals", + "../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*", + ".next/**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": { + "@next/next/no-html-link-for-pages": [ + "error", + "apps/my-new-app/pages" + ] + } + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ], + "rules": { + "@next/next/no-html-link-for-pages": "off" + }, + "env": { + "jest": true + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateBooking/post-booking.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateBooking/post-booking.ts new file mode 100644 index 000000000..dad2432ef --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateBooking/post-booking.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BookingInfo } from "apps/business-admin-app/types/booking"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function postBooking(accessToken: string, payload?: BookingInfo) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().post("/bookings", payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateDoctor/post-doc.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateDoctor/post-doc.ts new file mode 100644 index 000000000..02d90c94d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateDoctor/post-doc.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AxiosResponse } from "axios"; +import { Doctor, DoctorInfo } from "../../../business-admin-app/types/doctor"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function postDoctor(accessToken: string, payload?: DoctorInfo) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().post("/doctors", payload, { + headers: headers + }); + + return response as AxiosResponse; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateMedicalReport/post-medical-report.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateMedicalReport/post-medical-report.ts new file mode 100644 index 000000000..d96b9ea9a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreateMedicalReport/post-medical-report.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import { UpdateMedicalReport } from "apps/business-admin-app/types/pets"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function postMedicalReport(accessToken: string, petID: string, payload?: UpdateMedicalReport) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().post("/pets/" + petID + "/medical-reports", payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreatePet/instance.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreatePet/instance.ts new file mode 100644 index 000000000..16be3360a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreatePet/instance.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { initInstance } from "../instance"; + +export const getPetInstance = () => { + const conf = getConfig().BusinessAdminAppConfig.resourceServerURLs.petManagementService; + + return initInstance(conf); +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreatePet/post-pet.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreatePet/post-pet.ts new file mode 100644 index 000000000..cc80fc452 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/CreatePet/post-pet.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + + +import { updatePetInfo } from "apps/business-admin-app/types/pets"; +import { getPetInstance } from "./instance"; +import createHeaders from "../createHeaders"; + +export async function postPet(accessToken: string, payload?: updatePetInfo) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().post("/pets", payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteBooking/delete-booking.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteBooking/delete-booking.ts new file mode 100644 index 000000000..5451fb4bd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteBooking/delete-booking.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function deleteBooking(accessToken: string, orgId: string, bookingId: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().delete(`/org/${orgId}/bookings/` + bookingId, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteDoctor/delete-doctor.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteDoctor/delete-doctor.ts new file mode 100644 index 000000000..2960625ed --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteDoctor/delete-doctor.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function deleteDoctor(accessToken: string, doctorId: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().delete(`/doctors/${encodeURIComponent(doctorId)}`, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteMedicalReport/deleteMedicalReport.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteMedicalReport/deleteMedicalReport.ts new file mode 100644 index 000000000..3c968700b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeleteMedicalReport/deleteMedicalReport.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function deleteMedicalReport(accessToken: string, petId: string, reportId: string) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().delete("/pets/" + petId + "/medical-reports/" + reportId, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeletePersonalization/delete-personalization.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeletePersonalization/delete-personalization.ts new file mode 100644 index 000000000..2cc9f8492 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeletePersonalization/delete-personalization.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import createHeaders from "../createHeaders"; +import { getPersonalizationInstance } from "../GetPersonalization/personalizationInstance"; + +export async function deletePersonalization(accessToken: string) { + const headers = createHeaders(accessToken); + const response = await getPersonalizationInstance().delete("personalization" , { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeletePet/delete-pet.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeletePet/delete-pet.ts new file mode 100644 index 000000000..01214b7bd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/DeletePet/delete-pet.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function deletePet(accessToken: string, orgId: string, userId: string, petId: string) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().delete(`/org/${orgId}/user/${userId}/pets/` + petId, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GebookingsPerDay/get-bookings-per-day.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GebookingsPerDay/get-bookings-per-day.ts new file mode 100644 index 000000000..b64d6e4c3 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GebookingsPerDay/get-bookings-per-day.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Booking } from "apps/business-admin-app/types/booking"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getDoctorBookingsPerDay(accessToken: string, doctorId: string, date: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get(`doctors/${encodeURIComponent(doctorId)}/bookings?date=` + date, { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetAppointmentNo/get-appointment-no.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetAppointmentNo/get-appointment-no.ts new file mode 100644 index 000000000..d13b53b13 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetAppointmentNo/get-appointment-no.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AppointmentNoInfo } from "apps/business-admin-app/types/booking"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getNextAppointmentNo(accessToken: string, + orgId:string, + doctorId: string, date: string, + sessionStartTime: string, + sessionEndTime: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance(). + get(`org/${orgId}/doctors/`+ doctorId +"/next-appointment-number?date=" + date + + "&sessionStartTime=" + sessionStartTime + + "&sessionEndTime=" + sessionEndTime , { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetDocThumbnail/get-doc-thumbnail.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetDocThumbnail/get-doc-thumbnail.tsx new file mode 100644 index 000000000..ce6253c27 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetDocThumbnail/get-doc-thumbnail.tsx @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getDocThumbnail(accessToken: string, doctorId: string) { + const headers = { + "Authorization": `Bearer ${accessToken}`, + "accept": "*/*" + }; + + const response = await getDoctorInstance().get(`doctors/${encodeURIComponent(doctorId)}/thumbnail` , { + headers: headers, + responseType: "blob" + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetDoctorBookings/get-doc-bookings.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetDoctorBookings/get-doc-bookings.ts new file mode 100644 index 000000000..082699b8d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetDoctorBookings/get-doc-bookings.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Booking } from "apps/business-admin-app/types/booking"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getDoctorBookings(accessToken: string, doctorId: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get(`/doctors/${encodeURIComponent(doctorId)}/bookings`, { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetMedicalReports/get-medical-reports.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetMedicalReports/get-medical-reports.ts new file mode 100644 index 000000000..928e96438 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetMedicalReports/get-medical-reports.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { MedicalReport } from "apps/business-admin-app/types/pets"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function getMedicalReport(accessToken: string, petId: string) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().get("/pets/" + petId + "/medical-reports", { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetOrgDetails/get-org-info.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetOrgDetails/get-org-info.ts new file mode 100644 index 000000000..5bb09eb75 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetOrgDetails/get-org-info.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AxiosResponse } from "axios"; +import { OrgInfo } from "../../types/doctor"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getOrgInfo(accessToken: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get("org-info", { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPersonalization/get-personalization.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPersonalization/get-personalization.ts new file mode 100644 index 000000000..07716186c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPersonalization/get-personalization.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getPersonalizationInstance } from "./personalizationInstance"; + +export async function getPersonalization(orgId: string) { + // const headers = createHeaders(accessToken); + const response = await getPersonalizationInstance().get(`personalization/org/${orgId}`, { + headers: {} + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPersonalization/personalizationInstance.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPersonalization/personalizationInstance.ts new file mode 100644 index 000000000..dcb6d9b07 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPersonalization/personalizationInstance.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { initInstance } from "../instance"; + +export const getPersonalizationInstance = () => { + const conf = getConfig().BusinessAdminAppConfig.resourceServerURLs.personalizationService; + + return initInstance(conf); +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPet/get-pet.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPet/get-pet.ts new file mode 100644 index 000000000..3c3dda7df --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetPet/get-pet.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Pet } from "apps/business-admin-app/types/pets"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function getPet(accessToken: string, petId: string) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().get("/pets/" + petId, { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetProfileInfo/me.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetProfileInfo/me.ts new file mode 100644 index 000000000..a8368d009 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetProfileInfo/me.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getProfile(accessToken: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get("/me", { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail.ts new file mode 100644 index 000000000..342f0c366 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { getPetInstance } from "../CreatePet/instance"; + +export async function getThumbnail(accessToken: string, orgId: string, userId: string, petId: string) { + const headers = { + "Authorization": `Bearer ${accessToken}`, + "accept": "*/*" + }; + + const response = await getPetInstance().get(`/org/${orgId}/user/${userId}/pets/` + petId + "/thumbnail" , { + headers: headers, + responseType: "blob" + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetUserBookings/get-bookings.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetUserBookings/get-bookings.ts new file mode 100644 index 000000000..a21486fe9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/GetUserBookings/get-bookings.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Booking } from "apps/business-admin-app/types/booking"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function getBookings(accessToken: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get("/bookings", { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/Notifications/get-notification.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/Notifications/get-notification.ts new file mode 100644 index 000000000..801dde40b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/Notifications/get-notification.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function getNotification(accessToken: string, orgId: string, userId: string, email: string) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().get( + `/org/${orgId}/user/${userId}/settings?email=${encodeURIComponent(email)}`, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/Notifications/post-notification.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/Notifications/post-notification.ts new file mode 100644 index 000000000..e4389d7a9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/Notifications/post-notification.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import { Notifications } from "apps/business-admin-app/types/pets"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function postNotification(accessToken: string, orgId:string, userId: string, payload?: Notifications) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().put(`/org/${orgId}/user/${userId}/settings`, payload, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateBooking/put-booking.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateBooking/put-booking.ts new file mode 100644 index 000000000..e1baf02c7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateBooking/put-booking.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { BookingInfo } from "apps/business-admin-app/types/booking"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function updateBooking(accessToken: string, orgId: string, bookingId: string, payload?: BookingInfo) { + const headers = createHeaders(accessToken); + const path = `/org/${orgId}/bookings/` + bookingId; + const response = await getDoctorInstance().put(path, payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateDoctor/put-doc.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateDoctor/put-doc.tsx new file mode 100644 index 000000000..37d7a4308 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateDoctor/put-doc.tsx @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DoctorInfo } from "../../types/doctor"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function putDoctor(accessToken: string, doctorId: string, payload?: DoctorInfo) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().put(`doctors/${encodeURIComponent(doctorId)}`, payload, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateMedicalReport/put-medicalReport.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateMedicalReport/put-medicalReport.ts new file mode 100644 index 000000000..204a30f60 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateMedicalReport/put-medicalReport.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { UpdateMedicalReport } from "apps/business-admin-app/types/pets"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function updateMedicalReport +(accessToken: string, petId: string, reportId: string, payload?: UpdateMedicalReport) { + const headers = createHeaders(accessToken); + const path = "/pets/" + petId + "/medical-reports/" + reportId; + const response = await getPetInstance().put(path, payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateOrgInfo/put-org-info.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateOrgInfo/put-org-info.ts new file mode 100644 index 000000000..571bf15fb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdateOrgInfo/put-org-info.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { UpdateOrgInfo } from "../../types/doctor"; +import createHeaders from "../createHeaders"; +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function putOrgInfo(accessToken: string, payload?: UpdateOrgInfo) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().put("org-info" , payload, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdatePersonalization/post-personalization.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdatePersonalization/post-personalization.ts new file mode 100644 index 000000000..6a8dce885 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdatePersonalization/post-personalization.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Personalization } from "apps/business-admin-app/types/personalization"; +import createHeaders from "../createHeaders"; +import { getPersonalizationInstance } from "../GetPersonalization/personalizationInstance"; + +export async function postPersonalization(accessToken: string, payload?: Personalization) { + const headers = createHeaders(accessToken); + const response = await getPersonalizationInstance().post("personalization" , payload, { + headers: headers + }); + + return response; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdatePet/update-pet.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdatePet/update-pet.ts new file mode 100644 index 000000000..0ee5a7e15 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UpdatePet/update-pet.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { updatePetInfo } from "apps/business-admin-app/types/pets"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function updatePet(accessToken: string, petId: string, payload?: updatePetInfo) { + const headers = createHeaders(accessToken); + const path = "/pets/" + petId; + const response = await getPetInstance().put(path, payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UploadDocThumbnail/put-doc-thumbnail.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UploadDocThumbnail/put-doc-thumbnail.tsx new file mode 100644 index 000000000..6ab690be2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UploadDocThumbnail/put-doc-thumbnail.tsx @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getDoctorInstance } from "../getDoctors/doctorInstance"; + +export async function updateDocThumbnail(accessToken: string, doctorId: string, payload: FormData) { + const headers = { + "Authorization": `Bearer ${accessToken}`, + "Content-Type": "multipart/form-data" + }; + const path = `doctors/${encodeURIComponent(doctorId)}/thumbnail`; + const response = await getDoctorInstance().put(path, payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UploadThumbnail/put-thumbnail.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UploadThumbnail/put-thumbnail.ts new file mode 100644 index 000000000..9130b45b9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/UploadThumbnail/put-thumbnail.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getPetInstance } from "../CreatePet/instance"; + +export async function updateThumbnail(accessToken: string, petId: string, payload: FormData) { + const headers = { + "Authorization": `Bearer ${accessToken}`, + "Content-Type": "multipart/form-data" + }; + const path = "/pets/" + petId + "/thumbnail"; + const response = await getPetInstance().put(path, payload, { + headers: headers + }); + + return response; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/createHeaders.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/createHeaders.ts new file mode 100644 index 000000000..5a80eb676 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/createHeaders.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function createHeaders(accessToken: string): Record { + const headers: Record = { + Authorization: `Bearer ${accessToken}` + }; + + return headers; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/doctorInstance.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/doctorInstance.ts new file mode 100644 index 000000000..d0b9e3b64 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/doctorInstance.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { initInstance } from "../instance"; + +export const getDoctorInstance = () => { + const conf = getConfig().BusinessAdminAppConfig.resourceServerURLs.channellingService; + + return initInstance(conf); +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/get-doctor.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/get-doctor.ts new file mode 100644 index 000000000..e9f617d64 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/get-doctor.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AxiosResponse } from "axios"; +import { getDoctorInstance } from "./doctorInstance"; +import { Doctor } from "../../types/doctor"; +import createHeaders from "../createHeaders"; + + +export async function getDoctor(accessToken: string, doctorId: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get(`doctors/${encodeURI(doctorId)}`, { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/get-doctors.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/get-doctors.ts new file mode 100644 index 000000000..d7285d31f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getDoctors/get-doctors.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AxiosResponse } from "axios"; +import { getDoctorInstance } from "./doctorInstance"; +import { Doctor } from "../../types/doctor"; +import createHeaders from "../createHeaders"; + +export async function getDoctors(accessToken: string) { + const headers = createHeaders(accessToken); + const response = await getDoctorInstance().get("/doctors", { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getPetList/get-pets.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getPetList/get-pets.ts new file mode 100644 index 000000000..af8481213 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/getPetList/get-pets.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { Pet } from "apps/business-admin-app/types/pets"; +import { AxiosResponse } from "axios"; +import createHeaders from "../createHeaders"; +import { getPetInstance } from "../CreatePet/instance"; + +export async function getPets(accessToken: string) { + const headers = createHeaders(accessToken); + const response = await getPetInstance().get("/pets", { + headers: headers + }); + + return response as AxiosResponse; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/instance.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/instance.ts new file mode 100644 index 000000000..37fcf9de3 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/APICalls/instance.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import axios from "axios"; + +export const initInstance = (baseURL: string) => { + return axios.create({ baseURL }); +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/home.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/home.tsx new file mode 100644 index 000000000..897c92ff7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/home.tsx @@ -0,0 +1,198 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { LogoComponent } from "@pet-management-webapp/business-admin-app/ui/ui-components"; +import { signout } from "@pet-management-webapp/business-admin-app/util/util-authorization-config-util"; +import { SignOutComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { getPersonalization } from "apps/business-admin-app/APICalls/GetPersonalization/get-personalization"; +import DoctorBookingsSection + from "apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorBookings"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import "rsuite/dist/rsuite.min.css"; +import GetStartedSectionComponent from "./sections/getStartedSection/getStartedSectionComponent"; +import GetStartedSectionComponentForAdmin from "./sections/getStartedSection/getStartedSectionForAdmin"; +import GetStartedSectionComponentForDoctor from "./sections/getStartedSection/getStartedSectionForDoctor"; +import GetStartedSectionComponentForPetOwner from "./sections/getStartedSection/getStartedSectionForPetOwner"; +import PetsSection from "./sections/sectionsReatedToPetOwner/petsPage"; +import SettingsSection from "./sections/sectionsReatedToPetOwner/settings"; +import BookingsInPetOwnerSection from "./sections/sectionsRelatedToBookings/bookingsInPetOwnerView"; +import ChannelDoctorSection from "./sections/sectionsRelatedToBookings/channelDocSection"; +import DoctorProfileSection from "./sections/sectionsRelatedToDoctor/doctorProfile"; +import ManageDoctorsSection from "./sections/sectionsRelatedToDoctor/manageDoctors"; +import IdpSectionComponent from "./sections/settingsSection/idpSection/idpSectionComponent"; +import ManageGroupSectionComponent from "./sections/settingsSection/manageGroupSection/manageGroupSectionComponent"; +import ManageUserSectionComponent from "./sections/settingsSection/manageUserSection/manageUserSectionComponent"; +import ConfigureMFASection from "./sections/settingsSection/mfaSection/configureMfaSection"; +import PersonalizationSectionComponent + from "./sections/settingsSection/personalizationSection/personalizationSectionComponent"; +import personalize from "./sections/settingsSection/personalizationSection/personalize"; +import RoleManagementSectionComponent from + "./sections/settingsSection/roleManagementSection/roleManagementSectionComponent"; +import sideNavDataForAdmin + from "../../../../libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForAdmin.json"; +import HomeComponentForAdmin + from "../../../../libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForAdmin"; +import Custom500 from "../../pages/500"; + + +interface HomeProps { + name: string, + session: Session +} + +/** + * + * @param prop - orgId, name, session, colorTheme + * + * @returns The home section. Mainly side nav bar and the section to show other settings sections. + */ +export default function Home(props: HomeProps): JSX.Element { + + const { name, session } = props; + + const [ activeKeySideNav, setActiveKeySideNav ] = useState("1"); + const [ signOutModalOpen, setSignOutModalOpen ] = useState(false); + + const fetchData = useCallback(async () => { + fetchBrandingPreference(); + }, [ session ]); + + useEffect(() => { + fetchData(); + fetchBrandingPreference(); + }, [ fetchData ]); + + const fetchBrandingPreference = async () => { + // getPersonalization(session.accessToken, session.orgId) + // .then((response) => { + // personalize(response.data); + // }); + }; + + + + + const mainPanelComponenet = (activeKey): JSX.Element => { + switch (activeKey) { + case "1": + + return ; + case "2-1": + + return ; + case "2-2": + + return ; + case "2-3": + + return ; + case "2-4": + + return ; + case "3": + + return ; + case "4": + + return ; + case "5": + + return ; + case "6": + + return ; + case "7-1": + + return ; + case "7-2": + + return ; + + case "8": + + return ; + case "9": + + return ; + case "10": + + return ; + case "11": + + return ; + case "12": + + return ; + case "13": + + return ; + } + }; + + const signOutCallback = (): void => { + signout(session); + }; + + const activeKeySideNavSelect = (eventKey: string | undefined): void => { + setActiveKeySideNav(eventKey); + }; + + const signOutModalClose = (): void => { + setSignOutModalOpen(false); + }; + + let homeComponent; + + if (session) { + homeComponent = ( + + ) } + > + + { mainPanelComponenet(activeKeySideNav) } + + ) + ; + + } else { + homeComponent = ; + } + + return ( +
+ + + { homeComponent } +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionComponent.tsx new file mode 100644 index 000000000..7c62414df --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionComponent.tsx @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Image from "next/image"; +import { FlexboxGrid } from "rsuite"; +import GetStartedText from "./otherComponents/getStartedText"; +import getStartedImage from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/getStarted.svg"; + +/** + * + * @returns The get started interface section. + */ +export default function GetStartedSectionComponent() { + + return ( + + + + + + profile image + + + ); + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForAdmin.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForAdmin.tsx new file mode 100644 index 000000000..86aeb8925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForAdmin.tsx @@ -0,0 +1,390 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import AccountCircleIcon from "@mui/icons-material/AccountCircle"; +import { Grid } from "@mui/material"; +import CheckOutlineIcon from "@rsuite/icons/CheckOutline"; +import CloseOutlineIcon from "@rsuite/icons/CloseOutline"; +import EditIcon from "@rsuite/icons/Edit"; +import { getDoctors } from "apps/business-admin-app/APICalls/getDoctors/get-doctors"; +import { getOrgInfo } from "apps/business-admin-app/APICalls/GetOrgDetails/get-org-info"; +import { putOrgInfo } from "apps/business-admin-app/APICalls/UpdateOrgInfo/put-org-info"; +import { Doctor, OrgInfo, UpdateOrgInfo } from "apps/business-admin-app/types/doctor"; +import Chart from "chart.js/auto"; +import { Session } from "next-auth"; +import { useEffect, useRef, useState } from "react"; +import { Stack } from "rsuite"; +import styles from "../../../../styles/Home.module.css"; + +interface GetStartedSectionComponentForAdminProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns Get started section for Admin user. + */ +export default function GetStartedSectionComponentForAdmin(props: GetStartedSectionComponentForAdminProps) { + + const { session } = props; + const [ doctorList, setDoctorList ] = useState(null); + const typesToFilter: string[] = [ "cardiology", "neurology", "oncology", "nutrition" ]; + const [ filteredCount, setFilteredCount ] = useState<{ [key: string]: number }>({}); + const [ labels, setLabels ] = useState([]); + const [ data, setdata ] = useState([]); + const [ edit, setEdit ] = useState(false); + const [ orgInfo, setOrgInfo ] = useState(null); + const [ regNo, setRegNo ] = useState(""); + const [ orgAddress, setOrgAddress ] = useState(""); + const [ telephoneNo, setTelephoneNo ] = useState(""); + const [ reload, setReload ] = useState(false); + + async function getDoctorList() { + const accessToken = session.accessToken; + + getDoctors(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setDoctorList(res.data); + setFilteredCount(filterAndCountDoctorsBySpecialty(res.data, typesToFilter)); + const bookingCounts = getBookingCountsPerDay(res.data); + + bookingCounts.forEach((count, date) => { + labels.push(date); + data.push(count); + }); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + async function getOrgDetails() { + const accessToken = session.accessToken; + + getOrgInfo(accessToken, session.orgId) + .then((res) => { + if (res.data) { + setOrgInfo(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + useEffect(() => { + getDoctorList(); + getOrgDetails(); + }, [ session ]); + + useEffect(() => { + setRegNo(orgInfo?.registrationNumber); + }, [ orgInfo ]); + + const handleEdit = () => { + setEdit(true); + }; + + const handleSave = () => { + setEdit(false); + async function updateOrgDetails() { + const accessToken = session.accessToken; + const name = session.orgName; + const address = (orgAddress) ? orgAddress : orgInfo?.address; + const registrationNumber = (regNo) ? regNo : orgInfo?.registrationNumber; + const telephoneNumber = (telephoneNo) ? telephoneNo : orgInfo?.telephoneNumber; + + const payload: UpdateOrgInfo = { + address: address, + name: name, + registrationNumber: registrationNumber, + telephoneNumber: telephoneNumber + }; + + putOrgInfo(accessToken, session.orgId, payload); + } + updateOrgDetails(); + }; + + const handleCancel = async () => { + getOrgDetails(); + setReload(true); + setEdit(false); + await sleep(20); + setReload(false); + }; + + + const DonutChart: React.FC = () => { + const chartRef = useRef(null); + + useEffect(() => { + if (chartRef.current) { + const ctx = chartRef.current.getContext("2d"); + + if (ctx) { + new Chart(ctx, { + type: "doughnut", + data: { + labels: [ "Cardiology", "Neurology", "Oncology", "Nutrition", "Other" ], + datasets: [ + { + data: [ filteredCount["cardiology"], + filteredCount["neurology"], + filteredCount["oncology"], + filteredCount["nutrition"], + doctorList?.length - (filteredCount["cardiology"]+ + filteredCount["neurology"] + + filteredCount["oncology"] + + filteredCount["nutrition"]) + + ], + backgroundColor: [ "#4e40ed", "#4e5ded", "#4e7eed", "#4e9bed", "#77b0ed" ] + } + ] + }, + options: { + plugins: { + legend: { + position: "right", // Adjust the legend position to 'right' + align: "center" // Align the legend items to the end of the container + } + } + } + }); + } + } + }, []); + + return ; + }; + + const BarChart: React.FC = () => { + const chartRef = useRef(null); + + useEffect(() => { + if (chartRef.current) { + const ctx = chartRef.current.getContext("2d"); + + if (ctx) { + new Chart(ctx, { + type: "bar", + data: { + labels: labels, + datasets: [ + { + label: "Booking Count", + data: data, + backgroundColor: + [ "#4e7eed" ] + } + ] + }, + options: { + responsive: true, + scales: { + y: { + beginAtZero: true, + ticks: { + precision: 0 + } + } + } + } + }); + } + } + }, []); + + return ; + }; + + + + return ( +
+
+ +
+ { "Welcome, " + session.user?.name.givenName + " " + session.user?.name.familyName + "!" } +
+
+ { "Taking Veterinary Care to the Next Level of Excellence" } +
+ +
+ +
+
+ Organization Profile +
+ { edit? ( +
+ + +
+ ):( + + ) } +
+ + + + { !reload && ( + <> +

Organization Name

+ +
+

Registration Number

+ setRegNo(e.target.value) } /> + +
+

Adress

+ setOrgAddress(e.target.value) } /> +
+

Telephone Number

+ setTelephoneNo(e.target.value) } /> +
) } +
+
+
+
+
+
+ +
+
+ Doctor Specialty Summary +
+
+
+ +
+
+
+ { doctorList? doctorList.length:0 } +
+
+ Total Doctors +
+
+
+ +
+
+ Bookings Count Per Day +
+
+ +
+
+
+
+ ); +} + +function filterAndCountDoctorsBySpecialty(doctors: Doctor[], types: string[]): { [key: string]: number } { + const filteredCounts: { [key: string]: number } = {}; + + types.forEach((type) => { + const filteredBookings = doctors.filter((doctor) => doctor.specialty.toLowerCase() === type); + + filteredCounts[type] = filteredBookings.length; + }); + + return filteredCounts; +} + +const getBookingCountsPerDay = (doctors: Doctor[]): Map => { + const bookingCountsPerDay = new Map(); + + doctors.forEach((doctor) => { + doctor.availability.forEach((availability) => { + availability.timeSlots.forEach((timeSlot) => { + const bookingCount = timeSlot.availableBookingCount; + const date = availability.date; + + if (bookingCountsPerDay.has(date)) { + const currentCount = bookingCountsPerDay.get(date); + + bookingCountsPerDay.set(date, currentCount + bookingCount); + } else { + bookingCountsPerDay.set(date, bookingCount); + } + }); + }); + }); + + return bookingCountsPerDay; +}; + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForDoctor.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForDoctor.tsx new file mode 100644 index 000000000..dc203aaa1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForDoctor.tsx @@ -0,0 +1,289 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import AccountCircleIcon from "@mui/icons-material/AccountCircle"; +import { getDoctorBookingsPerDay } from "apps/business-admin-app/APICalls/GebookingsPerDay/get-bookings-per-day"; +import { getDoctorBookings } from "apps/business-admin-app/APICalls/GetDoctorBookings/get-doc-bookings"; +import { getProfile } from "apps/business-admin-app/APICalls/GetProfileInfo/me"; +import { Booking, BookingResult } from "apps/business-admin-app/types/booking"; +import { Doctor } from "apps/business-admin-app/types/doctor"; +import Chart from "chart.js/auto"; +import { format, parse } from "date-fns"; +import { Session } from "next-auth"; +import { useEffect, useRef, useState } from "react"; +import { Stack } from "rsuite"; +import styles from "../../../../styles/Home.module.css"; + +interface GetStartedSectionComponentForDoctorProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function GetStartedSectionComponentForDoctor(props: GetStartedSectionComponentForDoctorProps) { + + const { session } = props; + const [ doctor, setDoctor ] = useState(null); + const [ bookingList, setBookingList ] = useState(null); + const typesToFilter: string[] = [ "confirmed", "completed" ]; + const [ filteredCount, setFilteredCount ] = useState<{ [key: string]: number }>({}); + const [ yesterday, setYesterday ] = useState(""); + const [ today, setToday ] = useState(""); + const [ tommorrow, setTommorrow ] = useState(""); + const [ todayBookingCount, setTodayBookingCount ] = useState(0); + const [ tommorrowBookingCount, setTommorrowBookingCount ] = useState(0); + const [ yesterdayBookingCount, setYesterdayBookingCount ] = useState(0); + + async function getBookings(): Promise { + const accessToken = session?.accessToken; + + getProfile(accessToken) + .then(async (res) => { + if (res.data) { + setDoctor(res.data); + } + const response = await getDoctorBookings(accessToken, res.data.id); + + if (response.data instanceof Array) { + setBookingList(response.data); + setFilteredCount(filterAndCountBookingsByStatus(response.data, typesToFilter)); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + const getFormattedDate = (date: Date): string => { + const localDateString = date.toLocaleDateString(); + const parsedDate = parse(localDateString, "M/d/yyyy", new Date()); + const formattedDate = format(parsedDate, "yyyy-MM-dd"); + + return formattedDate; + }; + + async function getBookingsPerDayForGraph(date: string): Promise { + try { + const accessToken = session?.accessToken; + const doctorId = doctor?.id; + + const response = await getDoctorBookingsPerDay(accessToken, doctorId, date); + + if (response.data instanceof Array) { + return response.data as BookingResult[]; + } + } catch (error) { + // eslint-disable-next-line no-console + console.log(error); + } + + return []; + } + + + useEffect(() => { + const fetchData = async () => { + try { + await getBookings(); + } catch (error) { + // eslint-disable-next-line no-console + console.log(error); + } + }; + + fetchData(); + }, [ session ]); + + + useEffect(() => { + + const fetchData = async () => { + try { + const currentDate = new Date(); + const tomorrowDate = new Date(); + const yesterdayDate = new Date(); + + yesterdayDate.setDate(currentDate.getDate() - 1); + tomorrowDate.setDate(currentDate.getDate() + 1); + + setYesterday(getFormattedDate((yesterdayDate))); + setToday(getFormattedDate((currentDate))); + setTommorrow(getFormattedDate((tomorrowDate))); + + + const todayBookingList = + await getBookingsPerDayForGraph(getFormattedDate(currentDate)); + const tommorrowBookingList = + await getBookingsPerDayForGraph(getFormattedDate(tomorrowDate)); + const yesterdayBookingList = + await getBookingsPerDayForGraph(getFormattedDate(yesterdayDate)); + + setTodayBookingCount(todayBookingList.length); + setTommorrowBookingCount(tommorrowBookingList.length); + setYesterdayBookingCount(yesterdayBookingList.length); + } catch (error) { + // eslint-disable-next-line no-console + console.log(error); + } + }; + + fetchData(); + + }, [ doctor?.id ]); + + const DonutChart: React.FC = () => { + const chartRef = useRef(null); + + useEffect(() => { + if (chartRef.current) { + const ctx = chartRef.current.getContext("2d"); + + if (ctx) { + new Chart(ctx, { + type: "doughnut", + data: { + labels: [ "Confirmed", "Completed" ], + datasets: [ + { + data: [ filteredCount["confirmed"], filteredCount["completed"] ], + backgroundColor: [ "#4e40ed", "#4e7eed" ] + } + ] + }, + options: { + plugins: { + legend: { + position: "right", + align: "center" + } + } + } + }); + } + } + }, []); + + return ; + }; + + const BarChart: React.FC = () => { + const chartRef = useRef(null); + + useEffect(() => { + if (chartRef.current) { + const ctx = chartRef.current.getContext("2d"); + + if (ctx) { + new Chart(ctx, { + type: "bar", + data: { + labels: [ yesterday, today, tommorrow ], + datasets: [ + { + label: "Booking Count", + data: [ yesterdayBookingCount, todayBookingCount, tommorrowBookingCount ], + backgroundColor: + [ "#4e5ded" ] + } + ] + }, + options: { + responsive: true, + scales: { + y: { + beginAtZero: true, + ticks: { + precision: 0 + } + } + } + } + }); + } + } + }, [ todayBookingCount,tommorrowBookingCount, yesterdayBookingCount ]); + + return ; + }; + + + return ( +
+
+ +
+ { "Welcome, " + session.user?.name.givenName + " " + session.user?.name.familyName + "!" } +
+
+ { "Simplify Your Practice, Focus on Exceptional Pet Care" } +
+
+ +
+
+ Booking Summary +
+
+
+ +
+
+
+ { bookingList? bookingList.length: 0 } +
+
+ Total Bookings +
+
+
+ +
+
+ Bookings Summary +
+
+ +
+
+
+
+ ); +} + +function filterAndCountBookingsByStatus(bookings: Booking[], types: string[]): { [key: string]: number } { + const filteredCounts: { [key: string]: number } = {}; + + types.forEach((type) => { + const filteredBookings = bookings.filter((booking) => booking.status.toLowerCase() === type); + + filteredCounts[type] = filteredBookings.length; + }); + + return filteredCounts; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForPetOwner.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForPetOwner.tsx new file mode 100644 index 000000000..fd8cbfd30 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/getStartedSectionForPetOwner.tsx @@ -0,0 +1,223 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import AccountCircleIcon from "@mui/icons-material/AccountCircle"; +import { Grid } from "@mui/material"; +import { getPets } from "apps/business-admin-app/APICalls/getPetList/get-pets"; +import { getBookings } from "apps/business-admin-app/APICalls/GetUserBookings/get-bookings"; +import { Booking } from "apps/business-admin-app/types/booking"; +import { Pet } from "apps/business-admin-app/types/pets"; +import Chart from "chart.js/auto"; +import { Session } from "next-auth"; +import { useRouter } from "next/router"; +import { useEffect, useRef, useState } from "react"; +import { Stack } from "rsuite"; +import styles from "../../../../styles/Home.module.css"; +import "chartjs-plugin-datalabels"; +import BookingCard from "../sectionsRelatedToBookings/bookingCard"; + +interface GetStartedSectionComponentForPetOwnerProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function GetStartedSectionComponentForPetOwner(props: GetStartedSectionComponentForPetOwnerProps) { + + const { session } = props; + const [ petList, setPetList ] = useState(null); + const typesToFilter: string[] = [ "dog", "cat", "rabbit" ]; + const [ filteredCount, setFilteredCount ] = useState<{ [key: string]: number }>({}); + const [ bookingList, setBookingList ] = useState(null); + const [ filteredBookings, setFilteredBookings ] = useState(null); + + async function getPetList() { + const accessToken = session.accessToken; + + getPets(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setPetList(res.data); + setFilteredCount(filterAndCountPetsByType(res.data, typesToFilter)); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + async function getBookingsList() { + const accessToken = session.accessToken; + + getBookings(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setBookingList(res.data); + setFilteredBookings(filterBookings(res.data)); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + useEffect(() => { + getPetList(); + getBookingsList(); + }, [ session ]); + + const DonutChart: React.FC = () => { + const chartRef = useRef(null); + + useEffect(() => { + if (chartRef.current) { + const ctx = chartRef.current.getContext("2d"); + + if (ctx) { + new Chart(ctx, { + type: "doughnut", + data: { + labels: [ "Dogs", "Cats", "Rabbits", "Others" ], + datasets: [ + { + data: [ filteredCount["dog"], + filteredCount["cat"], + filteredCount["rabbit"], + petList?.length- + (filteredCount["dog"]+ filteredCount["cat"]+filteredCount["rabbit"]) ], + backgroundColor: [ "#4e40ed", "#4e5ded", "#4e7eed", "#4e9bed" ] + } + ] + }, + options: { + plugins: { + legend: { + position: "right", + align: "center" + } + } + } + }); + } + } + }, []); + + return ; + }; + + + return ( +
+
+ +
+ { "Welcome, " + session.user?.name.givenName + " " + session.user?.name.familyName + "!" } +
+
+ { "Your Pet's Health and Happiness Made Easy" } +
+ +
+ +
+
+ Summary of pets +
+
+
+ +
+
+
+ { petList? petList.length: 0 } +
+
+ Total Pets +
+
+
+ +
+
+ Upcoming Bookings +
+ { filteredBookings?.length>0 ? ( +
+ + { filteredBookings && filteredBookings.map((booking) => ( + + + + )) } + +
+ ):( +
+ { "0 Upcoming bookings" } + +
+ ) } +
+
+
+ ); +} + +function filterAndCountPetsByType(pets: Pet[], types: string[]): { [key: string]: number } { + const filteredCounts: { [key: string]: number } = {}; + + types.forEach((type) => { + const filteredPets = pets.filter((pet) => pet.breed.toLowerCase() === type); + + filteredCounts[type] = filteredPets.length; + }); + + return filteredCounts; +} + +function filterBookings(bookings: Booking[]): Booking[] { + const today = new Date(); + let filteredBookings: Booking[] = []; + + filteredBookings = bookings.filter((booking) => { + const providedDate = new Date(booking.date); + + return providedDate > today; + }); + + return filteredBookings; +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/otherComponents/getStartedText.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/otherComponents/getStartedText.tsx new file mode 100644 index 000000000..62e65ca52 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/getStartedSection/otherComponents/getStartedText.tsx @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { LogoComponent } from "@pet-management-webapp/business-admin-app/ui/ui-components"; +import PagePreviousIcon from "@rsuite/icons/PagePrevious"; +import Image from "next/image"; +import { Button, Panel, Stack } from "rsuite"; +import getStartedWelcomeImage from + "../../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/getStartedWelcome.svg"; +import styles from "../../../../../styles/Settings.module.css"; + +export default function GetStartedText() { + return ( +
+ + + + + profile image + + +

Welcome to

+ +
+ +

+ Welcome to Pet Care – the ultimate companion for every pet owner! + Our app is designed with a deep understanding of the unique bond between you and + your furry friends. Whether you have a playful pup, a curious cat, or any other beloved pet, + Pet Care is here to simplify and enhance every aspect of pet ownership. +

+ + +

Select one of the settings to get started

+ +
+
+ +
+ +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/addPet.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/addPet.tsx new file mode 100644 index 000000000..8db6b5156 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/addPet.tsx @@ -0,0 +1,158 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { postPet } from "apps/business-admin-app/APICalls/CreatePet/post-pet"; +import { Pet, updatePetInfo } from "apps/business-admin-app/types/pets"; +import { AxiosResponse } from "axios"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Modal, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../styles/Settings.module.css"; + + +interface AddPetComponentProps { + session: Session + open: boolean + onClose: () => void +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a pet. + */ +export default function AddPetComponent(props: AddPetComponentProps) { + + const { session, open, onClose } = props; + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("Name", values.Name, errors); + errors = fieldValidate("Type", values.Type, errors); + errors = fieldValidate("DateOfBirth", values.DateOfBirth, errors); + + return errors; + }; + + + const onDataSubmit = (response: AxiosResponse, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Pet added to the organization successfully."); + form.restart(); + onClose(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the pet. Try again."); + } + }; + + const onSubmit = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + const payload: updatePetInfo = { + breed: values.Type, + dateOfBirth: values.DateOfBirth, + name: values.Name, + vaccinations: [] + }; + + postPet(session.accessToken, payload) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( + + + + + + + +
+ +
( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + +
+ + + +
+ ) } + /> + +
+
+ +
+ +
+
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/editPet.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/editPet.tsx new file mode 100644 index 000000000..032452b71 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/editPet.tsx @@ -0,0 +1,378 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } + from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { updatePet } from "apps/business-admin-app/APICalls/UpdatePet/update-pet"; +import { Pet, VaccineInfo, updatePetInfo } from "apps/business-admin-app/types/pets"; +import { Session } from "next-auth"; +import Image from "next/image"; +import { useEffect, useRef, useState } from "react"; +import { TailSpin } from "react-loader-spinner"; +import { Button, Message, Modal } from "rsuite"; +import FileUploadSingle from "./imageUploader"; +import PET_IMAGE from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; + + +interface EditPetComponentProps { + session: Session + isOpen: boolean; + setIsOpen: React.Dispatch>; + pet: Pet; + imageUrl: any; + setImageUrl: React.Dispatch>; + isImageNotFound: boolean; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to edit details of a pet. + */ +export default function EditPetComponent(props: EditPetComponentProps) { + + const { session, isOpen, setIsOpen, pet, imageUrl, setImageUrl, isImageNotFound } = props; + const [ name, setName ] = useState(""); + const [ type, setType ] = useState(""); + const [ DoB, setDoB ] = useState(""); + const [ vaccineName, setVaccineName ] = useState(""); + const [ lastVaccinationDate, setLastVaccinationDate ] = useState(""); + const [ nextVaccinationDate, setNextVaccinationDate ] = useState(""); + const dateInputRef = useRef(null); + const [ vaccineInfo, setVaccineInfo ] = useState(); + const [ message, setMessage ] = useState(null); + const [ lastDate, setLastDate ] = useState(null); + const [ nextDate, setNextDate ] = useState(null); + const [ isDisable, setIsDisable ] = useState(false); + const [ isChecked, setIsChecked ] = useState(false); + const [ isLoading, setIsLoading ] = useState(true); + + + useEffect(() => { + setVaccineInfo(pet?.vaccinations); + if (isImageNotFound) { + setIsLoading(false); + } + + if (imageUrl !== null) { + // Start loading + setIsLoading(true); + + // Simulate loading delay + const delay = 1600; + const timeout = setTimeout(() => { + // Finish loading + setIsLoading(false); + }, delay); + + // Cleanup function + return () => clearTimeout(timeout); + } + }, [ isOpen ]); + + + const handleSave = () => { + async function updatePets() { + const accessToken = session.accessToken; + const petName = (name) ? name : pet.name; + const petBreed = (type) ? type : pet.breed; + const petDoB = (DoB) ? DoB : pet.dateOfBirth; + const payload: updatePetInfo = { + breed: petBreed, + dateOfBirth: petDoB, + name: petName, + vaccinations: vaccineInfo + }; + const response = await updatePet(accessToken, pet.id, payload); + } + updatePets(); + setIsOpen(false); + }; + + + const closeEditPetDialog = (): void => { + setIsDisable(false); + setVaccineInfo([]); + setIsOpen(false); + setImageUrl(null); + setIsLoading(true); + }; + + const handleOnAdd = () => { + if (vaccineName && lastVaccinationDate && nextVaccinationDate) { + const info: VaccineInfo = { + enableAlerts: false, + lastVaccinationDate: lastVaccinationDate, + name: vaccineName, + nextVaccinationDate: nextVaccinationDate + }; + + setVaccineInfo(vaccineInfo => [ ...vaccineInfo, info ]); + setMessage(""); + setLastDate("mm/dd/yyyy"); + setNextDate("mm/dd/yyyy"); + + } + }; + + const handleRemoveVaccineDetail = (vaccine: VaccineInfo) => { + setVaccineInfo(oldValues => { + return oldValues.filter(value => value !== vaccine); + }); + }; + + function handleCheckboxChange(vaccine: VaccineInfo) { + setIsChecked(!isChecked); + vaccineInfo.map(item => { + if (item.name === vaccine.name) { + item.enableAlerts = !isChecked; + } + }); + } + + return ( + <> + + + + + + +
+
+ + + +

Name

+
+ +

Type

+
+ +

Date of Birth

+
+
+ + + setName(e.target.value) + } + /> + + setType(e.target.value) + } + /> + + setDoB(e.target.value) + } + /> + + +
+ +
+
+
+ Vaccination Information +
+
+ + Type the vaccine name, last vaccination date and next vaccination date respectively. + +
+ + { + setVaccineName(e.target.value); + setMessage(e.target.value); + } } + value={ message } + /> + { + setLastVaccinationDate(e.target.value); + setLastDate(e.target.value); + } } + value={ lastDate } + + /> + { + setNextVaccinationDate(e.target.value); + setNextDate(e.target.value); + } } + value={ nextDate } + /> + + +
+
+
+ + + + Vaccine Name + Last vaccination Date + Next Vaccination Date + Enable Alerts + Delete Record + + + + { vaccineInfo && vaccineInfo.length > 0 && vaccineInfo.map((vaccine) => ( + + { vaccine.name } + { vaccine.lastVaccinationDate } + { vaccine.nextVaccinationDate } + + + + + )) } + +
+
+
+
+

+
+ { isLoading ? ( + + ) : ( +
+ { imageUrl ? ( + pet-thumbnail + ) : ( + pet-thumbnail + + ) } +
+ + ) } +
+
+ Update Pet Image +
+ +
+
+ + + + +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/imageUploader.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/imageUploader.tsx new file mode 100644 index 000000000..7906e7417 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/imageUploader.tsx @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { getThumbnail } from "apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail"; +import { updateThumbnail } from "apps/business-admin-app/APICalls/UploadThumbnail/put-thumbnail"; +import { Session } from "next-auth"; +import { ChangeEvent, useRef, useState } from "react"; +import styles from "../../../../styles/doctor.module.css"; + + +interface FileUploadProps { + session: Session + petId: string; + imageUrl: any; + setImageUrl: React.Dispatch>; +} + +function FileUploadSingle(props: FileUploadProps) { + const { petId, imageUrl, setImageUrl, session } = props; + const [ file, setFile ] = useState(); + + const handleFileChange = (e: ChangeEvent) => { + if (e.target.files) { + setFile(e.target.files[0]); + } + }; + + const handleUploadClick = async () => { + if (!file) { + return; + } + + async function updateThumbnails() { + const accessToken = session.accessToken; + const formData = new FormData(); + + formData.append( + "file", + file + ); + const response = await updateThumbnail(accessToken, petId, formData); + + if (response.status === 200) { + const accessToken = await session.accessToken; + const response = await getThumbnail(accessToken, session.orgId, session.user.id, petId); + + if (response.data.size > 0) { + const imageUrl = URL.createObjectURL(response.data); + + setImageUrl(imageUrl); + } + } + } + updateThumbnails(); + }; + + const hiddenFileInput = useRef(null); + + const handleClick = () => { + hiddenFileInput.current.click(); + }; + + return ( + <>
+ + + +
+
+ +
+ ); +} + +export default FileUploadSingle; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petCard.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petCard.tsx new file mode 100644 index 000000000..da5ed43c8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petCard.tsx @@ -0,0 +1,106 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Card, CardContent } from "@mui/material"; +import { getThumbnail } from "apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail"; +import { Session } from "next-auth"; +import Image from "next/image"; +import React, { useEffect, useState } from "react"; +import { TailSpin } from "react-loader-spinner"; +import PET_IMAGE from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; + + +interface PetCardProps { + session: Session + petId: string; + petName: string; + breed: string; + isUpdateViewOpen: boolean; +} + +function PetCard(props: PetCardProps) { + const { session, petId, petName, breed, isUpdateViewOpen } = props; + const [ url, setUrl ] = useState(null); + const [ isLoading, setIsLoading ] = useState(true); + + async function getThumbnails() { + const accessToken = session.accessToken; + + getThumbnail(accessToken, session.orgId, session.user.id, petId) + .then((res) => { + if (res.data.size > 0) { + const imageUrl = URL.createObjectURL(res.data); + + setUrl(imageUrl); + } + }) + .catch((error) => { + // eslint-disable-next-line no-console + console.log("An error occurred:", error); + }) + .finally(() => { + setIsLoading(false); + }); + } + + useEffect(() => { + getThumbnails(); + setIsLoading(true); + }, [ location.pathname === "/user_pets", isUpdateViewOpen ]); + + return ( + + + { isLoading ? ( +
+ +
+ ) : ( + <> +
+ { url ? ( + pet-thumbnail + ) : ( + pet-thumbnail + ) } +
+
+ +
+ +
+
+ + ) } +
+
+ ); +} + +export default React.memo(PetCard); diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petOverview.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petOverview.tsx new file mode 100644 index 000000000..2b6d197af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petOverview.tsx @@ -0,0 +1,408 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Checkbox, Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } + from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { deletePet } from "apps/business-admin-app/APICalls/DeletePet/delete-pet"; +import { getMedicalReport } from "apps/business-admin-app/APICalls/GetMedicalReports/get-medical-reports"; +import { getThumbnail } from "apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail"; +import { MedicalReport, Pet } from "apps/business-admin-app/types/pets"; +import axios, { AxiosError } from "axios"; +import { Session } from "next-auth"; +import Image from "next/image"; +import { useEffect, useState } from "react"; +import { TailSpin } from "react-loader-spinner"; +import { Button, Modal } from "rsuite"; +import EditPetComponent from "./editPet"; +import PET_IMAGE from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; +import dateConverter from "../sectionsRelatedToBookings/dateConverter"; + + +interface PetOverviewProps { + session: Session + isOpen: boolean; + setIsOpen: React.Dispatch>; + isUpdateViewOpen: boolean; + setIsUpdateViewOpen: React.Dispatch>; + pet: Pet; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to display overview of a pet. + */ +export default function PetOverview(props: PetOverviewProps) { + + const { session, isOpen, setIsOpen, isUpdateViewOpen, setIsUpdateViewOpen, pet } = props; + const [ url, setUrl ] = useState(null); + const [ medicalReportList, setMedicalReportList ] = useState(null); + const [ isLoading, setIsLoading ] = useState(true); + const [ isImageNotFound, setIsImageNotFound ] = useState(false); + + async function getThumbnails() { + const accessToken = session.accessToken; + + if (pet) { + getThumbnail(accessToken, session.orgId, session.userId, pet?.id) + .then((res) => { + if (res.data.size > 0) { + const imageUrl = URL.createObjectURL(res.data); + + setIsImageNotFound(false); + setUrl(imageUrl); + } + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const axiosError = error as AxiosError; + + if (axiosError.response?.status === 404) { + // eslint-disable-next-line no-console + console.log("Resource not found"); + setIsImageNotFound(true); + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", axiosError.message); + } + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", error); + } + }) + .finally(() => { + setIsLoading(false); + }); + } + + + } + + useEffect(() => { + setUrl(null); + getThumbnails(); + getMedicalReportInfo(); + setIsLoading(true); + }, [ isOpen ]); + + const handleEdit = () => { + setIsOpen(false); + setIsUpdateViewOpen(true); + }; + + const closePetOverviewDialog = (): void => { + setIsOpen(false); + setUrl(null); + setIsLoading(true); + setIsImageNotFound(false); + }; + + + const handleDelete = () => { + async function deletePets() { + const accessToken = session.accessToken; + const response = await deletePet(accessToken, session.orgId, session.user.id, pet.id); + + setIsOpen(false); + } + deletePets(); + }; + + async function getMedicalReportInfo() { + const accessToken = session.accessToken; + + getMedicalReport(accessToken, pet?.id) + .then(async (res) => { + if (res.data instanceof Array) { + setMedicalReportList(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + + } + + + return ( + <> + + + + + + +
+
+ + + +

Name

+
+ +

Type

+
+ +

Date of Birth

+
+
+ + +

{ pet?.name }

+
+ +

{ pet?.breed }

+
+ +

{ pet?.dateOfBirth }

+
+
+
+ +
+
+
+
+ Vaccination Information +
+
+
+ { pet?.vaccinations.length > 0 ? ( +
+ + + + + Vaccine Name + + Last vaccination Date + + Next Vaccination Date + Enable Alerts + + + + { pet.vaccinations.map((vaccine) => ( + + + { vaccine.name } + + { vaccine.lastVaccinationDate } + + { vaccine.nextVaccinationDate } + + + + )) } + +
+
+
+ ) : ( +
+ Vaccination Details are not provided. +
+ ) } + +
+ +
+ Medical Reports +
+
+
+ { medicalReportList?.length > 0 ? ( + medicalReportList.map((medicalReport) => ( +
+ + + +

Diagnosis

+
+ +

Treatment

+
+ +

Created At

+
+
+ + +

+ { medicalReport.diagnosis?medicalReport.diagnosis:" - " }

+
+ +

+ { medicalReport.treatment?medicalReport.treatment:" - " }

+
+ +

+ { medicalReport.createdAt? + dateConverter(medicalReport.createdAt):" - " }

+
+
+
+
+ + + + + Drug Name + + Dosage + + Duration + + + + { medicalReport.medications.map((medicine) => ( + + + { medicine.drugName } + + { medicine.dosage } + + { medicine.duration } + + )) } + +
+
+
+
+ )) + ) : ( +
+ Medical Reports are not provided. +
+ ) } +
+
+ { isLoading ? ( +
+ +
+ ) : ( +
+ { url ? ( + pet-thumbnail + ) : ( + pet-thumbnail + + ) } +
+ ) } +
+
+ + + + +
+
+ +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petsPage.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petsPage.tsx new file mode 100644 index 000000000..b1835f369 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/petsPage.tsx @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid } from "@mui/material"; +import { getPets } from "apps/business-admin-app/APICalls/getPetList/get-pets"; +import { Pet } from "apps/business-admin-app/types/pets"; +import { Session } from "next-auth"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Button, Stack } from "rsuite"; +import AddPetComponent from "./addPet"; +import PetCard from "./petCard"; +import PetOverview from "./petOverview"; +import styles from "../../../../styles/doctor.module.css"; + +interface PetsSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function PetsSection(props: PetsSectionProps) { + + const { session } = props; + const router = useRouter(); + const[ isAddPetOpen, setIsAddPetOpen ] = useState(false); + const [ petList, setPetList ] = useState(null); + const [ isOverviewOpen, setIsOverviewOpen ] = useState(false); + const [ isUpdateViewOpen, setIsUpdateViewOpen ] = useState(false); + const [ pet, setPet ] = useState(null); + + async function getPetList() { + const accessToken = session.accessToken; + + getPets(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setPetList(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + const onAddPetClick = (): void => { + setIsAddPetOpen(true); + }; + + useEffect(() => { + getPetList(); + }, [ session, isAddPetOpen ]); + + useEffect(() => { + router.replace(router.asPath); + }, [ isUpdateViewOpen ]); + + const closeAddPetDialog = (): void => { + setIsAddPetOpen(false); + }; + + return ( +
+ + +

{ "Manage Pets" }

+

{ "Manage pets of the user" }

+
+ +
+
+ + { petList && petList.map((pet) => ( + { setIsOverviewOpen(true); setPet(pet); } }> + + + )) } + +
+
+ +
+
+ +
+ +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/settings.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/settings.tsx new file mode 100644 index 000000000..2682fae4a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsReatedToPetOwner/settings.tsx @@ -0,0 +1,144 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Switch } from "@mui/material"; +import { alpha, styled } from "@mui/material/styles"; +import { getNotification } from "apps/business-admin-app/APICalls/Notifications/get-notification"; +import { postNotification } from "apps/business-admin-app/APICalls/Notifications/post-notification"; +import { Notifications } from "apps/business-admin-app/types/pets"; +import { Session } from "next-auth"; +import { useEffect, useState } from "react"; +import { Stack } from "rsuite"; +import styles from "../../../../styles/doctor.module.css"; + +interface SettingsSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function SettingsSection(props: SettingsSectionProps) { + + const { session } = props; + const [ enabled, setEnabled ] = useState(false); + const [ email, setEmail ] = useState(""); + + const CustomSwitch = styled(Switch)(({ theme }) => ({ + "& .MuiSwitch-switchBase.Mui-checked": { + color: "var(--primary-color)", + "&:hover": { + backgroundColor: alpha("var(--primary-color)", theme.palette.action.hoverOpacity) + } + }, + "& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track": { + backgroundColor: "var(--primary-color)" + } + })); + + const getSettings = () => { + async function getNotifications() { + const accessToken = session.accessToken; + const response = await getNotification(accessToken, session.orgId, session.userId, session.user.emails[0]); + + if (response) { + setEnabled(response.data.notifications.enabled); + setEmail(response.data.notifications.emailAddress); + } + } + getNotifications(); + }; + + const toggleSwitch = () => { + setEnabled(!enabled); + }; + + useEffect(() => { + getSettings(); + }, [ session ]); + + const handleSave = () => { + async function setNotification() { + const accessToken = session.accessToken; + const payload: Notifications = { + notifications: { + enabled: enabled, + emailAddress: email + } + }; + const response = await postNotification(accessToken, session.orgId, session.user.id, payload); + } + setNotification(); + }; + + + return ( +
+ + +

{ "Settings" }

+

{ "Settings to enable notifications" }

+
+
+
+
+ Notifications +
+
+ + + + + + + + + + + + setEmail(e.target.value) } + /> + + +
+
+ +
+
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/addBooking.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/addBooking.tsx new file mode 100644 index 000000000..cc35220f2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/addBooking.tsx @@ -0,0 +1,333 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid } from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { postBooking } from "apps/business-admin-app/APICalls/CreateBooking/post-booking"; +import { BookingInfo } from "apps/business-admin-app/types/booking"; +import { Availability, Doctor } from "apps/business-admin-app/types/doctor"; +import { Pet } from "apps/business-admin-app/types/pets"; +import { Session } from "next-auth"; +import React, { useEffect, useState } from "react"; +import { Button, Loader, Modal, Radio, RadioGroup } from "rsuite"; +import styled from "styled-components"; +import PetCardInAddBooking from "./petCardInAddBooking"; +import convertTo12HourTime from "./timeConverter"; +import styles from "../../../../styles/booking.module.css"; +import { IdentityProviderConfigureType } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; + +interface buttonProps { + isDisabled: boolean; +} + +const ButtonABC = styled.button` +background-color: var(--primary-color); +color: #ffffff; +border: none; +width: 7vw; +height: 5vh; +border-radius: 5px; +font-size: 2vh; +color: ${props => props.isDisabled ? "#727372" : "#ffffff"}; +background-color: ${props => props.isDisabled ? "#cacccb" : "var(--primary-color)"}; +`; + +const CancelButton = styled.button` +background-color: #cacccb; +color: #727372; +border: none; +width: 7vw; +height: 5vh; +border-radius: 5px; +font-size: 2vh; +`; + +export interface AddBookingsProps { + session: Session + isOpen: boolean; + setIsOpen: React.Dispatch>; + doctor: Doctor; + petList: Pet[]; +} + +export default function AddBookings(props: AddBookingsProps) { + const { session, isOpen, setIsOpen, doctor, petList } = props; + const [ availability, setAvailability ] = useState(null); + const [ availabilityInfo, setAvailabilityInfo ] = useState(null); + const [ pet, setPet ] = useState(null); + const [ activeStep, setActiveStep ] = React.useState(0); + const [ mobileNumber, setMobileNumber ] = React.useState(""); + const [ petOwner, setPetOwner ] = React.useState(""); + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const steps = [ "Time Selection", "Pet Selection", "Users Info" ]; + const [ completed, setCompleted ] = React.useState<{ + [k: number]: boolean; + }>({}); + + function timeout(delay: number) { + return new Promise(res => setTimeout(res, delay)); + } + + const totalSteps = () => { + return steps.length; + }; + + const completedSteps = () => { + return Object.keys(completed).length; + }; + + const isLastStep = () => { + return activeStep === totalSteps() - 1; + }; + + const allStepsCompleted = () => { + return completedSteps() === totalSteps(); + }; + + + const handleClose = () => { + setIsOpen(false); + setActiveStep(0); + setAvailabilityInfo(null); + setPet(null); + }; + + useEffect(() => { + setAvailability(doctor?.availability); + + }, [ isOpen ]); + + const handleOnTimeSlotClick = (value: number) => { + setAvailabilityInfo(availability[value]); + }; + + const handleNext = () => { + if (activeStep === 0) { + if (availabilityInfo != null) { + const newActiveStep = + isLastStep() && !allStepsCompleted() + ? // It's the last step, but not all steps have been completed, + // find the first step that has been completed + steps.findIndex((step, i) => !(i in completed)) + : activeStep + 1; + + setActiveStep(newActiveStep); + + } + } else if (activeStep === 1) { + if (pet != null) { + const newActiveStep = + isLastStep() && !allStepsCompleted() + ? // It's the last step, but not all steps have been completed, + // find the first step that has been completed + steps.findIndex((step, i) => !(i in completed)) + : activeStep + 1; + + setActiveStep(newActiveStep); + } + } + }; + + const handleFinish = async () => { + async function addBooking() { + const accessToken = session.accessToken; + const payload: BookingInfo = { + date: availabilityInfo.date, + doctorId: doctor.id, + mobileNumber: mobileNumber, + petDoB: pet.dateOfBirth, + petId: pet.id, + petName: pet.name, + petOwnerName: petOwner, + petType: pet.breed, + sessionEndTime: availabilityInfo.timeSlots[0].endTime, + sessionStartTime: availabilityInfo.timeSlots[0].startTime + }; + + postBooking(accessToken, payload); + } + addBooking(); + await timeout(150); + setIsOpen(false); + setActiveStep(0); + setAvailabilityInfo(null); + setPet(null); + }; + + const handleDialogClose = () => { + setIsOpen(false); + }; + + return ( + + + + + + + +
+ +
+ { activeStep === 0 && ( + <>
+ Choose a time slot +
+ + + { availability && availability.map((availabilityInfo, index) => ( + + { availabilityInfo.date + " , " + + convertTo12HourTime(availabilityInfo.timeSlots[0].startTime) + " - " + + convertTo12HourTime(availabilityInfo.timeSlots[0].endTime) } + + )) } + + { availability?.length === 0 && ( +
+ Doctor is currently unavailable. +
+ ) } +
+ ) } + { activeStep === 1 && ( + <> +
+ Choose your pet +
+
+ + { petList && petList.map((pet) => ( + { e.preventDefault(); setPet(pet); } }> + + + )) } + +
+ + ) } + { activeStep === 2 && ( +
+
+
+ +
+ setMobileNumber(e.target.value) } + /> +
+
+ ) } +
+ +
+
+ + { activeStep === 0 && ( + <>
+ +
+ +
+ ) } + { activeStep === 1 && ( + <>
+ + Next + +
+ + Cancel + +
+ ) } + { activeStep === 2 && ( + <>
+ + Finish + +
+ + Cancel + +
+ ) } + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingCard.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingCard.tsx new file mode 100644 index 000000000..6176baede --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingCard.tsx @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import CalendarMonthIcon from "@mui/icons-material/CalendarMonth"; +import { Card, CardContent, Grid, Typography } from "@mui/material"; +import { Booking } from "apps/business-admin-app/types/booking"; +import React from "react"; +import convertTo12HourTime from "./timeConverter"; +import styles from "../../../../styles/booking.module.css"; + +interface BookingCardProps { + booking: Booking; + isBookingCardOpen: boolean; +} + +function BookingCard(props: BookingCardProps) { + const { booking, isBookingCardOpen } = props; + + + return ( + <> + + +
+ +
+
+ + + +

Appt. No.

+
+ +

Date

+
+ +

Start Time

+
+ +

Status

+
+
+ + +

{ booking.appointmentNumber }

+
+ +

{ booking.date }

+
+ +

+ { convertTo12HourTime(booking.sessionStartTime) }

+
+ +

+ { booking.status }

+
+
+
+
+
+
+ + ); + +} + +export default React.memo(BookingCard); diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingOverviewInPetOwner.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingOverviewInPetOwner.tsx new file mode 100644 index 000000000..e0ed30f73 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingOverviewInPetOwner.tsx @@ -0,0 +1,169 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import CalendarMonthIcon from "@mui/icons-material/CalendarMonth"; +import { Grid,Typography } from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { Booking } from "apps/business-admin-app/types/booking"; +import { Button, Modal } from "rsuite"; +import dateConverter from "./dateConverter"; +import styles from "../../../../styles/booking.module.css"; + + +interface BookingOverviewInPetOwnerViewProps { + isOpen: boolean; + setIsOpen: React.Dispatch>; + booking: Booking; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to display overview of a pet. + */ +export default function BookingOverviewInPetOwnerView(props: BookingOverviewInPetOwnerViewProps) { + + const { isOpen, setIsOpen, booking } = props; + + const closeBookingOverviewDialog = (): void => { + setIsOpen(false); + }; + + return ( + <> + + + + + + +
+
+ + + +

Appointment Number

+
+ +

Date

+
+ { booking?.mobileNumber && ( + +

Mobile Number

+
+ ) } + +

{ "Pet's Date of Birth" }

+
+ +

Pet Name

+
+ +

Pet Owner Name

+
+ +

Pet Type

+
+ +

Session Start Time

+
+ +

Session End Time

+
+ +

Status

+
+ +

Created At

+
+ +

Email Address

+
+
+ + +

{ booking?.appointmentNumber }

+
+ +

{ booking?.date }

+
+ { booking?.mobileNumber && ( + +

{ booking?.mobileNumber }

+
+ ) } + +

{ booking?.petDoB }

+
+ +

{ booking?.petName }

+
+ { booking?.petOwnerName === ""? ( + +

{ " - " }

+
+ + ):( + +

{ booking?.petOwnerName }

+
+ ) } + +

{ booking?.petType }

+
+ +

{ booking?.sessionStartTime }

+
+ +

{ booking?.sessionEndTime }

+
+ +

{ booking?.status }

+
+ +

+ { dateConverter(booking?.createdAt) }

+
+ +

{ booking?.emailAddress }

+
+
+
+
+
+ +
+
+
+ + + +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingsInPetOwnerView.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingsInPetOwnerView.tsx new file mode 100644 index 000000000..63b71cfe0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/bookingsInPetOwnerView.tsx @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid } from "@mui/material"; +import { getBookings } from "apps/business-admin-app/APICalls/GetUserBookings/get-bookings"; +import { Booking } from "apps/business-admin-app/types/booking"; +import { Session } from "next-auth"; +import { useEffect, useState } from "react"; +import { Stack } from "rsuite"; +import BookingCard from "./bookingCard"; +import BookingOverviewInPetOwnerView from "./bookingOverviewInPetOwner"; +import styles from "../../../../styles/doctor.module.css"; + +interface BookingsInPetOwnerSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function BookingsInPetOwnerSection(props: BookingsInPetOwnerSectionProps) { + + const { session } = props; + const [ bookingList, setBookingList ] = useState(null); + const [ isBookingCardOpen, setIsBookingCardOpen ] = useState(false); + const [ booking, setBooking ] = useState(null); + + + async function getBookingsList() { + const accessToken = session.accessToken; + + getBookings(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setBookingList(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + + useEffect(() => { + getBookingsList(); + }, [ session ]); + + + return ( +
+ + +

{ "Available Bookings" }

+

{ "Available bookings for your pet" }

+
+
+
+ + { bookingList && bookingList.map((booking) => ( + { setBooking(booking); setIsBookingCardOpen(true); } }> + + + )) } + +
+
+ < BookingOverviewInPetOwnerView + isOpen={ isBookingCardOpen } + setIsOpen={ setIsBookingCardOpen } + booking={ booking } /> +
+ +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/channelDocSection.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/channelDocSection.tsx new file mode 100644 index 000000000..a2d7317ae --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/channelDocSection.tsx @@ -0,0 +1,129 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid } from "@mui/material"; +import { getDoctors } from "apps/business-admin-app/APICalls/getDoctors/get-doctors"; +import { getPets } from "apps/business-admin-app/APICalls/getPetList/get-pets"; +import { Doctor } from "apps/business-admin-app/types/doctor"; +import { Pet } from "apps/business-admin-app/types/pets"; +import { Session } from "next-auth"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Stack } from "rsuite"; +import AddBookings from "./addBooking"; +import styles from "../../../../styles/doctor.module.css"; +import DoctorCard from "../sectionsRelatedToDoctor/doctorCard"; + +interface ChannelDoctorSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function ChannelDoctorSection(props: ChannelDoctorSectionProps) { + + const { session } = props; + const [ doctorList, setDoctorList ] = useState(null); + const [ isAddDoctorOpen, setIsAddDoctorOpen ] = useState(false); + const [ doctor, setDoctor ] = useState(null); + const [ isDoctorEditOpen, setIsDoctorEditOpen ] = useState(false); + const [ isAddBookingOpen, setIsAddBookingOpen ] = useState(false); + const [ petList, setPetList ] = useState(null); + const router = useRouter(); + + + async function getDoctorList() { + const accessToken = session.accessToken; + + getDoctors(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setDoctorList(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + async function getPetList() { + const accessToken = session.accessToken; + + getPets(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setPetList(res.data); + } + }) + .catch((e) => { + console.log(e); + }); + } + + useEffect(() => { + getDoctorList(); + getPetList(); + }, [ session, isAddDoctorOpen, isDoctorEditOpen ]); + + useEffect(() => { + router.replace(router.asPath); + }, [ isDoctorEditOpen ]); + + return ( +
+ + +

{ "Channel Doctor" }

+

{ "Choose a doctor to channel" }

+
+
+
+ + { doctorList && doctorList.map((doctor) => ( + { setDoctor(doctor); setIsAddBookingOpen(true); } }> + + + )) } + +
+
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/dateConverter.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/dateConverter.ts new file mode 100644 index 000000000..547a2e6f1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/dateConverter.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export default function dateConverter(isoDateString: string): string { + const date = new Date(isoDateString); + const localDateString = date.toLocaleDateString(); + + return localDateString; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/petCardInAddBooking.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/petCardInAddBooking.tsx new file mode 100644 index 000000000..d8191f745 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/petCardInAddBooking.tsx @@ -0,0 +1,106 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getThumbnail } from "apps/business-admin-app/APICalls/GetThumbnail/get-thumbnail"; +import axios, { AxiosError } from "axios"; +import { Session } from "next-auth"; +import Image from "next/image"; +import React, { useEffect, useState } from "react"; +import PET_IMAGE from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png"; +import styles from "../../../../styles/booking.module.css"; + + +interface PetCardProps { + session: Session + petId: string; + petName: string; + breed: string; + isUpdateViewOpen: boolean; +} + +function PetCardInAddBooking(props: PetCardProps) { + const { session, petId, petName, breed, isUpdateViewOpen } = props; + const [ url, setUrl ] = useState(null); + + async function getThumbnails() { + const accessToken = session.accessToken; + + getThumbnail(accessToken, session.orgId, session.userId, petId) + .then((res) => { + if (res.data.size > 0) { + const imageUrl = URL.createObjectURL(res.data); + + setUrl(imageUrl); + } + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const axiosError = error as AxiosError; + + if (axiosError.response?.status === 404) { + // eslint-disable-next-line no-console + console.log("Resource not found"); + // Handle the 404 error here + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", axiosError.message); + // Handle other types of errors + } + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", error); + // Handle other types of errors + } + }); + } + + useEffect(() => { + getThumbnails(); + }, [ session, isUpdateViewOpen ]); + + return petName ? ( + + ) : null; + +} + +export default React.memo(PetCardInAddBooking); diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/timeConverter.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/timeConverter.ts new file mode 100644 index 000000000..12bfadc7b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToBookings/timeConverter.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default function convertTo12HourTime(cssTime: string): string { + // Split the CSS time into hours and minutes + if(cssTime) { + const [ hours, minutes ] = cssTime.split(":"); + + // Create a new Date object and set the hours and minutes + const date = new Date(); + + date.setHours(Number(hours)); + date.setMinutes(Number(minutes)); + + // Format the time using the 12-hour clock format + const formattedTime = date.toLocaleString("en-US", { + hour: "numeric", + minute: "numeric", + hour12: true + }); + + return formattedTime; + } + + return (""); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/addDoctorComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/addDoctorComponent.tsx new file mode 100644 index 000000000..59b1886cb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/addDoctorComponent.tsx @@ -0,0 +1,214 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { postDoctor } from "apps/business-admin-app/APICalls/CreateDoctor/post-doc"; +import { Doctor, DoctorInfo } from "apps/business-admin-app/types/doctor"; +import { AxiosResponse } from "axios"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Divider, Loader, Modal, SelectPicker, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../styles/Settings.module.css"; + + +interface AddDoctorComponentProps { + session: Session + open: boolean + onClose: () => void +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a doctor. + */ +export default function AddDoctorComponent(props: AddDoctorComponentProps) { + + const { session, open, onClose } = props; + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const toaster = useToaster(); + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("Name", values.Name, errors); + errors = fieldValidate("RegistrationNumber", values.RegistrationNumber, errors); + errors = fieldValidate("email", values.email, errors); + errors = fieldValidate("DateOfBirth", values.DateOfBirth, errors); + errors = fieldValidate("Gender", values.Gender, errors); + errors = fieldValidate("Specialty", values.Specialty, errors); + errors = fieldValidate("Address", values.Address, errors); + + return errors; + }; + + + const onDataSubmit = (response: AxiosResponse, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Doctor add to the organization successfully."); + form.restart(); + onClose(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the doctor. Try again."); + } + }; + + const onSubmit = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + const payload: DoctorInfo = { + address: values.Address, + availability: [], + dateOfBirth: values.DateOfBirth, + emailAddress: values.email, + gender: values.Gender, + name: values.Name, + registrationNumber: values.RegistrationNumber, + specialty: values.Specialty + }; + + postDoctor(session.accessToken, payload) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + const options = [ + { value: "male", label: "Male" }, + { value: "female", label: "Female" } + ]; + + return ( + + + + + + + +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + + + + + + + + + { /* */ } + + + + + + + + + + + + +
+ + + +
+ ) } + /> + +
+
+ +
+ +
+
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/addMedicalReport.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/addMedicalReport.tsx new file mode 100644 index 000000000..c6d498056 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/addMedicalReport.tsx @@ -0,0 +1,277 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Table, TableBody, TableCell, TableHead, TableRow } from "@mui/material"; +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { postMedicalReport } from "apps/business-admin-app/APICalls/CreateMedicalReport/post-medical-report"; +import { Medicine, Pet, UpdateMedicalReport } from "apps/business-admin-app/types/pets"; +import { AxiosResponse } from "axios"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Modal, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../styles/doctor.module.css"; + + +interface AddMedicalReportComponentProps { + token: string; + petId: string; + open: boolean; + setIsOpen: React.Dispatch>; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a pet. + */ +export default function AddMedicalReportComponent(props: AddMedicalReportComponentProps) { + + const { token, petId, open, setIsOpen } = props; + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ dosage, setDosage ] = useState(""); + const [ drugName, setDrugName ] = useState(""); + const [ duration, setDuration ] = useState(""); + const [ medicineList, setMedicineList ] = useState([]); + + const toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("Diagnosis", values.Diagnosis, errors); + errors = fieldValidate("Treatment", values.Treatment, errors); + + return errors; + }; + + + const onDataSubmit = (response: AxiosResponse, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Report added successfully."); + form.restart(); + setIsOpen(false); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the report. Try again."); + } + }; + + const onSubmit = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + const payload: UpdateMedicalReport = { + diagnosis: values.Diagnosis, + medications: medicineList, + treatment: values.Treatment + }; + + postMedicalReport(token, petId, payload) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + + setMedicineList([]); + }; + + const handleOnAdd = () => { + if (drugName && dosage && duration) { + const info: Medicine = { + drugName: drugName, + dosage: dosage, + duration: duration + }; + + setMedicineList(medicineList => [ ...medicineList, info ]); + setDrugName(""); + setDosage(""); + setDuration(""); + } + }; + + const handleRemoveMedicineDetail = (medicine: Medicine) => { + setMedicineList(oldValues => { + return oldValues.filter(value => value !== medicine); + }); + }; + + const closeAddMedicalReportDialog = (): void => { + setIsOpen(false); + setMedicineList([]); + }; + + return ( + + + + + + + +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + +
+ Medications +
+
+ { + setDrugName(e.target.value); + } } + value={ drugName } + /> + { + setDosage(e.target.value); + } } + value={ dosage } + /> + { + setDuration(e.target.value); + } } + value={ duration } + /> + +
+ { medicineList.length > 0 && ( +
+
+ + + + Drug Name + Dosage + Duration + + Delete Record + + + + { medicineList && + medicineList.length > 0 && + medicineList.map((medicine) => ( + + + { medicine.drugName } + + { medicine.dosage } + + { medicine.duration } + + + + )) } + +
+
+
+ ) } + +
+ + + +
+ ) } + /> + +
+
+ +
+ +
+
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorBookings.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorBookings.tsx new file mode 100644 index 000000000..7f7235dd4 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorBookings.tsx @@ -0,0 +1,186 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { Grid } from "@mui/material"; +import { LocalizationProvider } from "@mui/x-date-pickers"; +import { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns"; +import { DatePicker } from "@mui/x-date-pickers/DatePicker"; +import { getDoctorBookingsPerDay } from "apps/business-admin-app/APICalls/GebookingsPerDay/get-bookings-per-day"; +import { getDoctorBookings } from "apps/business-admin-app/APICalls/GetDoctorBookings/get-doc-bookings"; +import { getProfile } from "apps/business-admin-app/APICalls/GetProfileInfo/me"; +import { Booking } from "apps/business-admin-app/types/booking"; +import { Doctor } from "apps/business-admin-app/types/doctor"; +import { format } from "date-fns"; +import { Session } from "next-auth"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Stack } from "rsuite"; +import styles from "../../../../styles/doctor.module.css"; +import BookingCard from "../sectionsRelatedToBookings/bookingCard"; + +interface DoctorBookingsSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The doctor bookings section. + */ +export default function DoctorBookingsSection(props: DoctorBookingsSectionProps) { + + const { session } = props; + const [ isBookingOverviewOpen, setIsBookingOverviewOpen ] = useState(false); + const [ bookingList, setBookingList ] = useState(null); + const [ bookingListPerDay, setBookingListPerDay ] = useState(null); + const [ booking, setBooking ] = useState(null); + const[ doctor, setDoctor ] = useState(null); + const router = useRouter(); + const [ selectedDate, setSelectedDate ] = useState(new Date()); + const [ stringDate, setStringDate ] = useState(""); + + + async function getBookings() { + const accessToken = session?.accessToken; + + getProfile(accessToken) + .then(async (res) => { + if (res.data) { + setDoctor(res.data); + } + const response = await getDoctorBookings(accessToken, res.data.id); + + if (response.data instanceof Array) { + setBookingList(response.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + const getFormattedDate = (date: Date): string => { + const formattedDate = format(date, 'yyyy-MM-dd'); + + return formattedDate; + }; + + useEffect(() =>{ + getBookings(); + }, [ session ]); + + useEffect(() =>{ + getBookingsPerDay(getFormattedDate(new Date())); + }, [ doctor?.id ]); + + async function getBookingsPerDay(date: string) { + const accessToken = session?.accessToken; + + getDoctorBookingsPerDay(accessToken, doctor?.id, date ) + .then(async (response) => { + if (response.data instanceof Array) { + setBookingListPerDay(response.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + + + const handleClick = (booking: Booking) => { + router.push({ + pathname: "/bookingDetails", + query: { + appointmentNumber: booking.appointmentNumber, + date: booking.date, + doctorId: booking.doctorId, + emailAddress: booking.emailAddress, + id: booking.id, + mobileNumber: booking.mobileNumber, + orgId: session.orgId, + petId: booking.petId, + petOwnerName: booking.petOwnerName, + sessionEndTime: booking.sessionEndTime, + sessionStartTime: booking.sessionStartTime, + status: booking.status, + token: session?.accessToken + } + }); + }; + + const DatePickerComponent: React.FC = () => { + + const handleDateChange = (date: Date | null) => { + setSelectedDate(date); + const formattedDate = getFormattedDate(date); + + setStringDate(formattedDate); + getBookingsPerDay(formattedDate); + }; + + return ( + + handleDateChange(date) } + /> + + ); + }; + + return ( +
+ + +

{ "Bookings" }

+

{ "Available Bookings for the doctor" }

+
+
+
+ +

+ + { bookingListPerDay && bookingListPerDay.map((booking) => ( + { + setIsBookingOverviewOpen(true); + setBooking(booking); + handleClick(booking);} }> + + + )) } + +
+
+ ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorCard.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorCard.tsx new file mode 100644 index 000000000..b56e4692d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorCard.tsx @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Card, CardContent } from "@mui/material"; +import axios, { AxiosError } from "axios"; +import { Session } from "next-auth"; +import Image from "next/image"; +import React, { useEffect } from "react"; +import { TailSpin } from "react-loader-spinner"; +// eslint-disable-next-line max-len +import female_doc_thumbnail from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png"; +// eslint-disable-next-line max-len +import male_doc_thumbnail from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png"; +import { getDocThumbnail } from "../../../../APICalls/GetDocThumbnail/get-doc-thumbnail"; +import styles from "../../../../styles/doctor.module.css"; +import { Doctor } from "../../../../types/doctor"; + +interface DoctorCardProps { + session: Session; + doctor: Doctor; + isDoctorEditOpen: boolean; +} + +function DoctorCard(props: DoctorCardProps) { + const { doctor, isDoctorEditOpen, session } = props; + const [ url, setUrl ] = React.useState(""); + const [ isLoading, setIsLoading ] = React.useState(true); + + async function getThumbnails() { + const accessToken = session.accessToken; + + if (doctor) { + getDocThumbnail(accessToken, doctor.id) + .then((res) => { + if (res.data.size > 0) { + const imageUrl = URL.createObjectURL(res.data); + + setUrl(imageUrl); + } + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const axiosError = error as AxiosError; + + if (axiosError.response?.status === 404) { + // eslint-disable-next-line no-console + console.log("Resource not found"); + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", axiosError.message); + } + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", error); + } + }) + .finally(() => { + setIsLoading(false); + }); + } + } + + useEffect(() => { + setUrl(null); + setIsLoading(true); + getThumbnails(); + }, [ location.pathname === "/manage_doctors", isDoctorEditOpen ]); + + return ( + <> + + + { isLoading ? ( +
+ +
+ ) : ( + <>
+ { url ? ( + doc-thumbnail + ) : ( + doc-thumbnail + + ) } +
+ +
+ +
+
+ + ) } +
+
+ + ); + +} + +export default React.memo(DoctorCard); diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorOverview.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorOverview.tsx new file mode 100644 index 000000000..cade5aaa5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorOverview.tsx @@ -0,0 +1,328 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } + from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { getDocThumbnail } from "apps/business-admin-app/APICalls/GetDocThumbnail/get-doc-thumbnail"; +import { Availability, Doctor } from "apps/business-admin-app/types/doctor"; +import axios, { AxiosError } from "axios"; +import { Session } from "next-auth"; +import Image from "next/image"; +import { useEffect, useState } from "react"; +import { TailSpin } from "react-loader-spinner"; +import { Button, Modal } from "rsuite"; +import EditDoctor from "./editDoctor"; +import female_doc_thumbnail + from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png"; +import male_doc_thumbnail + from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; +import convertTo12HourTime from "../sectionsRelatedToBookings/timeConverter"; + + +interface DoctorOverviewProps { + session: Session + isOpen: boolean; + setIsOpen: React.Dispatch>; + doctor: Doctor; + isDoctorEditOpen: boolean; + setIsDoctorEditOpen: React.Dispatch>; + onClose: () => void +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a doctor. + */ +export default function DoctorOverview(props: DoctorOverviewProps) { + + const { session, isOpen, setIsOpen, doctor, isDoctorEditOpen, setIsDoctorEditOpen, onClose } = props; + const [ stringDate, setStringDate ] = useState(""); + const [ url, setUrl ] = useState(""); + const [ availabilityInfo, setAvailabilityInfo ] = useState([]); + const [ isLoading, setIsLoading ] = useState(true); + const [ isImageNotFound, setIsImageNotFound ] = useState(false); + + async function getThumbnails() { + const accessToken = session.accessToken; + + if (doctor) { + getDocThumbnail(accessToken, doctor.id) + .then((res) => { + if (res.data.size > 0) { + const imageUrl = URL.createObjectURL(res.data); + + setIsImageNotFound(false); + setUrl(imageUrl); + } + }) + .catch((error) => { + if (axios.isAxiosError(error)) { + const axiosError = error as AxiosError; + + if (axiosError.response?.status === 404) { + // eslint-disable-next-line no-console + console.log("Resource not found"); + setIsImageNotFound(true); + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", axiosError.message); + } + } else { + // eslint-disable-next-line no-console + console.log("An error occurred:", error); + } + }) + .finally(() => { + setIsLoading(false); + }); + } + + + } + + useEffect(() => { + setUrl (""); + setIsLoading(true); + getThumbnails(); + if(doctor && doctor.createdAt != "") { + const isoString = doctor.createdAt; + const date = new Date(isoString); + const stringDate = date.toLocaleString(); + + setStringDate(stringDate); + } + }, [ isOpen ]); + + const handleEdit = () => { + setIsOpen(false); + setIsDoctorEditOpen(true); + if (doctor.availability.length > 0) { + setAvailabilityInfo(doctor.availability); + } + }; + + + + return ( + <> + + + + + + +
+
+ + + +

Name

+
+ +

Registration Number

+
+ +

Specialty

+
+ +

Email Address

+
+ +

Gender

+
+ +

Date of Birth

+
+ +

Address

+
+ +

Created At

+
+
+ + +

{ doctor?.name }

+
+ +

{ doctor?.registrationNumber }

+
+ +

+ { doctor?.specialty ? doctor.specialty : "N/A" } +

+
+ +

{ doctor?.emailAddress }

+
+ +

+ { doctor?.gender ? doctor.gender : "N/A" } +

+
+ +

+ { doctor?.dateOfBirth ? doctor.dateOfBirth : "N/A" } +

+
+ +

+ { doctor?.address ? doctor.address : "N/A" } +

+
+ +

{ stringDate }

+
+
+
+
+
+
+ Availability Information +
+
+
+ { doctor?.availability.length > 0 ? ( +
+ + + + + Date + + Start Time + + End Time + Booking Count + + + + { doctor.availability.map((availability) => ( + + + { availability.date } + + { convertTo12HourTime(availability.timeSlots[0].startTime) } + + + { convertTo12HourTime(availability.timeSlots[0].endTime) } + + + { availability.timeSlots[0].availableBookingCount } + + )) } + +
+
+
+ ) : ( +
+ Your availability information is not provided. +
+ ) } +
+

+ { isLoading ? ( +
+ +
+ ) : ( +
+ { url ? ( + doc-thumbnail + ) : ( + doc-thumbnail + + ) } +
+ ) } +
+
+ + + + +
+
+ +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorProfile.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorProfile.tsx new file mode 100644 index 000000000..15cad337e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/doctorProfile.tsx @@ -0,0 +1,211 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Typography } from "@mui/material"; +import { getDocThumbnail } from "apps/business-admin-app/APICalls/GetDocThumbnail/get-doc-thumbnail"; +import { getProfile } from "apps/business-admin-app/APICalls/GetProfileInfo/me"; +import { Availability, Doctor } from "apps/business-admin-app/types/doctor"; +import { Session } from "next-auth"; +import Image from "next/image"; +import { useEffect, useState } from "react"; +import { Button, Stack } from "rsuite"; +import EditDoctorProfile from "./editDoctorProfile"; +import female_doc_thumbnail + from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png"; +import male_doc_thumbnail + from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; + + +interface DoctorProfileSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function DoctorProfileSection(props: DoctorProfileSectionProps) { + + const { session } = props; + const [ doctor, setDoctor ] = useState(null); + const [ url, setUrl ] = useState(""); + const [ isEditProfileOpen, setIsEditProfileOpen ] = useState(false); + const [ availabilityInfo, setAvailabilityInfo ] = useState([]); + const [ stringDate, setStringDate ] = useState(""); + + async function getProfileInfo() { + const accessToken = session.accessToken; + + getProfile(accessToken) + .then(async (res) => { + if (res.data) { + setDoctor(res.data); + const date = new Date(res.data.createdAt); + const stringDate = date.toLocaleString(); + + setStringDate(stringDate); + } + const response = await getDocThumbnail(accessToken, res.data.id); + + if (response.data.size > 0) { + const imageUrl = URL.createObjectURL(response.data); + + setUrl(imageUrl); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + // TODO: handle error + }); + } + + useEffect(() => { + getProfileInfo(); + }, [ session, isEditProfileOpen ]); + + const onEditProfileClick = (): void => { + setIsEditProfileOpen(true); + if(doctor?.availability) { + setAvailabilityInfo(doctor?.availability); + } else { + setAvailabilityInfo([]); + } + }; + + return ( + <>
+ + +

{ "Profile" }

+

{ "Profile Information of the doctor" }

+
+ +
+ { doctor && ( + <> +
+ { url ? ( + doc-thumbnail + ) : ( + doc-thumbnail + + ) } +
+
+ + + +

Name

+
+ +

Registration Number

+
+ +

Specialty

+
+ +

Email Address

+
+ +

Gender

+
+ +

Date of Birth

+
+ +

Address

+
+ +

Created At

+
+
+ + +

{ doctor?.name }

+
+ +

{ doctor?.registrationNumber }

+
+ +

+ { doctor?.specialty? doctor.specialty : "N/A" } +

+
+ +

{ doctor?.emailAddress }

+
+ +

+ { doctor?.gender? doctor.gender : "N/A" } +

+
+ +

+ { doctor?.dateOfBirth? doctor.dateOfBirth : "N/A" } +

+
+ +

+ { doctor?.address? doctor.address : "N/A" } +

+
+ +

{ stringDate }

+
+
+
+
+ + ) } + + +
+ +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/editDoctor.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/editDoctor.tsx new file mode 100644 index 000000000..0d728a5a4 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/editDoctor.tsx @@ -0,0 +1,489 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } + from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { putDoctor } from "apps/business-admin-app/APICalls/UpdateDoctor/put-doc"; +import { Availability, Doctor, DoctorInfo } from "apps/business-admin-app/types/doctor"; +import { Session } from "next-auth"; +import Image from "next/image"; +import { useEffect, useRef, useState } from "react"; +import { TailSpin } from "react-loader-spinner"; +import { Button, Message, Modal } from "rsuite"; +import FileUploadSingle from "./imageUploader"; +// eslint-disable-next-line max-len +import female_doc_thumbnail from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png"; +// eslint-disable-next-line max-len +import male_doc_thumbnail from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; +import convertTo12HourTime from "../sectionsRelatedToBookings/timeConverter"; + + +interface EditDoctorProps { + session: Session + isOpen: boolean; + setIsOpen: React.Dispatch>; + doctor: Doctor; + availabilityInfo: Availability[]; + setAvailabilityInfo: React.Dispatch>; + url: string; + setUrl: React.Dispatch>; + isImageNotFound: boolean; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a doctor. + */ +export default function EditDoctor(props: EditDoctorProps) { + + const { session, isOpen, setIsOpen, doctor, availabilityInfo, + setAvailabilityInfo, url, setUrl, isImageNotFound } = props; + const [ stringDate, setStringDate ] = useState(""); + const [ name, setName ] = useState(""); + const [ registrationNo, setRegistrationNo ] = useState(""); + const [ specialty, setSpecialty ] = useState(""); + const [ email, setEmail ] = useState(""); + const [ gender, setGender ] = useState(""); + const [ DoB, setDoB ] = useState(""); + const dateInputRef = useRef(null); + const [ address, setAddress ] = useState(""); + const [ availableDate, setAvailableDate ] = useState(""); + const [ startTime, setStartTime ] = useState(""); + const [ endTime, setEndTime ] = useState(""); + const [ bookingCount, setBookingCount ] = useState(0); + const [ isLoading, setIsLoading ] = useState(true); + + const closeEditDoctorDialog = (): void => { + setIsOpen(false); + setUrl(""); + }; + + useEffect(() => { + if(doctor && doctor.createdAt != "") { + const isoString = doctor.createdAt; + const date = new Date(isoString); + const stringDate = date.toLocaleString(); + + setStringDate(stringDate); + } + if (isImageNotFound) { + setIsLoading(false); + } + + if (url !== null && url !== "") { + // Start loading + setIsLoading(true); + + // Simulate loading delay + const delay = 1600; + const timeout = setTimeout(() => { + // Finish loading + setIsLoading(false); + }, delay); + + // Cleanup function + return () => clearTimeout(timeout); + } + }, [ isOpen ]); + + const handleOnAdd = () => { + if (availableDate && startTime && endTime && bookingCount) { + const info: Availability = { + date: availableDate, + timeSlots: [ + { + availableBookingCount: bookingCount, + endTime: endTime, + startTime: startTime + + } + ] + }; + + setAvailabilityInfo(availabilityInfo => [ ...availabilityInfo, info ]); + setAvailableDate(""); + setStartTime(""); + setEndTime(""); + setBookingCount(0); + } + }; + + const handleRemoveAvailabilityDetail = (availability: Availability) => { + setAvailabilityInfo(oldValues => { + return oldValues.filter(value => value !== availability); + }); + }; + + const handleSave = () => { + async function updateDoctor() { + const accessToken = session.accessToken; + const docName = (name) ? name : doctor.name; + const docAddress = (address) ? address : doctor.address; + const docDoB = (DoB) ? DoB : doctor.dateOfBirth; + const docEmail = (email) ? email : doctor.emailAddress; + const docGender = (gender) ? gender : doctor.gender; + const docRegistrationNo = (registrationNo) ? registrationNo : doctor.registrationNumber; + const docSpecialty = (specialty) ? specialty : doctor.specialty; + + const payload: DoctorInfo = { + address: docAddress, + availability: availabilityInfo, + dateOfBirth: docDoB, + emailAddress: docEmail, + gender: docGender, + name: docName, + registrationNumber: docRegistrationNo, + specialty: docSpecialty + }; + + putDoctor(accessToken, doctor.id, payload); + } + updateDoctor(); + setAvailabilityInfo([]); + setIsOpen(false); + }; + + return ( + + + + + + + +
+
+ + + +

Name

+
+ +

Registration Number

+
+ +

Specialty

+
+ +

Email Address

+
+ +

Gender

+
+ +

Date of Birth

+
+ +

Address

+
+ +

Created At

+
+
+ + + setName(e.target.value) + } + /> + + setRegistrationNo(e.target.value) + } + /> + + setSpecialty(e.target.value) + } + /> + + setEmail(e.target.value) + } + /> + + setGender(e.target.value) + } + /> + setDoB(e.target.value) } + /> + + setAddress(e.target.value) + } + /> + + +
+ +
+
+
+ Availability Information +
+

+ + Choose an available date, start time, end time and booking count respectively. + +
+ { + setAvailableDate(e.target.value); + } } + value={ availableDate } + /> + { + setStartTime(e.target.value); + } } + value={ startTime } + /> + { + setEndTime(e.target.value); + } } + value={ endTime } + /> + + { + setBookingCount(e.target.valueAsNumber); + } } + value={ bookingCount } + /> + + +
+
+ { availabilityInfo.length > 0 && ( +
+
+ + + + Available Date + Start Time + End Time + Booking Count + Delete Record + + + + { availabilityInfo && availabilityInfo.length > 0 + && availabilityInfo.map((availability) => ( + + + { availability.date } + + { convertTo12HourTime(availability.timeSlots[0].startTime) } + + + { convertTo12HourTime(availability.timeSlots[0].endTime) } + + + { availability.timeSlots[0].availableBookingCount } + + + + )) } + +
+
+
+
+ ) } +
+ { isLoading ? ( +
+ +
+ ) : ( +
+ { url? ( + doc-thumbnail + ): ( + doc-thumbnail + + ) } +
+ ) } +
+ Update Doctor Image +
+ +
+
+ + + + +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/editDoctorProfile.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/editDoctorProfile.tsx new file mode 100644 index 000000000..d30f294b9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/editDoctorProfile.tsx @@ -0,0 +1,448 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } + from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { putDoctor } from "apps/business-admin-app/APICalls/UpdateDoctor/put-doc"; +import { Availability, Doctor, DoctorInfo } from "apps/business-admin-app/types/doctor"; +import { Session } from "next-auth"; +import Image from "next/image"; +import { useEffect, useRef, useState } from "react"; +import { Button, Message, Modal } from "rsuite"; +import FileUploadSingle from "./imageUploader"; +// eslint-disable-next-line max-len +import female_doc_thumbnail from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png"; +// eslint-disable-next-line max-len +import male_doc_thumbnail from "../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png"; +import styles from "../../../../styles/doctor.module.css"; +import convertTo12HourTime from "../sectionsRelatedToBookings/timeConverter"; + + +interface EditDoctorProfileProps { + session: Session + isOpen: boolean; + setIsOpen: React.Dispatch>; + doctor: Doctor; + availabilityInfo: Availability[]; + setAvailabilityInfo: React.Dispatch>; + url: string; + setUrl: React.Dispatch>; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to edit a doctor profile. + */ +export default function EditDoctorProfile(props: EditDoctorProfileProps) { + + const { session, isOpen, setIsOpen, doctor, availabilityInfo, setAvailabilityInfo, url, setUrl } = props; + const [ stringDate, setStringDate ] = useState(""); + const [ name, setName ] = useState(""); + const [ registrationNo, setRegistrationNo ] = useState(""); + const [ specialty, setSpecialty ] = useState(""); + const [ email, setEmail ] = useState(""); + const [ gender, setGender ] = useState(""); + const [ DoB, setDoB ] = useState(""); + const dateInputRef = useRef(null); + const [ address, setAddress ] = useState(""); + const [ availableDate, setAvailableDate ] = useState(""); + const [ startTime, setStartTime ] = useState(""); + const [ endTime, setEndTime ] = useState(""); + const [ bookingCount, setBookingCount ] = useState(0); + + const closeEditDoctorDialog = (): void => { + setIsOpen(false); + }; + + useEffect(() => { + if(doctor && doctor.createdAt != "") { + const isoString = doctor.createdAt; + const date = new Date(isoString); + const stringDate = date.toLocaleString(); + + setStringDate(stringDate); + } + }, [ isOpen ]); + + const handleOnAdd = () => { + if (availableDate && startTime && endTime && bookingCount) { + const info: Availability = { + date: availableDate, + timeSlots: [ + { + availableBookingCount: bookingCount, + endTime: endTime, + startTime: startTime + + } + ] + }; + + setAvailabilityInfo(availabilityInfo => [ ...availabilityInfo, info ]); + setAvailableDate(""); + setStartTime(""); + setEndTime(""); + setBookingCount(0); + } + }; + + const handleRemoveAvailabilityDetail = (availability: Availability) => { + setAvailabilityInfo(oldValues => { + return oldValues.filter(value => value !== availability); + }); + }; + + const handleSave = () => { + async function updateDoctor() { + const accessToken = session.accessToken; + const docName = (name) ? name : doctor.name; + const docAddress = (address) ? address : doctor.address; + const docDoB = (DoB) ? DoB : doctor.dateOfBirth; + const docEmail = (email) ? email : doctor.emailAddress; + const docGender = (gender) ? gender : doctor.gender; + const docRegistrationNo = (registrationNo) ? registrationNo : doctor.registrationNumber; + const docSpecialty = (specialty) ? specialty : doctor.specialty; + + const payload: DoctorInfo = { + address: docAddress, + availability: availabilityInfo, + dateOfBirth: docDoB, + emailAddress: docEmail, + gender: docGender, + name: docName, + registrationNumber: docRegistrationNo, + specialty: docSpecialty + }; + + putDoctor(accessToken, doctor.id, payload); + } + updateDoctor(); + setAvailabilityInfo([]); + setIsOpen(false); + }; + + return ( + + + + + + + +
+
+ + + +

Name

+
+ +

Registration Number

+
+ +

Specialty

+
+ +

Email Address

+
+ +

Gender

+
+ +

Date of Birth

+
+ +

Address

+
+ +

Created At

+
+
+ + + setName(e.target.value) + } + /> + + setRegistrationNo(e.target.value) + } + /> + + setSpecialty(e.target.value) + } + /> + + setEmail(e.target.value) + } + /> + + setGender(e.target.value) + } + /> + setDoB(e.target.value) } + /> + + setAddress(e.target.value) + } + /> + + +
+ +
+
+
+ Availability Information +
+

+ + Choose an available date, start time, end time and booking count respectively. + +
+ { + setAvailableDate(e.target.value); + } } + value={ availableDate } + /> + { + setStartTime(e.target.value); + } } + value={ startTime } + /> + { + setEndTime(e.target.value); + } } + value={ endTime } + /> + + { + setBookingCount(e.target.valueAsNumber); + } } + value={ bookingCount } + /> + + + +
+
+ { availabilityInfo?.length > 0 && ( +
+
+ + + + Available Date + Start Time + End Time + Booking Count + Delete Record + + + + { availabilityInfo && availabilityInfo.length > 0 + && availabilityInfo.map((availability) => ( + + + { availability.date } + + { convertTo12HourTime(availability.timeSlots[0].startTime) } + + + { convertTo12HourTime(availability.timeSlots[0].endTime) } + + + { availability.timeSlots[0].availableBookingCount } + + + + )) } + +
+
+
+
+ ) } +
+
+ { url? ( + doc-thumbnail + ): ( + doc-thumbnail + + ) } +
+
+ Update Doctor Image +
+ +
+
+ + + + +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/imageUploader.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/imageUploader.tsx new file mode 100644 index 000000000..806fea127 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/imageUploader.tsx @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getDocThumbnail } from "apps/business-admin-app/APICalls/GetDocThumbnail/get-doc-thumbnail"; +import { updateDocThumbnail } from "apps/business-admin-app/APICalls/UploadDocThumbnail/put-doc-thumbnail"; +import { Session } from "next-auth"; +import { ChangeEvent, useRef, useState } from "react"; +import styles from "../../../../styles/doctor.module.css"; +import { Button } from "rsuite"; + + +interface FileUploadProps { + session: Session + doctorId: string; + imageUrl: any; + setImageUrl: React.Dispatch>; +} + +function FileUploadSingle(props: FileUploadProps) { + const { doctorId, imageUrl, setImageUrl, session } = props; + const [ file, setFile ] = useState(); + + const handleFileChange = (e: ChangeEvent) => { + if (e.target.files) { + setFile(e.target.files[0]); + } + }; + + const handleUploadClick = async () => { + if (!file) { + return; + } + + async function updateThumbnails() { + const accessToken = session.accessToken; + const formData = new FormData(); + + formData.append( + "file", + file + ); + const response = await updateDocThumbnail(accessToken, doctorId, formData); + + if (response.status === 200) { + const accessToken = await session.accessToken; + const response = await getDocThumbnail(accessToken, doctorId); + + if (response.data.size > 0) { + const imageUrl = URL.createObjectURL(response.data); + + setImageUrl(imageUrl); + } + } + } + updateThumbnails(); + }; + + const hiddenFileInput = useRef(null); + + const handleClick = () => { + hiddenFileInput.current.click(); + }; + + return ( + <>
+ + + +
+
+ +
+ ); +} + +export default FileUploadSingle; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/manageDoctors.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/manageDoctors.tsx new file mode 100644 index 000000000..9977fdd11 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/manageDoctors.tsx @@ -0,0 +1,146 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid } from "@mui/material"; +import { getDoctors } from "apps/business-admin-app/APICalls/getDoctors/get-doctors"; +import { Doctor } from "apps/business-admin-app/types/doctor"; +import { Session } from "next-auth"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Button, Stack } from "rsuite"; +import DoctorCard from "./doctorCard"; +import DoctorOverview from "./doctorOverview"; +import styles from "../../../../styles/doctor.module.css"; +import AddUserComponent from "../settingsSection/manageUserSection/otherComponents/addUserComponent"; + +interface ManageDoctorsSectionProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function ManageDoctorsSection(props: ManageDoctorsSectionProps) { + + const { session } = props; + const [ doctorList, setDoctorList ] = useState(null); + const [ isAddDoctorOpen, setIsAddDoctorOpen ] = useState(false); + const [ isDoctorOverviewOpen, setIsDoctorOverviewOpen ] = useState(false); + const [ doctor, setDoctor ] = useState(null); + const [ isDoctorEditOpen, setIsDoctorEditOpen ] = useState(false); + const router = useRouter(); + + async function getDoctorList() { + const accessToken = session.accessToken; + + getDoctors(accessToken) + .then((res) => { + if (res.data instanceof Array) { + setDoctorList(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + + useEffect(() => { + getDoctorList(); + }, [ session, isAddDoctorOpen, isDoctorEditOpen ]); + + useEffect(() => { + router.replace(router.asPath); + }, [ isDoctorEditOpen ]); + + const onAddDoctorClick = (): void => { + setIsAddDoctorOpen(true); + }; + + const closeAddDoctorDialog = (): void => { + setIsAddDoctorOpen(false); + }; + + const closeDoctorOverviewDialog = (): void => { + setIsDoctorOverviewOpen(false); + }; + + return ( +
+ + +

{ "Manage Doctors" }

+

{ "Manage doctors in the organization" }

+
+ +
+ + {/* */} + + + +
+ + { doctorList && doctorList.map((doctor) => ( + { setIsDoctorOverviewOpen(true); setDoctor(doctor);} }> + + + )) } + +
+
+ +
+ +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/medicalReportEdit.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/medicalReportEdit.tsx new file mode 100644 index 000000000..43045c431 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/medicalReportEdit.tsx @@ -0,0 +1,310 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } + from "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import PageIcon from "@rsuite/icons/Page"; +import TrashIcon from "@rsuite/icons/Trash"; +import { deleteMedicalReport } from "apps/business-admin-app/APICalls/DeleteMedicalReport/deleteMedicalReport"; +import { updateMedicalReport } from "apps/business-admin-app/APICalls/UpdateMedicalReport/put-medicalReport"; +import { MedicalReport, Medicine, UpdateMedicalReport } from "apps/business-admin-app/types/pets"; +import { useState } from "react"; +import { Button, Modal } from "rsuite"; +import styles from "../../../../styles/doctor.module.css"; + + +interface MedicalReportEdit { + token: string; + petId: string; + medicalReport: MedicalReport; + setMedicalReport: React.Dispatch>; + medicineInfo: Medicine[]; + setMedicineInfo: React.Dispatch>; + medicalReportList: MedicalReport[]; + setMedicalReportList: React.Dispatch>; + isOpen: boolean; + setIsOpen: React.Dispatch>; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to show the overview of a medical report. + */ +export default function MedicalReportEdit(props: MedicalReportEdit) { + + const { token, petId, medicalReport, + setMedicalReport, medicalReportList, + setMedicalReportList, medicineInfo, setMedicineInfo, isOpen, setIsOpen } = props; + const [ diagnosis, setDiagnosis ] = useState(""); + const [ treatment, setTreatment ] = useState(""); + const [ dosage, setDosage ] = useState(""); + const [ drugName, setDrugName ] = useState(""); + const [ duration, setDuration ] = useState(""); + + const closeEditView = () => { + setIsOpen(false); + }; + + const handleSave = () => { + async function updateReport() { + const accessToken = token; + const diagnosisValue = (diagnosis) ? diagnosis : medicalReport.diagnosis; + const treatmentValue = (treatment) ? treatment : medicalReport.treatment; + const payload: UpdateMedicalReport = { + diagnosis: diagnosisValue, + treatment: treatmentValue, + medications: medicineInfo + }; + const response = await updateMedicalReport(accessToken, petId, medicalReport.reportId, payload); + } + updateReport(); + setIsOpen(false); + }; + + const handleDelete = (report: MedicalReport) => { + setMedicalReport(null); + setMedicalReportList(oldValues => { + return oldValues.filter(value => value !== report); + }); + async function deleteReport() { + const accessToken = token; + const response = await deleteMedicalReport(accessToken, petId, report.reportId); + } + deleteReport(); + }; + + const handleOnAdd = () => { + if (drugName && dosage && duration ) { + const info: Medicine = { + drugName: drugName, + dosage: dosage, + duration: duration + }; + + setMedicineInfo(medicineInfo => [ ...medicineInfo, info ]); + setDrugName(""); + setDosage(""); + setDuration(""); + } + }; + + const handleRemoveAvailabilityDetail = (medicine: Medicine) => { + setMedicineInfo(oldValues => { + return oldValues.filter(value => value !== medicine); + }); + }; + + + return ( + <> + + + + + + +
+
+ { medicalReport && ( +
+ + + +

Diagnosis

+
+ +

Treatment

+
+ +

Created At

+
+
+ + + setDiagnosis(e.target.value) + } + /> + + setTreatment(e.target.value) + } + /> + + +
+
+ { + setDrugName(e.target.value); + } } + value={ drugName } + /> + { + setDosage(e.target.value); + } } + value={ dosage } + /> + { + setDuration(e.target.value); + } } + value={ duration } + /> + +
+
+ + + + + Drug Name + + Dosage + + Duration + Delete Record + + + + { medicineInfo.map((medicine) => ( + + + { medicine.drugName } + + { medicine.dosage } + + { medicine.duration } + + + + )) } + +
+
+
+ +
+
+ ) } +
+
+
+ +
+
+
+ + + + +
+ + ); +} + +function convertToLocalDate(isoDateString: string): string { + const date = new Date(isoDateString); + const localDateString = date.toLocaleDateString(); + + return localDateString; +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/medicalReportOverview.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/medicalReportOverview.tsx new file mode 100644 index 000000000..98b7ab9a1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/sectionsRelatedToDoctor/medicalReportOverview.tsx @@ -0,0 +1,194 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } from + "@mui/material"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import PageIcon from "@rsuite/icons/Page"; +import { MedicalReport, Medicine } from "apps/business-admin-app/types/pets"; +import { useState } from "react"; +import { Button, Modal } from "rsuite"; +import MedicalReportEdit from "./medicalReportEdit"; +import styles from "../../../../styles/doctor.module.css"; +import dateConverter from "../sectionsRelatedToBookings/dateConverter"; + + +interface DoctorOverviewProps { + token: string; + petId: string; + medicalReport: MedicalReport; + setMedicalReport: React.Dispatch>; + medicalReportList: MedicalReport[]; + setMedicalReportList: React.Dispatch>; + isOpen: boolean; + setIsOpen: React.Dispatch>; + isEditOpen: boolean; + setIsEditOpen: React.Dispatch>; +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to show the overview of a medical report. + */ +export default function MedicalReportOverview(props: DoctorOverviewProps) { + + const { token, petId, medicalReport, setMedicalReport, medicalReportList, + setMedicalReportList, isOpen, setIsOpen, isEditOpen, setIsEditOpen } = props; + const [ medicineInfo, setMedicineInfo ] = useState([]); + + const closeOverview = () => { + setIsOpen(false); + }; + + const handleEdit = () => { + setIsEditOpen(true); + setIsOpen(false); + setMedicineInfo(medicalReport.medications); + }; + + return ( + <> + + + + + + +
+
+ { medicalReport && ( +
+ + + +

Diagnosis

+
+ +

Treatment

+
+ +

Created At

+
+
+ + +

+ { medicalReport.diagnosis?medicalReport.diagnosis:" - " }

+
+ +

+ { medicalReport.treatment?medicalReport.treatment:" - " }

+
+ +

+ { medicalReport.createdAt? + dateConverter(medicalReport.createdAt):" - " }

+
+
+
+
+ + + + + Drug Name + + Dosage + + Duration + + + + { medicalReport.medications.map((medicine) => ( + + + { medicine.drugName } + + { medicine.dosage } + + { medicine.duration } + + )) } + +
+
+
+ ) } +
+
+
+ +
+
+
+ + + + +
+
+ +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/idpSectionComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/idpSectionComponent.tsx new file mode 100644 index 000000000..5dfb3c80d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/idpSectionComponent.tsx @@ -0,0 +1,177 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProvider, + IdentityProviderTemplate, + StandardBasedOidcIdentityProvider, + StandardBasedSAMLIdentityProvider +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeListAllIdentityProviders +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { + EmptySettingsComponent, SettingsTitleComponent, errorTypeDialog, successTypeDialog +} from "@pet-management-webapp/shared/ui/ui-components"; +import AppSelectIcon from "@rsuite/icons/AppSelect"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Button, Container, useToaster } from "rsuite"; +import IdentityProviderList from "./otherComponents/identityProviderList"; +import IdpCreate from "./otherComponents/idpCreateModal/idpCreate"; +import SelectIdentityProvider from "./otherComponents/selectIdentityProvider"; + +interface IdpSectionComponentProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The idp interface section. + */ +export default function IdpSectionComponent(props: IdpSectionComponentProps) { + + const { session } = props; + + const toaster = useToaster(); + + const [ idpList, setIdpList ] = useState([]); + const [ openSelectModal, setOpenSelectModal ] = useState(false); + const [ selectedTemplate, setSelectedTemplate ] = useState(undefined); + + const templates: IdentityProviderTemplate[] = [ + StandardBasedOidcIdentityProvider, + StandardBasedSAMLIdentityProvider + ]; + + const fetchAllIdPs = useCallback(async () => { + + const res = await controllerDecodeListAllIdentityProviders(session); + + if (res) { + setIdpList(res); + } else { + setIdpList([]); + } + + }, [ session ]); + + useEffect(() => { + fetchAllIdPs(); + }, [ fetchAllIdPs ]); + + const onAddIdentityProviderClick = (): void => { + setOpenSelectModal(true); + }; + + const onTemplateSelect = (template: IdentityProviderTemplate): void => { + setOpenSelectModal(false); + setSelectedTemplate(template); + }; + + const onSelectIdpModalClose = (): void => { + setOpenSelectModal(false); + }; + + const onCreationDismiss = (): void => { + setSelectedTemplate(undefined); + }; + + const onIdpCreated = (response: IdentityProvider): void => { + if (response) { + successTypeDialog(toaster, "Success", "Identity Provider Created Successfully"); + + setIdpList([ + ...idpList, + response + ]); + + setOpenSelectModal(false); + setSelectedTemplate(undefined); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while creating the identity provider. Try again."); + } + }; + + return ( + + + { + idpList?.length == 0 + ? () + : ( + + ) + } + + + { + idpList + ? idpList.length === 0 + ? ( } + onAddButtonClick={ onAddIdentityProviderClick } + />) + : () + : null + } + + { + openSelectModal && ( + + ) + } + { + selectedTemplate && ( + + ) + } + + ); + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/buttonGroupIdentityProviderDetails.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/buttonGroupIdentityProviderDetails.tsx new file mode 100644 index 000000000..cc1a1bd36 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/buttonGroupIdentityProviderDetails.tsx @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Application, ApplicationList, IdentityProvider, checkIfIdpIsinAuthSequence } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeDeleteIdentityProvider, controllerDecodeGetApplication, + controllerDecodeListCurrentApplication +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import Trash from "@rsuite/icons/Trash"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Button, IconButton, Stack, useToaster } from "rsuite"; +import ConfirmAddRemoveLoginFlowModal from "./confirmAddRemoveLoginFlowModal"; + +interface ButtonGroupIdentityProviderDetailsProps { + session : Session + idpDetails : IdentityProvider, + fetchAllIdPs : () => Promise, + id : string +} + +/** + * + * @param prop - session, idpDetails, fetchAllIdPs, id (idp id) + * + * @returns Add/Remove button and delete button group in an Idp + */ +export default function ButtonGroupIdentityProviderDetails(props : ButtonGroupIdentityProviderDetailsProps) { + + const { session, idpDetails, fetchAllIdPs, id } = props; + + const toaster = useToaster(); + + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + const [ idpIsinAuthSequence, setIdpIsinAuthSequence ] = useState(null); + const [ openListAppicationModal, setOpenListAppicationModal ] = useState(false); + + const fetchData = useCallback(async () => { + const res : ApplicationList = ( await controllerDecodeListCurrentApplication(session) as ApplicationList ); + + await setAllApplications(res); + }, [ session, openListAppicationModal ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res : Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application ); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + useEffect(() => { + if (!checkIfJSONisEmpty(applicationDetail)) { + const check = checkIfIdpIsinAuthSequence(applicationDetail, idpDetails); + + setIdpIsinAuthSequence(check[0]); + } + }, [ idpDetails, applicationDetail ]); + + const onIdpDelete = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Success", "Identity Provider Deleted Successfully"); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while deleting the identity provider. Try again."); + } + }; + + const onIdPDeleteClick = (id: string): void => { + controllerDecodeDeleteIdentityProvider(session, id) + .then((response) => onIdpDelete(response)) + .finally(() => { + fetchAllIdPs().finally(); + }); + }; + + const onAddToLoginFlowClick = (): void => { + setOpenListAppicationModal(true); + }; + + const onCloseListAllApplicaitonModal = (): void => { + setOpenListAppicationModal(false); + }; + + return ( + + { + idpIsinAuthSequence === null + ? null + : idpIsinAuthSequence + ? + : + } + + + + { + idpIsinAuthSequence + ? null + : ( } + style={ { marginLeft: "10px" } } + onClick={ () => onIdPDeleteClick(id) } + appearance="subtle" />) + } + + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/confirmAddRemoveLoginFlowModal.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/confirmAddRemoveLoginFlowModal.tsx new file mode 100644 index 000000000..bcb8395f2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/confirmAddRemoveLoginFlowModal.tsx @@ -0,0 +1,232 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Application, IdentityProvider, PatchApplicationAuthMethod } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodePatchApplicationAuthSteps } from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import React, { useState } from "react"; +import { Avatar, Button, Col, Grid, Loader, Modal, Row, Toaster, useToaster } from "rsuite"; +import stylesSettings from "../../../../../../styles/Settings.module.css"; + +interface ApplicationListItemProps { + applicationDetail: Application +} + +interface ApplicationListAvailableProps { + applicationDetail: Application, + idpIsinAuthSequence: boolean +} + +interface ConfirmAddRemoveLoginFlowModalProps { + session: Session, + applicationDetail: Application, + idpDetails: IdentityProvider, + idpIsinAuthSequence: boolean, + openModal: boolean, + onModalClose: () => void, + fetchAllIdPs: () => Promise +} + +/** + * + * @param prop - session, applicationDetail, idpDetails, idpIsinAuthSequence, openModal, onModalClose, fetchAllIdPs + * + * @returns Add/Remove from login flow button + */ +export default function ConfirmAddRemoveLoginFlowModal(props: ConfirmAddRemoveLoginFlowModalProps) { + + const { session, applicationDetail, idpDetails, idpIsinAuthSequence, openModal, onModalClose, fetchAllIdPs } + = props; + + const toaster: Toaster = useToaster(); + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const onSuccess = (): void => { + onModalClose(); + fetchAllIdPs().finally(); + }; + + const onIdpAddToLoginFlow = (response: boolean): void => { + if (response) { + onSuccess(); + successTypeDialog(toaster, "Success", "Identity Provider Add to the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the the identity provider."); + } + }; + + const onIdpRemovefromLoginFlow = (response: boolean): void => { + if (response) { + onSuccess(); + successTypeDialog(toaster, "Success", "Identity Provider Remove from the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while removing the identity provider. Try again."); + } + }; + + const onSubmit = async (patchApplicationAuthMethod): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + + controllerDecodePatchApplicationAuthSteps(session, applicationDetail, idpDetails, + patchApplicationAuthMethod) + .then((response) => idpIsinAuthSequence + ? onIdpRemovefromLoginFlow(response) + : onIdpAddToLoginFlow(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + const onRemove = async (): Promise => { + await onSubmit(PatchApplicationAuthMethod.REMOVE); + }; + + const onAdd = async (): Promise => { + await onSubmit(PatchApplicationAuthMethod.ADD); + }; + + return ( + + + + { + idpIsinAuthSequence + ? "Remove Identity Provider from the Login Flow" + : "Add Identity Provider to the Login Flow" + } + + + + { + checkIfJSONisEmpty(applicationDetail) + ? + : () + } + + + + + + +
+ +
+ +
+ ); +} + +/** + * + * @returns When then `config.ManagementAPIConfig.SharedApplicationName` is not the correct applicaiton, + * it will show this section + */ +function EmptySelectApplicationBody() { + + return ( +
+

No Application Available

+
+
Create an application from the WSO2 IS or Asgardeo Console app to add authentication.
+

For more details check out the following links

+ +
+ +
+ ); +} + +/** + * + * @param prop - idpIsinAuthSequence, applicationDetail + * + * @returns When then config.ManagementAPIConfig.SharedApplicationName is the correct applicaiton, + * it will show this section + */ +function ApplicationListAvailable(props: ApplicationListAvailableProps) { + + const { idpIsinAuthSequence, applicationDetail } = props; + + return ( +
+ { + idpIsinAuthSequence + ? (

This will remove the Idp as an authentication step from the following + applicaiton

) + : (

This will add the Idp as an authentication step to the authentication flow of the following + applicaiton

) + } + + + +

Please confirm your action to procced

+ +
+ ); + +} + +/** + * + * @param prop - application + * + * @returns The component to show the applicaiton name and the description + */ +function ApplicationListItem(props: ApplicationListItemProps) { + + const { applicationDetail } = props; + + return ( +
+ + + + { applicationDetail.name[0] } + + + +
{ applicationDetail.name }
+

{ applicationDetail.description }

+ +
+
+
+ + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/identityProviderDetails.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/identityProviderDetails.tsx new file mode 100644 index 000000000..7af3829ae --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/identityProviderDetails.tsx @@ -0,0 +1,199 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider, getImageForTheIdentityProvider, selectedTemplateBaesedonTemplateId } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodeGetDetailedIdentityProvider } from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { AccordianItemHeaderComponent, JsonDisplayComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { SAML_IDP } from "@pet-management-webapp/shared/util/util-common"; +import CodeIcon from "@rsuite/icons/Code"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Nav, Panel, Stack } from "rsuite"; +import ButtonGroupIdentityProviderDetails from "./buttonGroupIdentityProviderDetails"; +import Attributes from "./idpDetailsSections/attributes"; +import General from "./idpDetailsSections/general"; +import Groups from "./idpDetailsSections/groups"; +import Roles from "./idpDetailsSections/roles"; +import Settings from "./idpDetailsSections/settings"; + +interface IdentityProviderDetailsProps { + session: Session + id: string + fetchAllIdPs: () => Promise +} + +/** + * + * @param prop - session, id (idp id), fetchAllIdPs (function to fetch all Idps) + * + * @returns idp item details component + */ +export default function IdentityProviderDetails(props: IdentityProviderDetailsProps) { + + const { session, id, fetchAllIdPs } = props; + + const [ idpDetails, setIdpDetails ] = useState(null); + const [ activeKeyNav, setActiveKeyNav ] = useState("1"); + + const fetchData = useCallback(async () => { + const res: IdentityProvider = await controllerDecodeGetDetailedIdentityProvider(session, id); + + setIdpDetails(res); + }, [ session, id ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + const activeKeyNavSelect = (eventKey): void => { + setActiveKeyNav(eventKey); + }; + + const idpDetailsComponent = (activeKey): JSX.Element => { + switch (activeKey) { + case "1": + + return ; + case "2": + + return ; + case "3": + + return ; + case "4": + + return ; + case "5": + + return ; + case "6": + + return ; + } + }; + + return ( + + idpDetails + ? () + } + eventKey={ id } + id={ id }> +
+ + + +
+ { idpDetailsComponent(activeKeyNav) } +
+
+
+
) + : null + ); +} + +/** + * + * @param prop - `idpDetails`, `activeKeyNav`, `activeKeyNavSelect` + * + * @returns navigation component of idp details + */ +function IdentityProviderDetailsNav(prop) { + + const { idpDetails, activeKeyNav, activeKeyNavSelect } = prop; + + const templateIdCheck = (): boolean => { + const selectedTemplate = selectedTemplateBaesedonTemplateId(idpDetails.templateId); + + if (selectedTemplate) { + return true; + } else { + return false; + } + }; + + return ( + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/identityProviderList.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/identityProviderList.tsx new file mode 100644 index 000000000..bc518dce0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/identityProviderList.tsx @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import React from "react"; +import { FlexboxGrid, PanelGroup } from "rsuite"; +import IdentityProviderDetails from "./identityProviderDetails"; +import styles from "../../../../../../styles/idp.module.css"; + +interface IdentityProviderListProps { + idpList : IdentityProvider[], + fetchAllIdPs : ()=>Promise, + session : Session +} + +/** + * + * @param prop - idpDetails (List of idp's), fetchAllIdPs (function to fetch all idp's), session + * + * @returns List of idp's created in the organization + */ +export default function IdentityProviderList(props: IdentityProviderListProps) { + + const { idpList, fetchAllIdPs, session } = props; + + return ( + +
+ + { idpList.map(({ id }) => ( + + )) } + +
+
+ + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/externalIdentityProvider.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/externalIdentityProvider.tsx new file mode 100644 index 000000000..94145a85c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/externalIdentityProvider.tsx @@ -0,0 +1,251 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, ApplicationList, + IdentityProvider, IdentityProviderConfigureType, + IdentityProviderTemplate, PatchApplicationAuthMethod +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeCreateIdentityProvider, controllerDecodeGetApplication, + controllerDecodeListCurrentApplication, controllerDecodePatchApplicationAuthSteps +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } from + "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Radio, RadioGroup, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface ExternalIdentityProviderProps { + session: Session + template: IdentityProviderTemplate + onIdpCreate: (response: IdentityProvider) => void, + onCancel: () => void, +} + +/** +* +* @param prop - `ExternalIdentityProviderProps` +* +* @returns Form to create external idp +*/ +export default function ExternalIdentityProvider(prop: ExternalIdentityProviderProps) { + + const { session, template, onIdpCreate, onCancel } = prop; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ configureType, setConfigureType ] + = useState(IdentityProviderConfigureType.AUTO); + const toaster: Toaster = useToaster(); + + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + + const fetchData = useCallback(async () => { + const res : ApplicationList = ( await controllerDecodeListCurrentApplication(session) as ApplicationList ); + + await setAllApplications(res); + }, [ session ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res : Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application ); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("application_name", values.application_name, errors); + errors = fieldValidate("client_id", values.client_id, errors); + errors = fieldValidate("client_secret", values.client_secret, errors); + + switch (configureType) { + case IdentityProviderConfigureType.AUTO: + errors = fieldValidate("discovery_url", values.discovery_url, errors); + + break; + + case IdentityProviderConfigureType.MANUAL: + errors = fieldValidate("authorization_endpoint", values.authorization_endpoint, errors); + errors = fieldValidate("token_endpoint", values.token_endpoint, errors); + + break; + } + + return errors; + }; + + const onConfigureTypeChange = (value: IdentityProviderConfigureType): void => { + setConfigureType(value); + }; + + const onIdpAddToLoginFlow = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Success", "Identity Provider Add to the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the the identity provider."); + } + }; + + const onUpdate = async (values: Record): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodeCreateIdentityProvider(session, template, values, configureType) + .then((response) => { + onIdpCreate(response); + const idpDetails = response as IdentityProvider; + + controllerDecodePatchApplicationAuthSteps(session, applicationDetail, idpDetails, + PatchApplicationAuthMethod.ADD) + .then((response) => { + onIdpAddToLoginFlow(response); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + Use the discovery url to configure the identity provider + + + Manually configure the identity provider + + +
+ { + configureType === IdentityProviderConfigureType.AUTO + ? (<> + + + + ) + : null + } + + { + configureType === IdentityProviderConfigureType.MANUAL + ? (<> + + + + + + + + + + + + + ) + : null + } + +
+ ) } + /> +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/googleIdentityProvider.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/googleIdentityProvider.tsx new file mode 100644 index 000000000..f041159e1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/googleIdentityProvider.tsx @@ -0,0 +1,168 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, + ApplicationList, + IdentityProvider, IdentityProviderConfigureType, IdentityProviderTemplate, PatchApplicationAuthMethod +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeCreateIdentityProvider, + controllerDecodeGetApplication, + controllerDecodeListCurrentApplication, + controllerDecodePatchApplicationAuthSteps +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } from + "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface GoogleIdentityProviderProps { + session: Session + template: IdentityProviderTemplate + onIdpCreate: (response: IdentityProvider) => void, + onCancel: () => void, +} + +/** + * + * @param prop - `GoogleIdentityProviderProps` + * + * @returns Form to create google idp + */ +export default function GoogleIdentityProvider(prop: GoogleIdentityProviderProps) { + + const { session, template, onIdpCreate, onCancel } = prop; + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const toaster: Toaster = useToaster(); + + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + + const fetchData = useCallback(async () => { + const res : ApplicationList = ( await controllerDecodeListCurrentApplication(session) as ApplicationList ); + + await setAllApplications(res); + }, [ session ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res : Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application ); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("application_name", values.application_name, errors); + errors = fieldValidate("client_id", values.client_id, errors); + errors = fieldValidate("client_secret", values.client_secret, errors); + + return errors; + }; + + const onIdpAddToLoginFlow = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Success", "Identity Provider Add to the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the the identity provider."); + } + }; + + const onUpdate = async (values: Record): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodeCreateIdentityProvider(session, template, values, IdentityProviderConfigureType.MANUAL) + .then((response) => { + onIdpCreate(response); + const idpDetails = response as IdentityProvider; + + controllerDecodePatchApplicationAuthSteps(session, applicationDetail, idpDetails, + PatchApplicationAuthMethod.ADD) + .then((response) => onIdpAddToLoginFlow(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + ) } + /> +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/idpCreate.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/idpCreate.tsx new file mode 100644 index 000000000..f39261be9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/idpCreate.tsx @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider, IdentityProviderTemplate, getIdPCallbackUrl } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { infoTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { CopyTextToClipboardCallback, OIDC_IDP, SAML_IDP, copyTheTextToClipboard } + from "@pet-management-webapp/shared/util/util-common"; +import CopyIcon from "@rsuite/icons/Copy"; +import InfoRoundIcon from "@rsuite/icons/InfoRound"; +import { Session } from "next-auth"; +import { FlexboxGrid, Input, InputGroup, Modal, Panel, Stack, useToaster } from "rsuite"; +import ExternalIdentityProvider from "./externalIdentityProvider"; +import SAMLIdentityProvider from "./samlIdentityProvider"; + +interface PrerequisiteProps { + orgId: string +} + +interface IdpCreateProps { + session: Session, + onIdpCreate: (response: IdentityProvider) => void, + onCancel: () => void, + template: IdentityProviderTemplate, + orgId: string, + openModal: boolean, +} + +/** + * + * @param prop - `IdpCreateProps` + * @returns Idp creation modal + */ +export default function IdpCreate(prop: IdpCreateProps) { + + const { session, openModal, onIdpCreate, onCancel, template, orgId } = prop; + + const handleModalClose = (): void => { + onCancel(); + }; + + const resolveTemplateForm = (): JSX.Element => { + switch (template.templateId) { + + case OIDC_IDP: + + return (); + + case SAML_IDP: + + return (); + + } + }; + + return ( + + + + + + + + { resolveTemplateForm() } + + + + + + + + ); +} + +function Prerequisite(prop: PrerequisiteProps) { + + const { orgId } = prop; + + const toaster = useToaster(); + + const copyValueToClipboard = (text) => { + const callback: CopyTextToClipboardCallback = () => infoTypeDialog(toaster, "Text copied to clipboard"); + + copyTheTextToClipboard(text, callback); + }; + + return ( + + + Prerequisite + ) + } + bordered> +

+ Before you begin, create an OAuth application, and obtain a client ID & secret. + Add the following URL as the Authorized Redirect URI. +

+
+ + + copyValueToClipboard(getIdPCallbackUrl(orgId)) }> + + + +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/samlIdentityProvider.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/samlIdentityProvider.tsx new file mode 100644 index 000000000..f7de60956 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpCreateModal/samlIdentityProvider.tsx @@ -0,0 +1,256 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, ApplicationList, + IdentityProvider, IdentityProviderConfigureType, + IdentityProviderTemplate, PatchApplicationAuthMethod +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeCreateIdentityProvider, controllerDecodeGetApplication, + controllerDecodeListCurrentApplication, controllerDecodePatchApplicationAuthSteps +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } from + "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Radio, RadioGroup, Toaster, Uploader, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface SAMLIdentityProviderProps { + session: Session + template: IdentityProviderTemplate + onIdpCreate: (response: IdentityProvider) => void, + onCancel: () => void, +} + +/** +* +* @param prop - `ExternalIdentityProviderProps` +* +* @returns Form to create external idp +*/ +export default function SAMLIdentityProvider(prop: SAMLIdentityProviderProps) { + + const { session, template, onIdpCreate, onCancel } = prop; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ configureType, setConfigureType ] + = useState(IdentityProviderConfigureType.AUTO); + const toaster: Toaster = useToaster(); + + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + + const fetchData = useCallback(async () => { + const res : ApplicationList = ( await controllerDecodeListCurrentApplication(session) as ApplicationList ); + + await setAllApplications(res); + }, [ session ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res : Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application ); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("application_name", values.application_name, errors); + errors = fieldValidate("sp_entity_id", values.sp_entity_id, errors); + + switch (configureType) { + case IdentityProviderConfigureType.AUTO: + errors = fieldValidate("meta_data_saml", values.meta_data_saml, errors); + + break; + + case IdentityProviderConfigureType.MANUAL: + errors = fieldValidate("sso_url", values.sso_url, errors); + errors = fieldValidate("idp_entity_id", values.idp_entity_id, errors); + + break; + } + + return errors; + }; + + const onConfigureTypeChange = (value: IdentityProviderConfigureType): void => { + setConfigureType(value); + }; + + const onIdpAddToLoginFlow = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Success", "Identity Provider Add to the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the the identity provider."); + } + }; + + const onUpdate = async (values: Record): Promise => { + + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + if (values.meta_data_saml) { + const blobFile = values?.meta_data_saml[0].blobFile as Blob; + + fileToBase64(blobFile) + .then(base64Content => { + values.meta_data_saml = base64Content; + createIdPandAddToLoginFlow(values); + }) + .catch(error => { + // TODO: Handle error + }); + } else { + createIdPandAddToLoginFlow(values); + } + }; + + const createIdPandAddToLoginFlow = async (values: Record): Promise => { + + controllerDecodeCreateIdentityProvider(session, template, values, configureType) + .then((response) => { + onIdpCreate(response); + const idpDetails = response as IdentityProvider; + + controllerDecodePatchApplicationAuthSteps(session, applicationDetail, idpDetails, + PatchApplicationAuthMethod.ADD) + .then((response) => { + onIdpAddToLoginFlow(response); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + function fileToBase64(file: Blob): Promise { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + + reader.readAsDataURL(file); + reader.onload = () => { + const base64String = reader.result as string; + const base64Content = base64String.split(",")[1]; + + resolve(base64Content); + }; + reader.onerror = error => reject(error); + }); + } + + return ( +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + File based configuration + + + Manually configuration + + +
+ { + configureType === IdentityProviderConfigureType.AUTO + ? (<> + + + + ) + : null + } + + { + configureType === IdentityProviderConfigureType.MANUAL + ? (<> + + + + + + + ) + : null + } + +
+ ) } + /> +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/attributes.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/attributes.tsx new file mode 100644 index 000000000..ccc175f6c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/attributes.tsx @@ -0,0 +1,260 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProvider, IdentityProviderGroupMappings, LocalClaim +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeGetIdentityProviderGroupMappings, + controllerDecodeGetLocalClaims, + controllerDecodePatchIdpClaims +} + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_NONE } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import AddOutlineIcon from "@rsuite/icons/AddOutline"; +import CloseIcon from "@rsuite/icons/Close"; +import { id } from "date-fns/locale"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Field, Form } from "react-final-form"; +import { Input, Loader, SelectPicker } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface GeneralProps { + fetchData: () => Promise + session: Session, + idpDetails: IdentityProvider +} + +/** + * + * @param prop - fetchData (function to fetch data after form is submitted), session, idpDetails + * + * @returns The general section of an idp + */ +export default function Attributes(props: GeneralProps) { + + const { fetchData, session, idpDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ initialValues, setInitialValues ] = useState({ keyValuePairs: {}, subject_attribute: "" }); + const [ idpGroupMappings, setIdpGroupMappings ] = useState(null); + const [ localClaims, setLocalClaims ] = useState(null); + + const fetchGroupMappingData = useCallback(async () => { + const res: IdentityProviderGroupMappings = + await controllerDecodeGetIdentityProviderGroupMappings(session, idpDetails.id); + const res1: LocalClaim[] = + await controllerDecodeGetLocalClaims(session); + + setIdpGroupMappings(res); + setLocalClaims(res1); + }, [ session, id ]); + + useEffect(() => { + fetchGroupMappingData(); + }, [ fetchGroupMappingData ]); + + + const onUpdate = async (values: Record, form): Promise => { + + const newMappings: any[] = []; + + Object.keys(values.keyValuePairs).map((key, index) => { + const localClaim = localClaims.find((claim) => claim.claimURI === values.keyValuePairs[key]); + + newMappings.push({ + idpClaim: key, + localClaim: { + displayName: localClaim.displayName, + id: localClaim.id, + uri: localClaim.claimURI + } + }); + }); + + const newIdpGroupMappings = { + mappings: newMappings, + provisioningClaims: idpGroupMappings.provisioningClaims, + roleClaim: idpGroupMappings.roleClaim, + userIdClaim: { + uri: values.subject_attribute ? values.subject_attribute : "" + } + }; + + controllerDecodePatchIdpClaims(session, idpDetails.id, newIdpGroupMappings) + .then(() => { + fetchData(); + fetchGroupMappingData(); + }).finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + + }; + + useEffect(() => { + idpGroupMappings?.mappings.forEach((mapping) => { + setInitialValues((prevData) => ({ + ...prevData, + keyValuePairs: { ...prevData.keyValuePairs, [mapping.idpClaim]: mapping.localClaim.uri } + })); + }); + setInitialValues((prevData) => ({ + ...prevData, + subject_attribute: idpGroupMappings?.userIdClaim.uri + })); + }, [ idpGroupMappings ]); + + return ( +
+
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + { ({ input }) => ( + <> + External IdP Attributes + + input.onChange({ + ...input.value, + [`key${Object.keys(input.value).length + 1}`]: "" + }) + } + style={ { marginLeft: "10px" } } + /> +
+ { Object.keys(input.value).map((key, index) => { + return ( + +
+
+ { + const updatedKeys = { ...input.value }; + + delete updatedKeys[key]; + updatedKeys[e] = input.value[key] || ""; + input.onChange(updatedKeys); + } } + /> +
+
+ { + const updatedValues = { ...input.value }; + + updatedValues[key] = value; + input.onChange(updatedValues); + } } + data={ localClaims.map((claim) => { + return { + label: claim.displayName as string, + value: claim.claimURI as string + }; + }) } + cleanable={ false } + block + /> +
+ + { + const updatedValues = { ...input.value }; + + delete updatedValues[key]; + input.onChange({ ...updatedValues }); + } } + style={ { marginLeft: "10px" } } /> +
+
+ ); + }) } +
+
+ + ({ + label: key, + value: key + })) + ] } + style={ { display: "block", margin: "10px", width: "45%" } } + value={ input.value.subject_attribute } + onChange={ (value) => { + form.change("subject_attribute", value); + } } + /> + +
+ + ) } +
+ +
+ + +
+ ) } + /> + +
+ +
+ +
+
+ ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/general.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/general.tsx new file mode 100644 index 000000000..df94ceb1a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/general.tsx @@ -0,0 +1,134 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodePatchGeneralSettingsIdp } from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface GeneralProps { + fetchData: () => Promise + session: Session, + idpDetails: IdentityProvider +} + +/** + * + * @param prop - fetchData (function to fetch data after form is submitted), session, idpDetails + * + * @returns The general section of an idp + */ +export default function General(props: GeneralProps) { + + const { fetchData, session, idpDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const toaster: Toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("name", values.name, errors); + errors = fieldValidate("description", values.description, errors); + + return errors; + }; + + const onDataSubmit = (response: IdentityProvider, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Idp updated successfully."); + fetchData(); + form.restart(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while updating the Idp. Try again."); + } + }; + + const onUpdate = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodePatchGeneralSettingsIdp(session, values.name, values.description, idpDetails.id) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( +
+ +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + ) } + /> + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/groups.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/groups.tsx new file mode 100644 index 000000000..c4013002a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/groups.tsx @@ -0,0 +1,230 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProvider, + IdentityProviderGroupMappings, + IdpGroup, + Role +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeGetIdentityProviderGroupMappings, + controllerDecodeListAllRoles, + controllerDecodePatchIdpClaims, + controllerDecodePatchIdpGroups +} from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { id } from "date-fns/locale"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Field, Form, FormSpy } from "react-final-form"; +import { Checkbox, CheckboxGroup, Loader, Panel, PanelGroup, TagInput, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; + +interface GeneralProps { + fetchData: () => Promise + session: Session, + idpDetails: IdentityProvider +} + +/** + * + * @param prop - fetchData (function to fetch data after form is submitted), session, idpDetails + * + * @returns The general section of an idp + */ +export default function Groups(props: GeneralProps) { + + const { fetchData, session, idpDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const toaster: Toaster = useToaster(); + + const [ idpGroupMappings, setIdpGroupMappings ] = useState(null); + const [ rolesList, setRolesList ] = useState([]); + + const fetchGroupMappingData = useCallback(async () => { + const res: IdentityProviderGroupMappings = + await controllerDecodeGetIdentityProviderGroupMappings(session, idpDetails.id); + + setIdpGroupMappings(res); + }, [ session, id ]); + + useEffect(() => { + fetchGroupMappingData(); + }, [ fetchGroupMappingData ]); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("group_attribute", values.group_attribute, errors); + + return errors; + }; + + const onDataSubmit = (response: IdentityProvider, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Idp updated successfully."); + fetchGroupMappingData(); + form.restart(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while updating the Idp. Try again."); + } + }; + + const onUpdate = async (values: Record, form): Promise => { + + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + let idpGroups: IdpGroup[] = []; + const groupNames: string[] = values.groups as unknown as string[]; + + idpDetails.groups.forEach((group) => { + if (groupNames.includes(group.name)) { + idpGroups.push(group); + } + }); + + groupNames.forEach((groupName) => { + if (!idpDetails.groups.some((group) => group.name === groupName)) { + idpGroups.push({ + name: groupName, + id: "" + }); + } else { + idpGroups.push(idpDetails.groups.find((group) => group.name === groupName)[0]); + } + }); + idpGroups = idpGroups.filter((element) => element !== undefined); + + const newIdpGroupMappings = { + mappings: [ + { + idpClaim: values.group_attribute, + localClaim: { + uri: "http://wso2.org/claims/groups" + } + } + ], + provisioningClaims: idpGroupMappings.provisioningClaims, + roleClaim: idpGroupMappings.roleClaim, + userIdClaim: idpGroupMappings.userIdClaim + }; + + controllerDecodePatchIdpClaims(session, idpDetails.id, newIdpGroupMappings) + .then(() => { + controllerDecodePatchIdpGroups(session, idpDetails.id, idpGroups) + .then(() => { + fetchData(); + fetchGroupMappingData(); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }); + + }; + + const fetchAllRoles = useCallback(async () => { + + const res = await controllerDecodeListAllRoles(session); + + if (res) { + setRolesList(res.filter((role) => + role?.audience.type == "application" && + role?.audience.display === getConfig().BusinessAdminAppConfig.ManagementAPIConfig.SharedApplicationName + )); + } else { + setRolesList([]); + } + + }, [ session ]); + + useEffect(() => { + fetchAllRoles(); + }, [ fetchAllRoles ]); + + return ( +
+ +
+ + group.name) + }} + render={ ({ handleSubmit, form, submitting, pristine, errors }) => ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + ) } + /> + +
+ +
+ +
+
+ ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/roles.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/roles.tsx new file mode 100644 index 000000000..a67db45ab --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/roles.tsx @@ -0,0 +1,183 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProvider, + IdentityProviderGroupMappings, + Role +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeGetIdentityProviderGroupMappings, + controllerDecodeGetRole, + controllerDecodeListAllRoles, + controllerDecodePatchRole +} from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { PatchMethod, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_NONE } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { id } from "date-fns/locale"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, TagPicker } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface GeneralProps { + fetchData: () => Promise + session: Session, + idpDetails: IdentityProvider +} + +/** + * + * @param prop - fetchData (function to fetch data after form is submitted), session, idpDetails + * + * @returns The general section of an idp + */ +export default function Roles(props: GeneralProps) { + + const { fetchData, session, idpDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const [ idpGroupMappings, setIdpGroupMappings ] = useState(null); + const [ rolesList, setRolesList ] = useState([]); + const [ initialValues, setInitialValues ] = useState({}); + + const fetchGroupMappingData = useCallback(async () => { + const res: IdentityProviderGroupMappings = + await controllerDecodeGetIdentityProviderGroupMappings(session, idpDetails.id); + + setIdpGroupMappings(res); + }, [ session, id ]); + + useEffect(() => { + fetchGroupMappingData(); + }, [ fetchGroupMappingData ]); + + const onUpdate = async (values: Record, form): Promise => { + + // setLoadingDisplay(LOADING_DISPLAY_BLOCK); + Object.entries(values).map(async ([ key, value ]) => { + if (value.length !== 0) { + await controllerDecodePatchRole(session, key, PatchMethod.REPLACE, "groups", value); + } + }); + fetchGroupMappingData(); + fetchAllRoles(); + // setLoadingDisplay(LOADING_DISPLAY_BLOCK); + + }; + + const fetchAllRoles = useCallback(async () => { + + const res = await controllerDecodeListAllRoles(session); + + if (res) { + setRolesList(res.filter((role) => + role?.audience.type == "application" && + role?.audience.display === getConfig().BusinessAdminAppConfig.ManagementAPIConfig.SharedApplicationName + )); + } else { + setRolesList([]); + } + + }, [ session ]); + + useEffect(() => { + fetchAllRoles(); + }, [ fetchAllRoles ]); + + useEffect(() => { + const fetchDataForRole = async (roleId) => { + const response = await controllerDecodeGetRole(session, roleId); + const roleGroups = response.groups ? response.groups.map((group) => group.value) : []; + const filteredGroups = roleGroups.filter((group) => + idpDetails.groups.some((idpGroup) => idpGroup.id === group)); + + setInitialValues((prevData) => ({ + ...prevData, + [roleId]: filteredGroups + })); + }; + + const roleIDs = rolesList.map((role) => role.id); + + roleIDs.forEach((roleId) => { + fetchDataForRole(roleId); + }); + }, [ rolesList, idpDetails ]); + + return ( +
+ +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + { rolesList.map((role, index) => { + const fieldName = `${role.id}`; + + return ( + + { + return { + label: group.name, + value: group.id + }; + }) } + block + /> + + ); + }) } + + + + + ) } + /> + +
+ +
+ +
+
+ ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/settings.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/settings.tsx new file mode 100644 index 000000000..7a8367bce --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/settings.tsx @@ -0,0 +1,143 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider, IdentityProviderFederatedAuthenticator } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodeGetFederatedAuthenticators, controllerDecodeUpdateFederatedAuthenticators } from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import SettingsFormSelection from "./settingsFormSection/settingsFormSelection"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface SettingsProps { + session: Session, + idpDetails: IdentityProvider +} + +/** + * + * @param prop - session, idpDetails + * + * @returns The settings section of an idp + */ +export default function Settings(props: SettingsProps) { + + const { session, idpDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ federatedAuthenticators, setFederatedAuthenticators ] + = useState(null); + + const toaster: Toaster = useToaster(); + + const fetchData = useCallback(async () => { + const res = await controllerDecodeGetFederatedAuthenticators( + session, idpDetails.id, idpDetails.federatedAuthenticators.defaultAuthenticatorId); + + await setFederatedAuthenticators(res); + }, [ session, idpDetails ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + const validate = () => { + const errors = {}; + + if (federatedAuthenticators && federatedAuthenticators.properties) { + federatedAuthenticators.properties.filter((property) => { + if (document.getElementById(property.key)) { + if (!(document.getElementById(property.key) as HTMLInputElement).value) { + errors[property.key] = "This field cannot be empty"; + } + } + }); + } + + return errors; + }; + + const onDataSubmit = (response: IdentityProviderFederatedAuthenticator): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Idp updated successfully."); + fetchData(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while updating the Idp. Try again."); + } + }; + + const onUpdate = async (values: Record): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodeUpdateFederatedAuthenticators(session, idpDetails.id, federatedAuthenticators, values) + .then((response) => onDataSubmit(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( +
+ +
+ { + federatedAuthenticators + ? ( ( + handleSubmit() } + fluid> + + { federatedAuthenticators.properties + ? () + : null + } + + + + + ) } + />) + : null + } + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/settingsFormSection/settingsFormSelection.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/settingsFormSection/settingsFormSelection.tsx new file mode 100644 index 000000000..ad99c6ebf --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/idpDetailsSections/settingsFormSection/settingsFormSelection.tsx @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProviderFederatedAuthenticatorProperty, IdentityProviderTemplate, + IdentityProviderTemplateModelAuthenticatorProperty, selectedTemplateBaesedonTemplateId +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { HelperTextComponent, infoTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { CopyTextToClipboardCallback, copyTheTextToClipboard } from "@pet-management-webapp/shared/util/util-common"; +import CopyIcon from "@rsuite/icons/Copy"; +import React from "react"; +import { Field } from "react-final-form"; +import { InputGroup, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; + +interface SettingsFormSelectionProps { + templateId: string + federatedAuthenticators: IdentityProviderFederatedAuthenticatorProperty[] +} + +/** + * + * @param prop - templateId, federatedAuthenticators (federatedAuthenticators as a list) + * + * @returns Component of the settings section of the idp interface + */ +export default function SettingsFormSelection(props: SettingsFormSelectionProps) { + + const { templateId, federatedAuthenticators } = props; + + const toaster: Toaster = useToaster(); + + const propList = (): IdentityProviderTemplateModelAuthenticatorProperty[] => { + const selectedTemplate: IdentityProviderTemplate = selectedTemplateBaesedonTemplateId(templateId); + + if (selectedTemplate) { + return selectedTemplate.idp.federatedAuthenticators.authenticators[0].properties; + } else { + return null; + } + }; + + const selectedValue = (key: string): string => { + + const keyFederatedAuthenticator = federatedAuthenticators.filter((obj) => obj.key === key)[0]; + + return keyFederatedAuthenticator ? keyFederatedAuthenticator.value : ""; + }; + + const copyValueToClipboard = (text: string): void => { + const callback: CopyTextToClipboardCallback = () => infoTypeDialog(toaster, "Text copied to clipboard"); + + copyTheTextToClipboard(text, callback); + }; + + return ( + <> + { + propList() + ? propList().map((property) => { + return ( + ( + + { property.displayName } + + + + + { + property.readOnly + ? ( + copyValueToClipboard(selectedValue(property.key)) + } + > + + ) + : null + } + + + + + { meta.error && meta.touched && ( + { meta.error } + ) } + + + ) } + /> + ); + }) + :

Access the console to edit this identity provider

+ } + + + + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/selectIdentityProvider.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/selectIdentityProvider.tsx new file mode 100644 index 000000000..782b73cfd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/idpSection/otherComponents/selectIdentityProvider.tsx @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderTemplate, getImageForTheIdentityProvider } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import Image from "next/image"; +import { Avatar, Modal } from "rsuite"; +import styles from "../../../../../../styles/idp.module.css"; + +interface SelectIdentityProviderProps { + openModal: boolean, + onClose: () => void, + templates: IdentityProviderTemplate[], + onTemplateSelected: (IdentityProviderTemplate) => void +} + +/** + * + * @param prop - openModal (function to open the modal), onClose (what will happen when modal closes), + * templates (templates list), onTemplateSelected + * (what will happen when a particular template is selected) + * + * @returns A modal to select idp's + */ +export default function SelectIdentityProvider(prop: SelectIdentityProviderProps) { + const { openModal, onClose, templates, onTemplateSelected } = prop; + + return ( + + + + + +
+
+ { templates.map((template) => { + + return ( +
onTemplateSelected(template) }> +
+
{ template.name }
+ { template.description } +
+ + + idp image + + +
+ ); + }) } +
+
+
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/manageGroupSectionComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/manageGroupSectionComponent.tsx new file mode 100644 index 000000000..58447ea6b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/manageGroupSectionComponent.tsx @@ -0,0 +1,208 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// eslint-disable-next-line max-len +import { controllerDecodeViewGroups, controllerDecodeViewUsers } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalGroup, InternalUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { SettingsTitleComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import EditIcon from "@rsuite/icons/Edit"; +import TrashIcon from "@rsuite/icons/Trash"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Table } from "rsuite"; +import AddGroupButton from "./otherComponents/addGroupButton"; +import AddGroupComponent from "./otherComponents/addGroupComponent"; +import DeleteGroupComponent from "./otherComponents/deleteGroupComponent"; +import EditGroupComponent from "./otherComponents/editGroupComponent"; +import styles from "../../../../../styles/Settings.module.css"; + +interface ManageGroupSectionComponentProps { + session: Session +} + +/** + * + * @param prop - orgName, orgId, session + * + * @returns A component that will show the groups in a table view + */ +export default function ManageGroupSectionComponent(props: ManageGroupSectionComponentProps) { + + const { session } = props; + + const [ users, setUsers ] = useState([]); + const [ groups, setGroups ] = useState([]); + const [ editGroupOpen, setEditGroupOpen ] = useState(false); + const [ addUserOpen, setAddUserOpen ] = useState(false); + const [ openGroup, setOpenGroup ] = useState(null); + const [ deleteUserOpen, setDeleteUserOpen ] = useState(false); + + const fetchData = useCallback(async () => { + const res = await controllerDecodeViewGroups(session); + + await setGroups(res); + }, [ session ]); + + const fetchAllUsers = useCallback(async () => { + const res = await controllerDecodeViewUsers(session); + + await setUsers(res); + }, [ session ]); + + useEffect(() => { + fetchAllUsers(); + }, [ fetchAllUsers ]); + + useEffect(() => { + if (!editGroupOpen || !addUserOpen) { + fetchData(); + } + }, [ editGroupOpen, addUserOpen, fetchData ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + const { Column, HeaderCell, Cell } = Table; + + const closeEditDialog = (): void => { + setOpenGroup(null); + setEditGroupOpen(false); + }; + + const closeDeleteDialog = (): void => { + setOpenGroup(null); + setDeleteUserOpen(false); + }; + + const onEditClick = (group: InternalGroup): void => { + setOpenGroup(group); + setEditGroupOpen(true); + }; + + const onDeleteClick = (group: InternalGroup): void => { + setOpenGroup(group); + setDeleteUserOpen(true); + }; + + const closeAddUserDialog = (): void => { + setAddUserOpen(false); + }; + + const onAddUserClick = (): void => { + setAddUserOpen(true); + }; + + return ( +
+ { + setOpenGroup + ? () + : null + } + + { + deleteUserOpen + ? () + : null + } + + + + + + + + + { + groups ? + ( +
+ + +
Group
+ +
+ + +
User Store
+ +
+ + +
Edit Group
+ + + { rowData => ( + + onEditClick(rowData as InternalGroup) } + style={ { cursor: "pointer" } }> + + + + ) } + +
+ + +
Delete Group
+ + + { rowData => ( + + onDeleteClick(rowData as InternalGroup) } + style={ { cursor: "pointer" } }> + + + + ) } + +
+ +
+
+ ) + : null + } +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/addGroupButton.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/addGroupButton.tsx new file mode 100644 index 000000000..b38159906 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/addGroupButton.tsx @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Button } from "rsuite"; + +interface AddGroupButtonProps { + onClick : ()=>void +} + +export default function AddGroupButton(props : AddGroupButtonProps) { + + const { onClick } = props; + + return ( + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/addGroupComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/addGroupComponent.tsx new file mode 100644 index 000000000..52be9b829 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/addGroupComponent.tsx @@ -0,0 +1,193 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { controllerDecodeAddGroup } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { AddedGroup, InternalUser, Member, SendGroup } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Checkbox, Loader, Modal, Table, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../styles/Settings.module.css"; + + +interface AddGroupComponentProps { + session: Session + users: InternalUser[] | [], + open: boolean + onClose: () => void +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a group. + */ +export default function AddGroupComponent(props: AddGroupComponentProps) { + + const { session, users, open, onClose } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ checkedUsers, setCheckedUsers ] = useState([]); + + const { Column, HeaderCell, Cell } = Table; + + const toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("groupName", values.groupName, errors); + + return errors; + }; + + const onDataSubmit = (response: boolean | AddedGroup, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Group added to the organization successfully."); + form.restart(); + onClose(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the group. Try again."); + } + setCheckedUsers([]); + }; + + useEffect(() => { + setCheckedUsers([]); + }, [ ]); + + const onSubmit = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodeAddGroup(session, getSendGroupData(checkedUsers,values.groupName) ) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( + + + + + + + +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + <> + +
+ + + +
Users
+
+ + { (rowData: InternalUser) => ( + ) => { + if (checked) { + setCheckedUsers((prevUsers) => + [ ...prevUsers, rowData ]); + } else { + setCheckedUsers((prevUsers) => + prevUsers.filter((user) => user !== rowData) + ); + } + } } + > + { rowData.email } + + ) } + +
+
+
+
+ + +
+ ) } + /> + +
+
+ +
+ +
+
+ + ); +} + +function getSendGroupData(users: InternalUser[], groupName: string) { + const members: Member[] = users.map((user) => ({ + display: "PRIMARY/" + user.email, + value: user.id + })); + + const sendData: SendGroup = { + displayName: "PRIMARY/" + groupName, + members: members, + schemas: [ "urn:ietf:params:scim:schemas:core:2.0:Group" ] + }; + + return sendData; +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/deleteGroupComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/deleteGroupComponent.tsx new file mode 100644 index 000000000..b8e0e3d3e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/deleteGroupComponent.tsx @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + controllerDecodeDeleteGroup +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalGroup } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Modal, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; + +interface DeleteGroupComponentProps { + session: Session + open: boolean + onClose: () => void + group: InternalGroup + getGroups: () => Promise +} + +/** + * + * @param prop - session, user (user details), open (whether the modal open or close), onClose (on modal close) + * + * @returns Modal form to delete the group + */ +export default function DeleteGroupComponent(prop: DeleteGroupComponentProps) { + + const { session, open, onClose, group, getGroups } = prop; + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const toaster = useToaster(); + + const onGroupDelete = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Success", "Group Deleted Successfully"); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while deleting the Group. Try again."); + } + }; + + const onSubmit = (): void => { + controllerDecodeDeleteGroup(session, group?.id) + .then((response) => onGroupDelete(response)) + .finally(() => { + getGroups().finally(); + }); + + onClose(); + }; + + return ( + + + + + + + ( + + + + + ) } + /> + +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/editGroupComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/editGroupComponent.tsx new file mode 100644 index 000000000..144b1c94d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageGroupSection/otherComponents/editGroupComponent.tsx @@ -0,0 +1,220 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + controllerDecodePatchGroupMembers, + controllerDecodePatchGroupName, + controllerDecodeViewUsersInGroup +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { Group, InternalGroup, InternalUser, Member, sendMemberList } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog, warningTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { PatchMethod, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Checkbox, CheckboxGroup, Loader, Modal, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import stylesSettings from "../../../../../../styles/Settings.module.css"; + +interface EditGroupComponentProps { + session: Session + group: InternalGroup + open: boolean + onClose: () => void + userList: InternalUser[] +} + +/** + * + * @param prop - session, user (user details), open (whether the modal open or close), onClose (on modal close) + * + * @returns Modal form to edit the group + */ +export default function EditGroupComponent(prop: EditGroupComponentProps) { + + const { session, group, open, onClose, userList } = prop; + + const toaster = useToaster(); + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ users, setUsers ] = useState([]); + const [ initialAssignedUsers, setInitialAssignedUsers ] = useState([]); + + const fetchData = useCallback(async () => { + const res = await controllerDecodeViewUsersInGroup(session, group?.displayName); + + await setUsers(res); + setInitialAssignedUsers(getInitialAssignedUserEmails(res)); + }, [ open === true ]); + + const getInitialAssignedUserEmails = (users: InternalUser[]): string[] => { + if (users) { + return users.map(user => user.email); + } + + return []; + }; + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("groupName", values.groupName, errors); + + return errors; + }; + + const onDataSubmit = (response: boolean | Group, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Group added to the organization successfully."); + form.restart(); + onClose(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the group. Try again."); + } + }; + + const onRolesSubmit = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Group details edited successfully."); + onClose(); + } else { + warningTypeDialog(toaster, "Groups not Properly Updated", + "Error occured while updating the groups. Try again."); + } + }; + + const onSubmit = async (values: Record, form): Promise => { + const name = "PRIMARY/"+ values.groupName; + + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodePatchGroupName(session, group.id, PatchMethod.REPLACE, "displayName", name) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + + controllerDecodePatchGroupMembers(session, group.id, PatchMethod.REPLACE, getMembers(userList, values.users)) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + + + }; + + return ( + + + + + + +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + <> + + + + + { userList.map(user => ( + + { user.email } + + )) } + + + + + + + ) } + /> +
+
+ +
+ +
+
+ ); +} + +function getMembers(fullUserList: InternalUser[], checkedUsers: string): sendMemberList { + const usernames = checkedUsers.toString().split(",").map(username => username.trim()); + const members: Member[] = []; + + for (const user of fullUserList) { + if (usernames.includes(user.email)) { + members.push({ + display: "PRIMARY/" + user.email, + value: user.id + }); + } + } + + const result: sendMemberList = { + members: members + }; + + return result; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/manageUserSectionComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/manageUserSectionComponent.tsx new file mode 100644 index 000000000..dd27a088c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/manageUserSectionComponent.tsx @@ -0,0 +1,195 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { controllerDecodeViewUsers } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { SettingsTitleComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import EditIcon from "@rsuite/icons/Edit"; +import TrashIcon from "@rsuite/icons/Trash"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Table } from "rsuite"; +import AddUserButton from "./otherComponents/addUserButton"; +import AddUserComponent from "./otherComponents/addUserComponent"; +import EditUserComponent from "./otherComponents/editUserComponent"; +import styles from "../../../../../styles/Settings.module.css"; +import DeleteUserComponent from "./otherComponents/deleteUserComponent"; + +interface ManageUserSectionComponentProps { + session: Session +} + +/** + * + * @param prop - orgName, orgId, session + * + * @returns A component that will show the users in a table view + */ +export default function ManageUserSectionComponent(props: ManageUserSectionComponentProps) { + + const { session } = props; + + const [ users, setUsers ] = useState([]); + const [ editUserOpen, setEditUserOpen ] = useState(false); + const [ addUserOpen, setAddUserOpen ] = useState(false); + const [ openUser, setOpenUser ] = useState(null); + const [ deleteUserOpen, setDeleteUserOpen ] = useState(false); + + const fetchData = useCallback(async () => { + const res = await controllerDecodeViewUsers(session); + + await setUsers(res); + }, [ session ]); + + useEffect(() => { + if (!editUserOpen || !addUserOpen) { + fetchData(); + } + }, [ editUserOpen, addUserOpen, fetchData ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + const { Column, HeaderCell, Cell } = Table; + + const closeEditDialog = (): void => { + setOpenUser(null); + setEditUserOpen(false); + }; + + const onEditClick = (user: InternalUser): void => { + setOpenUser(user); + setEditUserOpen(true); + }; + + const closeAddUserDialog = (): void => { + setAddUserOpen(false); + }; + + const onAddUserClick = (): void => { + setAddUserOpen(true); + }; + + const onDeleteClick = (user: InternalUser): void => { + setOpenUser(user); + setDeleteUserOpen(true); + }; + + const closeDeleteDialog = (): void => { + setOpenUser(null); + setDeleteUserOpen(false); + }; + + return ( +
+ { + openUser + ? () + : null + } + + { + deleteUserOpen + ? () + : null + } + + + + + + + + { + users ? + ( + +
First Name
+ +
+ + +
Last Name
+ +
+ + +
Email (Username)
+ +
+ + +
Edit User
+ + + { rowData => ( + + onEditClick(rowData as InternalUser) } + style={ { cursor: "pointer" } }> + + + + ) } + +
+ + +
Delete User
+ + + { rowData => ( + + onDeleteClick(rowData as InternalUser) } + style={ { cursor: "pointer" } }> + + + + ) } + +
+ +
) + : null + } +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/addUserButton.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/addUserButton.tsx new file mode 100644 index 000000000..63ceb8ef5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/addUserButton.tsx @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Button } from "rsuite"; + +interface AddUserButtonProps { + onClick : ()=>void +} + +export default function AddUserButton(props : AddUserButtonProps) { + + const { onClick } = props; + + return ( + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/addUserComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/addUserComponent.tsx new file mode 100644 index 000000000..7a65b2b0c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/addUserComponent.tsx @@ -0,0 +1,434 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { InviteConst, controllerDecodeAddUser, controllerDecodeListAllRoles, controllerDecodePatchRole } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { PatchMethod, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import EmailFillIcon from "@rsuite/icons/EmailFill"; +import { postDoctor } from "apps/business-admin-app/APICalls/CreateDoctor/post-doc"; +import { Doctor, DoctorInfo } from "apps/business-admin-app/types/doctor"; +import { AxiosResponse } from "axios"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Divider, Loader, Modal, Panel, Radio, RadioGroup, SelectPicker, Stack, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../styles/Settings.module.css"; +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; + + +interface AddUserComponentProps { + session: Session + open: boolean + onClose: () => void + isDoctor: boolean +} + +/** + * + * @param prop - session, open (whether modal open or close), onClose (on modal close) + * + * @returns Modal to add a user. + */ +export default function AddUserComponent(props: AddUserComponentProps) { + + const { session, open, onClose, isDoctor } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ inviteSelect, serInviteSelect ] = useState(InviteConst.INVITE); + const [ userTypeSelect, setUserTypeSelect ] = useState(isDoctor? "DOCTOR" : "PET_OWNER"); + const [ inviteShow, setInviteShow ] = useState(LOADING_DISPLAY_BLOCK); + const [ passwordShow, setPasswordShow ] = useState(LOADING_DISPLAY_NONE); + const [ rolesList, setRolesList ] = useState([]); + + const toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("firstName", values.firstName, errors); + errors = fieldValidate("familyName", values.familyName, errors); + errors = fieldValidate("email", values.email, errors); + if (inviteSelect === InviteConst.PWD) { + errors = fieldValidate("password", values.password, errors); + } + + // if (userTypeSelect === "DOCTOR") { + // errors = fieldValidate("DateOfBirth", values.DateOfBirth, errors); + // errors = fieldValidate("Gender", values.Gender, errors); + // errors = fieldValidate("Specialty", values.Specialty, errors); + // errors = fieldValidate("Address", values.Address, errors); + // } + + return errors; + }; + + const inviteSelectOnChange = (value: InviteConst): void => { + serInviteSelect(value); + + switch (value) { + case InviteConst.INVITE: + setInviteShow(LOADING_DISPLAY_BLOCK); + setPasswordShow(LOADING_DISPLAY_NONE); + + break; + + case InviteConst.PWD: + setInviteShow(LOADING_DISPLAY_NONE); + setPasswordShow(LOADING_DISPLAY_BLOCK); + + break; + } + }; + + const userTypeList: {[key: string]: string}[] = [ + { + label: "Pet Owner", + value: "PET_OWNER" + }, + { + label: "Doctor", + value: "DOCTOR" + }, + { + label: "Admin", + value: "ADMIN" + } + ]; + + const fetchAllRoles = useCallback(async () => { + + const res = await controllerDecodeListAllRoles(session); + + if (res) { + setRolesList(res); + } else { + setRolesList([]); + } + + }, [ session ]); + + useEffect(() => { + fetchAllRoles(); + }, [ fetchAllRoles ]); + + const userTypeSelectOnChange = (eventKey: any): void => { + setUserTypeSelect(eventKey); + }; + + const onUserSubmit = (response: boolean | User, form): void => { + if (response) { + // successTypeDialog(toaster, "Changes Saved Successfully", "User added to the organization successfully."); + form.restart(); + onClose(); + } else { + // errorTypeDialog(toaster, "Error Occured", "Error occured while adding the user. Try again."); + } + }; + + const onDoctorSubmit = (response: AxiosResponse, form): void => { + if (response) { + // successTypeDialog(toaster, "Changes Saved Successfully", "Doctor add to the organization successfully."); + form.restart(); + onClose(); + } else { + // errorTypeDialog(toaster, "Error Occured", "Error occured while adding the doctor. Try again."); + } + }; + + const onRoleSubmit = (response) => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "User added to the organization successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the user. Try again."); + } + }; + + const onSubmit = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodeAddUser(session, inviteSelect, values.firstName, values.familyName, values.email, + values.password) + .then((response1) => { + onUserSubmit(response1, form); + let roleDetails: Role; + + if (userTypeSelect === "DOCTOR") { + const payload: DoctorInfo = { + address: values.Address ? values.Address : "", + availability: [], + dateOfBirth: values.DateOfBirth ? values.DateOfBirth : "", + emailAddress: values.email, + gender: values.Gender ? values.Gender : "", + name: values.firstName + " " + values.familyName, + registrationNumber: values.RegistrationNumber, + specialty: values.Specialty ? values.Specialty : "N/A" + }; + + postDoctor(session.accessToken, payload) + .then((response) => onDoctorSubmit(response, form)); + + roleDetails = rolesList.find((role) => role.displayName === "pet-care-doctor"); + + controllerDecodePatchRole(session, roleDetails.id, PatchMethod.ADD, "users", response1.id) + .then((response) => onRoleSubmit(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + } + + if (userTypeSelect === "ADMIN") { + roleDetails = rolesList.find((role) => role.displayName === "pet-care-admin"); + controllerDecodePatchRole(session, roleDetails.id, PatchMethod.ADD, "users", response1.id) + .then((response) => onRoleSubmit(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + } + + if (userTypeSelect === "PET_OWNER") { + roleDetails = rolesList.find((role) => role.displayName === "pet-care-pet-owner"); + + controllerDecodePatchRole(session, roleDetails.id, PatchMethod.ADD, "users", response1.id) + .then((response) => onRoleSubmit(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + } + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + + + + }; + + const options = [ + { value: "male", label: "Male" }, + { value: "female", label: "Female" } + ]; + + return ( + + + { + isDoctor + ? ( + + ) + : ( + + ) + } + + +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + { + !isDoctor && ( + + + + ) + } + { + userTypeSelect === "DOCTOR" + ? ( + + ) + : null + } + + + + + + + + + + + + + + + + { + userTypeSelect === "DOCTOR" + ? ( + <> + + + + + + { /* */ } + + + + + + + + + + + + ) + : null + } + + + Select the method to set the user password + + Invite the user to set their own password + + +
+ +
+ +
+ + Set a password for the user + +
+
+ + + + + + {/* + + */} + +
+ +
+
+ + + +
+ ) } + /> + +
+
+ +
+ +
+
+ + ); +} + +function EmailInvitePanel() { + return ( + + + + An email with a confirmation link will be sent to the provided + email address for the user to set their own password. + + + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/deleteUserComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/deleteUserComponent.tsx new file mode 100644 index 000000000..8ae2784ee --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/deleteUserComponent.tsx @@ -0,0 +1,109 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + controllerDecodeDeleteUser +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, ModelHeaderComponent } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { deleteDoctor } from "apps/business-admin-app/APICalls/DeleteDoctor/delete-doctor"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Modal, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; + +interface DeleteUserComponentProps { + session: Session + open: boolean + onClose: () => void + user: InternalUser + getUsers: () => Promise +} + +/** + * + * @param prop - session, user (user details), open (whether the modal open or close), onClose (on modal close) + * + * @returns Modal form to delete the user + */ +export default function DeleteUserComponent(prop: DeleteUserComponentProps) { + + const { session, open, onClose, user, getUsers } = prop; + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const toaster = useToaster(); + + const onUserDelete = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Success", "User Deleted Successfully"); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while deleting the User. Try again."); + } + }; + + const onSubmit = (): void => { + + deleteDoctor(session.accessToken, user.email) + .catch((e) => { + // + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + + controllerDecodeDeleteUser(session, user?.id) + .then((response) => onUserDelete(response)) + .finally(() => { + getUsers().finally(); + }); + + onClose(); + }; + + return ( + + + + + + + ( + + + + + ) } + /> + +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/editUserComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/editUserComponent.tsx new file mode 100644 index 000000000..a3944658a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/manageUserSection/otherComponents/editUserComponent.tsx @@ -0,0 +1,257 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeEditRolesToAddOrRemoveUser, controllerDecodeEditUser, controllerDecodeListAllRoles, + controllerDecodeUserRole +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalUser, User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField, ModelHeaderComponent } + from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog, warningTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Divider, Loader, Modal, TagPicker, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import stylesSettings from "../../../../../../styles/Settings.module.css"; + +interface EditUserComponentProps { + session: Session + user: InternalUser + open: boolean + onClose: () => void +} + +/** + * + * @param prop - session, user (user details), open (whether the modal open or close), onClose (on modal close) + * + * @returns Modal form to edit the user + */ +export default function EditUserComponent(prop: EditUserComponentProps) { + + const { session, user, open, onClose } = prop; + + const toaster = useToaster(); + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ allRoles, setAllRoles ] = useState(null); + const [ userRoles, setUserRoles ] = useState(null); + const [ userRolesForForm, setUserRolesForForm ] = useState(null); + const [ initUserRolesForForm, setInitUserRolesForForm ] = useState(null); + + /** + * fetch all the roles in the identity server available for the logged in organization + */ + const fetchAllRoles = useCallback(async () => { + const res = await controllerDecodeListAllRoles(session); + + await setAllRoles(res); + }, [ session ]); + + useEffect(() => { + fetchAllRoles(); + }, [ fetchAllRoles ]); + + /** + * fetch the roles of the user + */ + const fetchUserRoles = useCallback(async () => { + const res = await controllerDecodeUserRole(session, user.id); + + await setUserRoles(res); + + }, [ session, user ]); + + useEffect(() => { + fetchUserRoles(); + }, [ fetchUserRoles ]); + + /** + * set `userRolesForForm` and `initUserRolesForForm` + */ + useEffect(() => { + if (allRoles && userRoles) { + try { + setUserRolesForForm(allRoles.map(role => ({ + label: role.displayName, + value: role.meta.location + }))); + + setInitUserRolesForForm(userRoles.map(role => (role.meta.location))); + } catch (err) { + setUserRolesForForm(null); + setInitUserRolesForForm([]); + } + } + }, [ allRoles, userRoles ]); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("firstName", values.firstName, errors); + errors = fieldValidate("familyName", values.familyName, errors); + errors = fieldValidate("email", values.email, errors); + errors = fieldValidate("username", values.username, errors); + errors = fieldValidate("roles", values.roles, errors); + + return errors; + }; + + const onDataSubmit = (response: User): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "User details edited successfully."); + onClose(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while editing the user. Try again."); + } + }; + + const onRolesSubmit = (response: boolean): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "User details edited successfully."); + onClose(); + } else { + warningTypeDialog(toaster, "Roles not Properly Updated", + "Error occured while updating the roles. Try again."); + } + }; + + const onSubmit = async (values: Record): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + + await controllerDecodeEditUser(session, user.id, values.firstName as string, values.familyName as string, + values.email as string) + .then((response) => { + if (initUserRolesForForm) { + if (response) { + controllerDecodeEditRolesToAddOrRemoveUser( + session, user.id, initUserRolesForForm, values.roles as string[]) + .then((res) => { + onRolesSubmit(res); + }); + } else { + onDataSubmit(response); + } + } else { + onDataSubmit(response); + } + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( + + + + + + +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + + { + userRolesForForm + ? (<> + + + + + + ) + : null + } + + + + + ) } + /> +
+
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/configureMfaSection.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/configureMfaSection.tsx new file mode 100644 index 000000000..770ba30d0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/configureMfaSection.tsx @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SettingsTitleComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { EMAIL, SMS, TOTP } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { Container, FlexboxGrid } from "rsuite"; +import EmailAsMFA from "./emailAsMFA"; +import SmsAsMFA from "./smsAsMFA"; +import TotpAsMFA from "./totpAsMFA"; +import styles from "../../../../../styles/idp.module.css"; + +interface ConfigureMFASectionProps { + session: Session +} + +export default function ConfigureMFASection(props: ConfigureMFASectionProps) { + + const { session } = props; + + return ( + + + + +
+ + + +
+
+ +
+ ); + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/confirmMFAAddRemoveModal.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/confirmMFAAddRemoveModal.tsx new file mode 100644 index 000000000..0402c9f4f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/confirmMFAAddRemoveModal.tsx @@ -0,0 +1,234 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Application, PatchApplicationAuthMethod } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodePatchApplicationAuthStepsWithAuthenticator } from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import React, { useState } from "react"; +import { Avatar, Button, Col, Grid, Loader, Modal, Row, Toaster, useToaster } from "rsuite"; +import stylesSettings from "../../../../../styles/Settings.module.css"; + +interface ApplicationListItemProps { + applicationDetail: Application +} + +interface ApplicationListAvailableProps { + applicationDetail: Application, + idpIsinAuthSequence: boolean +} + +interface ConfirmMFAAddRemoveModalProps { + session: Session, + applicationDetail: Application, + authenticator: string, + idpIsinAuthSequence: boolean, + openModal: boolean, + onModalClose: () => void, +} + +/** + * + * @param prop - session, applicationDetail, idpDetails, idpIsinAuthSequence, openModal, onModalClose, fetchAllIdPs + * + * @returns Add/Remove from login flow button + */ +export default function ConfirmMFAAddRemoveModal(props: ConfirmMFAAddRemoveModalProps) { + + const { session, applicationDetail, authenticator, idpIsinAuthSequence, openModal, onModalClose} + = props; + + const toaster: Toaster = useToaster(); + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const onSuccess = (): void => { + onModalClose(); + }; + + const onIdpAddToLoginFlow = (response: boolean): void => { + if (response) { + onSuccess(); + successTypeDialog(toaster, "Success", "MFA added to the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while adding the MFA."); + } + }; + + const onIdpRemovefromLoginFlow = (response: boolean): void => { + if (response) { + onSuccess(); + successTypeDialog(toaster, "Success", "MFA removed from the Login Flow Successfully."); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while removing the MFA."); + } + }; + + const onSubmit = async (patchApplicationAuthMethod): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + + controllerDecodePatchApplicationAuthStepsWithAuthenticator(session, applicationDetail, authenticator, + patchApplicationAuthMethod) + .then((response) => idpIsinAuthSequence + ? onIdpRemovefromLoginFlow(response) + : onIdpAddToLoginFlow(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + const onRemove = async (): Promise => { + await onSubmit(PatchApplicationAuthMethod.REMOVE); + }; + + const onAdd = async (): Promise => { + await onSubmit(PatchApplicationAuthMethod.ADD); + }; + + return ( + + + + { + idpIsinAuthSequence + ? "Remove MFA from the Login Flow" + : "Add MFA to the Login Flow" + } + + + + { + checkIfJSONisEmpty(applicationDetail) + ? + : () + } + + + + + + +
+ +
+ +
+ ); +} + +/** + * + * @returns When then `config.ManagementAPIConfig.SharedApplicationName` is not the correct applicaiton, + * it will show this section + */ +function EmptySelectApplicationBody() { + + return ( +
+

No Application Available

+
+
Create an application from WSO2 IS app to add authentication.
+

For more details check out the following links

+ +
+ +
+ ); +} + +/** + * + * @param prop - idpIsinAuthSequence, applicationDetail + * + * @returns When then config.ManagementAPIConfig.SharedApplicationName is the correct applicaiton, + * it will show this section + */ +function ApplicationListAvailable(props: ApplicationListAvailableProps) { + + const { idpIsinAuthSequence, applicationDetail } = props; + + return ( +
+ { + idpIsinAuthSequence + ? (

This will remove the MFA as an authentication step to the authentication flow of the following + applicaiton

) + : (

This will add the MFA as an authentication step to the authentication flow of the following + applicaiton

) + } + + { + idpIsinAuthSequence + ? + : + } + +

Please confirm your action to proceed

+ +
+ ); + +} + +/** + * + * @param prop - application + * + * @returns The component to show the applicaiton name and the description + */ +function ApplicationListItem(props: ApplicationListItemProps) { + + const { applicationDetail } = props; + + return ( +
+ + + + { applicationDetail.name[0] } + + + +
{ applicationDetail.name }
+

{ applicationDetail.description }

+ +
+
+
+ + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/emailAsMFA.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/emailAsMFA.tsx new file mode 100644 index 000000000..8b733fe03 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/emailAsMFA.tsx @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, ApplicationList, checkIfAuthenticatorIsinAuthSequence +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeGetApplication, controllerDecodeListCurrentApplication +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { AccordianItemHeaderComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { EMAIL, EMAIL_OTP_AUTHENTICATOR, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { + LOADING_DISPLAY_NONE} from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Button, FlexboxGrid } from "rsuite"; +import ConfirmMFAAddRemoveModal from "./confirmMFAAddRemoveModal"; +import { getImageForMFAProvider } from "./mfaProviderUtils"; + +interface EmailAsMFAProps { + session: Session, + id: string +} + +/** + * + * @param prop - session, id (idp id), fetchAllIdPs (function to fetch all Idps) + * + * @returns idp item details component + */ +export default function EmailAsMFA(props: EmailAsMFAProps) { + + const { session } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + const [ idpIsinAuthSequence, setIdpIsinAuthSequence ] = useState(null); + const [ openListAppicationModal, setOpenListAppicationModal ] = useState(false); + + const fetchData = useCallback(async () => { + const res : ApplicationList = ( await controllerDecodeListCurrentApplication(session) as ApplicationList ); + + await setAllApplications(res); + }, [ session, openListAppicationModal ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res : Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application ); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + useEffect(() => { + if (!checkIfJSONisEmpty(applicationDetail)) { + const check = checkIfAuthenticatorIsinAuthSequence(applicationDetail, EMAIL_OTP_AUTHENTICATOR); + + setIdpIsinAuthSequence(check[0]); + } + }, [ applicationDetail ]); + + const onAddToLoginFlowClick = (): void => { + setOpenListAppicationModal(true); + }; + + const onCloseListAllApplicaitonModal = (): void => { + setOpenListAppicationModal(false); + }; + + return ( +
+ + + + + + { + idpIsinAuthSequence === null + ? null + : idpIsinAuthSequence + ? ( + + + ) + : ( + + + ) + } + + +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/mfaProviderUtils.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/mfaProviderUtils.ts new file mode 100644 index 000000000..0cf27aff8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/mfaProviderUtils.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { EMAIL, EMPTY_STRING, SMS, TOTP } from "@pet-management-webapp/shared/util/util-common"; +import emailOTPImage from "../../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/email-solid.svg"; +import smsOTPImage from "../../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/sms-otp.svg"; +import totpOTPImage from "../../../../../../../libs/business-admin-app/ui/ui-assets/src/lib/images/totp.svg"; + +export function getImageForMFAProvider(providerId: string): string { + if (providerId === EMAIL) { + return emailOTPImage; + } + if (providerId === SMS) { + return smsOTPImage; + } + if (providerId === TOTP) { + return totpOTPImage; + } + + return EMPTY_STRING; +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/smsAsMFA.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/smsAsMFA.tsx new file mode 100644 index 000000000..914476e8a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/smsAsMFA.tsx @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, ApplicationList, checkIfAuthenticatorIsinAuthSequence +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeGetApplication, controllerDecodeListCurrentApplication +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { AccordianItemHeaderComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { SMS, SMS_OTP_AUTHENTICATOR, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { + LOADING_DISPLAY_NONE} from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Button, FlexboxGrid } from "rsuite"; +import ConfirmMFAAddRemoveModal from "./confirmMFAAddRemoveModal"; +import { getImageForMFAProvider } from "./mfaProviderUtils"; + +interface SmsAsMFAProps { + session: Session, + id: string +} + + +export default function SmsAsMFA(props: SmsAsMFAProps) { + + const { session } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + const [ idpIsinAuthSequence, setIdpIsinAuthSequence ] = useState(null); + const [ openListAppicationModal, setOpenListAppicationModal ] = useState(false); + + const fetchData = useCallback(async () => { + const res : ApplicationList = ( await controllerDecodeListCurrentApplication(session) as ApplicationList ); + + await setAllApplications(res); + }, [ session, openListAppicationModal ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res : Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application ); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + useEffect(() => { + if (!checkIfJSONisEmpty(applicationDetail)) { + const check = checkIfAuthenticatorIsinAuthSequence(applicationDetail, SMS_OTP_AUTHENTICATOR); + + setIdpIsinAuthSequence(check[0]); + } + }, [ applicationDetail ]); + + const onAddToLoginFlowClick = (): void => { + setOpenListAppicationModal(true); + }; + + const onCloseListAllApplicaitonModal = (): void => { + setOpenListAppicationModal(false); + }; + + return ( +
+ + + + + { + idpIsinAuthSequence === null + ? null + : idpIsinAuthSequence + ? ( + + + ) + : ( + + + ) + } + + + +
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/totpAsMFA.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/totpAsMFA.tsx new file mode 100644 index 000000000..d8522b8d7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/mfaSection/totpAsMFA.tsx @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, ApplicationList, checkIfAuthenticatorIsinAuthSequence +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeGetApplication, controllerDecodeListCurrentApplication +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { AccordianItemHeaderComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { TOTP, TOTP_OTP_AUTHENTICATOR, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Button, FlexboxGrid } from "rsuite"; +import ConfirmMFAAddRemoveModal from "./confirmMFAAddRemoveModal"; +import { getImageForMFAProvider } from "./mfaProviderUtils"; + +interface TotpAsMFAProps { + session: Session, + id: string +} + + +export default function TotpAsMFA(props: TotpAsMFAProps) { + + const { session } = props; + + const [ allApplications, setAllApplications ] = useState(null); + const [ applicationDetail, setApplicationDetail ] = useState(null); + const [ idpIsinAuthSequence, setIdpIsinAuthSequence ] = useState(null); + const [ openListAppicationModal, setOpenListAppicationModal ] = useState(false); + + const fetchData = useCallback(async () => { + const res: ApplicationList = (await controllerDecodeListCurrentApplication(session) as ApplicationList); + + await setAllApplications(res); + }, [ session, openListAppicationModal ]); + + const fetchApplicatioDetails = useCallback(async () => { + if (!checkIfJSONisEmpty(allApplications) && allApplications.totalResults !== 0) { + const res: Application = ( + await controllerDecodeGetApplication(session, allApplications.applications[0].id) as Application); + + await setApplicationDetail(res); + } + }, [ session, allApplications ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + useEffect(() => { + fetchApplicatioDetails(); + }, [ fetchApplicatioDetails ]); + + useEffect(() => { + if (!checkIfJSONisEmpty(applicationDetail)) { + const check = checkIfAuthenticatorIsinAuthSequence(applicationDetail, TOTP_OTP_AUTHENTICATOR); + + setIdpIsinAuthSequence(check[0]); + } + }, [ applicationDetail ]); + + const onAddToLoginFlowClick = (): void => { + setOpenListAppicationModal(true); + }; + + const onCloseListAllApplicaitonModal = (): void => { + setOpenListAppicationModal(false); + }; + + return ( + + +
+ + + + + { + idpIsinAuthSequence === null + ? null + : idpIsinAuthSequence + ? ( + + + ) + : ( + + + ) + } + + +
+ + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/colorPalettePlugin.js b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/colorPalettePlugin.js new file mode 100644 index 000000000..dabb0e3ac --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/colorPalettePlugin.js @@ -0,0 +1,123 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const tinycolor = require("tinycolor2"); + +// Primary color number. +var PRIMARY_INDEX = 5; +var HUE_MAX = 360; +var SATURATION_MIN = 5; +var SATURATION_MAX = 100; +var BRIGHTNESS_MIN = 20; +var BRIGHTNESS_MAX = 100; + +var COLOR_NUMBER_SET = [ "50", "100", "200", "300", "400", "500", "600", "700", "800", "900" ]; + +function calculateHue(originalHue, index) { + originalHue = Math.round(originalHue) || 360; + // Dark color increase , light color reduction + const step = index - PRIMARY_INDEX; + const gap = 1; + const hue = originalHue + step * gap; + + // The value of hue is [0,360). + // If it is greater than 360, the absolute value of the difference is taken. + return hue >= HUE_MAX ? Math.abs(hue - HUE_MAX) : hue; +} + +function calculateSaturation(originalSaturation, index) { + originalSaturation = Math.round(originalSaturation * 100); + // Dark color increase , light color reduction + const step = index - PRIMARY_INDEX; + const gap = Math.round( + (step > 0 && (100 - originalSaturation) / 4) || + (originalSaturation > SATURATION_MIN && (originalSaturation - 5) / 5) || + 1 + ); + const saturation = originalSaturation + step * gap; + + return ( + // The value range of saturation is [5,100] + ((saturation < SATURATION_MIN && SATURATION_MIN) || + (saturation > SATURATION_MAX && SATURATION_MAX) || + saturation) / 100 + ); +} + +function calculateBrightnessAdjustValue(brightness, step) { + if (step < 0) { + if (brightness > 40) { + // BasicGap rounded up to avoid a situation of 0. + let basicGap = Math.ceil((brightness - 40) / 4 / 4); + const levels = Math.abs(step); + // Less than 40, the brightness is smaller. + // n is a multiple of the reduction base (increased by the arithmetic progression) + const n = ((1 + levels) * levels) / 2; + + return -1 * basicGap * n; + } + + return Math.round(step * ((brightness - 20) / 4)); + } + + return Math.round(step * ((100 - brightness) / 5)); +} + +function calculateBrightness(originalBrightness, index) { + originalBrightness = Math.round(originalBrightness * 100); + // Light color reduction , dark color increase. + const step = PRIMARY_INDEX - index; + // When originalBrightness is less than 20, no adjustment. + + if (step < 0 && originalBrightness < BRIGHTNESS_MIN) { + return originalBrightness / 100; + } + const adjustValue = calculateBrightnessAdjustValue(originalBrightness, step); + const brightness = originalBrightness + adjustValue; + + return ( + // The range of brightness is [20,100] + ((brightness < BRIGHTNESS_MIN && BRIGHTNESS_MIN) || + (brightness > BRIGHTNESS_MAX && BRIGHTNESS_MAX) || + brightness) / 100 + ); +} + +export function palette(color, colorNumber) { + const hexColour = tinycolor(color); + const { r, g, b, a } = { r: hexColour["_r"], g: hexColour["_g"], b: hexColour["_b"], a: hexColour["_a"] }; + + // Assuming color is an object like: { r: 255, g: 0, b: 0, a: 1 } + const hsv = tinycolor({ r, g, b, a }).toHsv(); // You might need to handle this conversion + + const index = COLOR_NUMBER_SET.indexOf(String(colorNumber)); + + if (index === -1 || index === PRIMARY_INDEX) { + + return color; // Return the original color if not found in the set or it's the primary index + } + + const newHue = calculateHue(hsv.h, index); + const newSaturation = calculateSaturation(hsv.s, index); + const newBrightness = calculateBrightness(hsv.v, index); + + // Assuming tinycolor is available for color manipulation + const modifiedColor = "#" + tinycolor({ h: newHue, s: newSaturation, v: newBrightness }).toHex(); + + return modifiedColor; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationDesignSection.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationDesignSection.tsx new file mode 100644 index 000000000..459bad00a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationDesignSection.tsx @@ -0,0 +1,152 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../styles/Settings.module.css"; + +interface GeneralProps { + session: Session +} + +/** + * + * @param prop - fetchData (function to fetch data after form is submitted), session, idpDetails + * + * @returns The general section of an idp + */ +export default function PersonalizationDesignSection(props: GeneralProps) { + + const { session } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const toaster: Toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("display_name", values.display_name, errors); + errors = fieldValidate("contact_email", values.contact_email, errors); + + return errors; + }; + + const onDataSubmit = (response: IdentityProvider, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully"); + form.restart(); + } else { + errorTypeDialog(toaster, "Error occured while updating the Idp. Try again."); + } + }; + + const onUpdate = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + setLoadingDisplay(LOADING_DISPLAY_NONE); + }; + + return ( +
+ +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + + + + + + + + + ) } + /> + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationGeneralSection.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationGeneralSection.tsx new file mode 100644 index 000000000..1cc3638e1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationGeneralSection.tsx @@ -0,0 +1,126 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../styles/Settings.module.css"; + +interface GeneralProps { + session: Session +} + +/** + * + * @param prop - fetchData (function to fetch data after form is submitted), session, idpDetails + * + * @returns The general section of an idp + */ +export default function PersonalizationGeneralSection(props: GeneralProps) { + + const { session } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const toaster: Toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("display_name", values.display_name, errors); + errors = fieldValidate("contact_email", values.contact_email, errors); + + return errors; + }; + + const onDataSubmit = (response: IdentityProvider, form): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully"); + form.restart(); + } else { + errorTypeDialog(toaster, "Error occured while updating the Idp. Try again."); + } + }; + + const onUpdate = async (values: Record, form): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + setLoadingDisplay(LOADING_DISPLAY_NONE); + }; + + return ( +
+ +
+ + ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + ) } + /> + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationSectionComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationSectionComponent.tsx new file mode 100644 index 000000000..c216342cd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalizationSectionComponent.tsx @@ -0,0 +1,280 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + BrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { + controllerDecodeRevertBrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { + SettingsTitleComponent +} from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { deletePersonalization } from "apps/business-admin-app/APICalls/DeletePersonalization/delete-personalization"; +import { getPersonalization } from "apps/business-admin-app/APICalls/GetPersonalization/get-personalization"; +import { postPersonalization } from "apps/business-admin-app/APICalls/UpdatePersonalization/post-personalization"; +import { Personalization } from "apps/business-admin-app/types/personalization"; +import controllerDecodeGetBrandingPreference + from "libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeGetBrandingPreference"; +import controllerDecodeUpdateBrandingPreference + from "libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeUpdateBrandingPreference"; +import { Session } from "next-auth"; +import React, { useCallback, useEffect, useState } from "react"; +import { Field, Form } from "react-final-form"; +import { Button, Container, Divider, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import personalize from "./personalize"; +import styles from "../../../../../styles/Settings.module.css"; +import { ChromePicker } from 'react-color'; + +interface PersonalizationSectionComponentProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The personalization interface section. + */ +export default function PersonalizationSectionComponent(props: PersonalizationSectionComponentProps) { + + const { session } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const toaster: Toaster = useToaster(); + + const [ brandingPreference, setBrandingPreference ] = useState(null); + const [ logoUrl, setLogoUrl ] = useState(""); + const [ logoAltText, setLogoAltText ] = useState(""); + const [ favicon, setFavicon ] = useState(""); + const [ primaryColor, setPrimaryColor ] = useState(""); + const [ secondaryColor, setSecondaryColor ] = useState(""); + + const fetchData = useCallback(async () => { + fetchBrandingPreference(); + }, [ session ]); + + useEffect(() => { + fetchData(); + fetchBrandingPreference(); + }, [ fetchData ]); + + const fetchBrandingPreference = async () => { + const res: BrandingPreference = (await controllerDecodeGetBrandingPreference(session) as BrandingPreference); + const activeTheme: string = res["preference"]["theme"]["activeTheme"]; + + setLogoUrl(res["preference"]["theme"][activeTheme]["images"]["logo"]["imgURL"]); + setLogoAltText(res["preference"]["theme"][activeTheme]["images"]["logo"]["altText"]); + setFavicon(res["preference"]["theme"][activeTheme]["images"]["favicon"]["imgURL"]); + setPrimaryColor(res["preference"]["theme"][activeTheme]["colors"]["primary"]["main"]); + setSecondaryColor(res["preference"]["theme"][activeTheme]["colors"]["secondary"]["main"]); + + setBrandingPreference(res); + }; + + const onUpdate = async (values: Record, form): Promise => { + + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + const activeTheme: string = brandingPreference["preference"]["theme"]["activeTheme"]; + + brandingPreference["preference"]["theme"][activeTheme]["images"]["logo"]["imgURL"] = values["logo_url"]; + brandingPreference["preference"]["theme"][activeTheme]["images"]["logo"]["altText"] = values["logo_alt_text"]; + brandingPreference["preference"]["theme"][activeTheme]["images"]["favicon"]["imgURL"] = values["favicon_url"]; + brandingPreference["preference"]["theme"][activeTheme]["colors"]["primary"]["main"] = values["primary_color"]; + brandingPreference["preference"]["theme"][activeTheme]["colors"]["secondary"]["main"] = + values["secondary_color"]; + + controllerDecodeUpdateBrandingPreference(session, brandingPreference) + .then(() => { + const newPersonalization: Personalization = { + faviconUrl: values["favicon_url"], + logoAltText: values["logo_alt_text"], + logoUrl: values["logo_url"], + org: session.orgId, + primaryColor: values["primary_color"], + secondaryColor: values["secondary_color"] + }; + + postPersonalization(session.accessToken, newPersonalization) + .then(() => { + personalize(newPersonalization); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + fetchBrandingPreference(); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + setLoadingDisplay(LOADING_DISPLAY_NONE); + }; + + const onRevert = async (): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodeRevertBrandingPreference(session) + .then(() => { + deletePersonalization(session.accessToken) + .then(() => { + getPersonalization(session.orgId) + .then((response) => { + personalize(response.data); + }); + }); + fetchBrandingPreference(); + }) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + const ColorPickerField = ({ input, meta, label, helperText }) => ( + + {label} + input.onChange(color.hex)} + /> + {meta.touched && meta.error ? meta.error : helperText} + + ); + + return ( + + + + +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + + + + + + {/* + ( + onChange(color.hex, event)} + /> + ) }/> + */} + + {/* + + */} + + + + + + + + )} + /> + + +
+
+ ); + +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalize.js b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalize.js new file mode 100644 index 000000000..c5056d46f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalize.js @@ -0,0 +1,175 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +const cp = require("./colorPalettePlugin.js"); + +function changeFavicon(newFaviconUrl) { + const head = document.head || document.getElementsByTagName("head")[0]; + + // Remove existing favicon, if any + const existingFavicons = document.querySelectorAll("link[rel='icon']"); + + existingFavicons.forEach(favicon => { + head.removeChild(favicon); + }); + + // Create a new link tag for the new favicon + const newFavicon = document.createElement("link"); + + newFavicon.type = "image/x-icon"; + newFavicon.rel = "icon"; + newFavicon.href = newFaviconUrl; + + // Append the new favicon to the head + head.appendChild(newFavicon); +} + +function updatePetCareLogos(newSrc, newAlt) { + const petCareLogos = document.querySelectorAll(".pet-care-logo"); + + petCareLogos.forEach(logo => { + + // Change the src to a temporary value to force a reload + logo.src = ""; + logo.alt = ""; + logo.removeAttribute("srcset"); + + // Set a timeout to change the src to the new value after a short delay + setTimeout(() => { + logo.src = newSrc; + logo.alt = newAlt; + }, 100); // Change to suit your needs, 100 milliseconds used here as an example + }); +} + +function hexToRGBA(hex, alpha) { + const r = parseInt(hex.substring(1, 3), 16); + const g = parseInt(hex.substring(3, 5), 16); + const b = parseInt(hex.substring(5, 7), 16); + + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +} + +function changeColorTheme(newColor) { + + const rsPrimary50 = cp.palette(newColor, 50); + const rsPrimary100 = cp.palette(newColor, 100); + const rsPrimary200 = cp.palette(newColor, 200); + const rsPrimary300 = cp.palette(newColor, 300); + const rsPrimary400 = cp.palette(newColor, 400); + const rsPrimary500 = cp.palette(newColor, 500); + const rsPrimary600 = cp.palette(newColor, 600); + const rsPrimary700 = cp.palette(newColor, 700); + const rsPrimary800 = cp.palette(newColor, 800); + const rsPrimary900 = cp.palette(newColor, 900); + + document.documentElement.style.setProperty("--rs-primary-50", rsPrimary50); + document.documentElement.style.setProperty("--rs-primary-100", rsPrimary100); + document.documentElement.style.setProperty("--rs-primary-200", rsPrimary200); + document.documentElement.style.setProperty("--rs-primary-300", rsPrimary300); + document.documentElement.style.setProperty("--rs-primary-400", rsPrimary400); + document.documentElement.style.setProperty("--rs-primary-500", rsPrimary500); + document.documentElement.style.setProperty("--rs-primary-600", rsPrimary600); + document.documentElement.style.setProperty("--rs-primary-700", rsPrimary700); + document.documentElement.style.setProperty("--rs-primary-800", rsPrimary800); + document.documentElement.style.setProperty("--rs-primary-900", rsPrimary900); + document.documentElement.style.setProperty("--rs-text-link", rsPrimary700); + document.documentElement.style.setProperty("--rs-text-link-hover", rsPrimary800); + document.documentElement.style.setProperty("--rs-text-link-active", rsPrimary900); + document.documentElement.style.setProperty("--rs-text-active", rsPrimary700); + document.documentElement.style.setProperty("--rs-bg-active", rsPrimary500); + document.documentElement.style.setProperty("--rs-state-hover-bg", rsPrimary50); + document.documentElement.style.setProperty("--rs-color-focus-ring", hexToRGBA(rsPrimary500, 0.25)); + document.documentElement.style.setProperty("--rs-state-focus-shadow", "0 0 0 3px " + hexToRGBA(rsPrimary500, 0.25)); + document.documentElement.style.setProperty( + "--rs-state-focus-outline", + "3px solid " + hexToRGBA(rsPrimary500, 0.25) + ); + document.documentElement.style.setProperty("--rs-btn-primary-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-btn-primary-hover-bg", rsPrimary600); + document.documentElement.style.setProperty("--rs-btn-primary-active-bg", rsPrimary700); + document.documentElement.style.setProperty("--rs-btn-ghost-border", rsPrimary700); + document.documentElement.style.setProperty("--rs-btn-ghost-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-btn-ghost-hover-border", rsPrimary800); + document.documentElement.style.setProperty("--rs-btn-ghost-hover-text", rsPrimary800); + document.documentElement.style.setProperty("--rs-btn-ghost-active-border", rsPrimary900); + document.documentElement.style.setProperty("--rs-btn-ghost-active-text", rsPrimary900); + document.documentElement.style.setProperty("--rs-btn-link-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-btn-link-hover-text", rsPrimary800); + document.documentElement.style.setProperty("--rs-btn-link-active-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-iconbtn-primary-addont", rsPrimary600); + document.documentElement.style.setProperty("--rs-iconbtn-primary-activated-addon", rsPrimary700); + document.documentElement.style.setProperty("--rs-iconbtn-primary-pressed-addon", rsPrimary800); + document.documentElement.style.setProperty("--rs-progress-bar", rsPrimary500); + document.documentElement.style.setProperty("--rs-dropdown-item-bg-hover", hexToRGBA(rsPrimary100, 0.5)); + document.documentElement.style.setProperty("--rs-dropdown-item-bg-active", rsPrimary50); + document.documentElement.style.setProperty("--rs-dropdown-item-text-active", rsPrimary700); + document.documentElement.style.setProperty("--rs-menuitem-active-bg", hexToRGBA(rsPrimary100, 0.5)); + document.documentElement.style.setProperty("--rs-menuitem-active-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-steps-state-finish", rsPrimary500); + document.documentElement.style.setProperty("--rs-steps-border-state-finish", rsPrimary500); + document.documentElement.style.setProperty("--rs-steps-state-process", rsPrimary500); + document.documentElement.style.setProperty("--rs-steps-icon-state-process", rsPrimary500); + document.documentElement.style.setProperty("--rs-navs-selected", rsPrimary700); + document.documentElement.style.setProperty("--rs-navbar-default-selected-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-navbar-inverse-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-navbar-inverse-selected-bg", rsPrimary700); + document.documentElement.style.setProperty("--rs-navbar-inverse-hover-bg", rsPrimary600); + document.documentElement.style.setProperty("--rs-navbar-subtle-selected-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-sidenav-default-selected-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-sidenav-inverse-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-sidenav-inverse-selected-bg", rsPrimary700); + document.documentElement.style.setProperty("--rs-sidenav-inverse-hover-bg", rsPrimary600); + document.documentElement.style.setProperty("--rs-sidenav-inverse-footer-border", rsPrimary600); + document.documentElement.style.setProperty("--rs-sidenav-subtle-selected-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-input-focus-border", rsPrimary500); + document.documentElement.style.setProperty("--rs-listbox-option-hover-bg", hexToRGBA(rsPrimary100, 0.5)); + document.documentElement.style.setProperty("--rs-listbox-option-hover-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-listbox-option-selected-text", rsPrimary700); + document.documentElement.style.setProperty("--rs-listbox-option-selected-bg", rsPrimary50); + document.documentElement.style.setProperty("--rs-listbox-option-disabled-selected-text", rsPrimary200); + document.documentElement.style.setProperty("--rs-checkbox-checked-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-radio-checked-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-radio-tile-checked-color", rsPrimary500); + document.documentElement.style.setProperty("--rs-radio-tile-checked-disabled-color", rsPrimary100); + document.documentElement.style.setProperty("--rs-toggle-checked-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-toggle-checked-hover-bg", rsPrimary600); + document.documentElement.style.setProperty("--rs-toggle-checked-disabled-bg", rsPrimary100); + document.documentElement.style.setProperty("--rs-slider-thumb-border", rsPrimary500); + document.documentElement.style.setProperty("--rs-slider-progress", rsPrimary500); + document.documentElement.style.setProperty("--rs-uploader-dnd-hover-border", rsPrimary500); + document.documentElement.style.setProperty("--rs-carousel-indicator-active", rsPrimary500); + document.documentElement.style.setProperty("--rs-list-hover-bg", rsPrimary50); + document.documentElement.style.setProperty("--rs-list-placeholder-bg", hexToRGBA(rsPrimary50, 0.5)); + document.documentElement.style.setProperty("--rs-list-placeholder-border", rsPrimary500); + document.documentElement.style.setProperty("--rs-timeline-indicator-active-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-table-sort", rsPrimary500); + document.documentElement.style.setProperty("--rs-table-resize", rsPrimary500); + document.documentElement.style.setProperty("--rs-picker-value", rsPrimary700); + document.documentElement.style.setProperty("--rs-picker-count-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-calendar-today-bg", rsPrimary500); + document.documentElement.style.setProperty("--rs-calendar-range-bg", hexToRGBA(rsPrimary50, 0.5)); + document.documentElement.style.setProperty("--rs-calendar-cell-selected-hover-bg", rsPrimary700); +} + +export function personalize(personalization) { + changeColorTheme(personalization.primaryColor); + changeFavicon(personalization.faviconUrl); + updatePetCareLogos(personalization.logoUrl, personalization.logoAltText); +} + +export default personalize; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/data/orgRolesData.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/data/orgRolesData.json new file mode 100644 index 000000000..093518421 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/data/orgRolesData.json @@ -0,0 +1,126 @@ +[ + { + "label": "All Permissions", + "value": "/permission", + "children": [ + { + "label": "Admin", + "value": "/permission/admin", + "children": [ + { + "label": "Manage", + "value": "/permission/admin/manage", + "children": [ + { + "label": "Identity", + "value": "/permission/admin/manage/identity", + "children": [ + { + "label": "Role Management", + "value": "/permission/admin/manage/identity/rolemgt", + "children": [ + { + "label": "Roles view", + "value": "/permission/admin/manage/identity/rolemgt/view" + }, + { + "label": "Roles create", + "value": "/permission/admin/manage/identity/rolemgt/create" + }, + { + "label": "Roles update", + "value": "/permission/admin/manage/identity/rolemgt/update" + }, + { + "label": "Roles delete", + "value": "/permission/admin/manage/identity/rolemgt/delete" + } + ] + }, + { + "label": "User Management", + "value": "/permission/admin/manage/identity/usermgt", + "children": [ + { + "label": "Users view", + "value": "/permission/admin/manage/identity/usermgt/view" + }, + { + "label": "Users list", + "value": "/permission/admin/manage/identity/usermgt/list" + }, + { + "label": "Users create", + "value": "/permission/admin/manage/identity/usermgt/create" + }, + { + "label": "Users update", + "value": "/permission/admin/manage/identity/usermgt/update" + }, + { + "label": "Users delete", + "value": "/permission/admin/manage/identity/usermgt/delete" + } + ] + }, + { + "label": "Identity Providers", + "value": "/permission/admin/manage/identity/idpmgt", + "children": [ + { + "label": "Identity Providers view", + "value": "/permission/admin/manage/identity/idpmgt/view" + }, + { + "label": "Identity Providers list", + "value": "/permission/admin/manage/identity/idpmgt/list" + }, + { + "label": "Identity Providers create", + "value": "/permission/admin/manage/identity/idpmgt/create" + }, + { + "label": "Identity Providers update", + "value": "/permission/admin/manage/identity/idpmgt/update" + }, + { + "label": "Identity Providers delete", + "value": "/permission/admin/manage/identity/idpmgt/delete" + } + ] + }, + { + "label": "Applications", + "value": "/permission/admin/manage/identity/applicationmgt", + "children": [ + { + "label": "Applications view", + "value": "/permission/admin/manage/identity/applicationmgt/view" + }, + { + "label": "Applications list", + "value": "/permission/admin/manage/identity/applicationmgt/list" + }, + { + "label": "Applications create", + "value": "/permission/admin/manage/identity/applicationmgt/create" + }, + { + "label": "Applications update", + "value": "/permission/admin/manage/identity/applicationmgt/update" + }, + { + "label": "Applications delete", + "value": "/permission/admin/manage/identity/applicationmgt/delete" + } + ] + } + ] + } + ] + } + ] + } + ] + } +] diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleButton.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleButton.tsx new file mode 100644 index 000000000..097b95fd1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleButton.tsx @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Button } from "rsuite"; + +interface CreateRoleButtonProps { + onClick: () => void +} + +/** + * + * @param prop - `session` + * + * @returns - create role button + */ +export default function CreateRoleButton(props: CreateRoleButtonProps) { + + const { onClick } = props; + + return ( + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponent.tsx new file mode 100644 index 000000000..2d013f4b0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponent.tsx @@ -0,0 +1,157 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodeCreateRole } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import React, { useState } from "react"; +import { Loader, Modal, Panel, Steps, useToaster } from "rsuite"; +import General from "./createRoleComponentInner/general"; +import Permission from "./createRoleComponentInner/permission"; +import Users from "./createRoleComponentInner/users"; +import styles from "../../../../../../../styles/Settings.module.css"; + +interface CreateRoleComponentProps { + open: boolean, + setOpenCreateRoleModal: React.Dispatch>, + session: Session +} + +export default function CreateRoleComponent(props: CreateRoleComponentProps) { + + const { open, setOpenCreateRoleModal, session } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ step, setStep ] = useState(0); + const [ displayName, setDisplayName ] = useState(""); + const [ permissions, setPermissions ] = useState([]); + const [ users, setUsers ] = useState([]); + + const toaster = useToaster(); + + /** + * change the screens to previous and next + * + * @param nextStep - next step + */ + const onChange = (nextStep: number): void => { + setStep(nextStep < 0 ? 0 : nextStep > 3 ? 3 : nextStep); + }; + + const onPrevious = (): void => onChange(step - 1); + + const onNext = (): void => { + if (step == 2) { + + onSubmit(displayName, permissions, users); + } else { + + onChange(step + 1); + } + }; + + const onDataSubmit = (response: Role): void => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Role created successfully."); + onCreateRoleModalClose(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while creating the role. Try again."); + } + }; + + const onSubmit = async (displayName, permissions, users): Promise => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + await controllerDecodeCreateRole(session, displayName, permissions, users) + .then((response) => onDataSubmit(response)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + + /** + * callback function on create role modal close + */ + const onCreateRoleModalClose = (): void => { + setOpenCreateRoleModal(false); + setStep(0); + setDisplayName(""); + setPermissions([]); + setUsers([]); + }; + + const craeteRoleItemDetailsComponent = (currentStep: number): JSX.Element => { + + switch (currentStep) { + case 0: + + return (); + + case 1: + + return (); + + case 2: + + return (); + } + }; + + return ( + + + + Create Role +

Create a new role in the organization

+
+
+ + + + + + + +
+ + + { craeteRoleItemDetailsComponent(step) } + + +
+
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/general.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/general.tsx new file mode 100644 index 000000000..be931fe3e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/general.tsx @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { HelperTextComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import React from "react"; +import { Field, Form } from "react-final-form"; +import { Button, ButtonToolbar } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../../styles/Settings.module.css"; + +/** + * + * @param prop - `displayName` , `setDisplayName`, `onNext` + * + * @returns The general section of create role modal + */ +export default function General(prop) { + + const { displayName, setDisplayName, onNext } = prop; + + const nameValidate = (name, errors) => { + if (!name) { + errors.name = "This field cannot be empty"; + } + + return errors; + }; + + const validate = values => { + let errors = {}; + + errors = nameValidate(values.name, errors); + + return errors; + }; + + const onUpdate = async (values) => { + + setDisplayName(values.name); + onNext(); + }; + + return ( +
+ +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + ( + + Name + + + + + + { meta.error && meta.touched && ( + { meta.error } + ) } + + ) } + /> + +
+ + + + + + +
+
+ ) } + /> +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/permission.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/permission.tsx new file mode 100644 index 000000000..a18949f6c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/permission.tsx @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Field, Form } from "react-final-form"; +import { Button, ButtonToolbar, CheckTree } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../../styles/Settings.module.css"; +import orgRolesData from "../../../data/orgRolesData.json"; + +/** + * + * @param prop - `permissions`, `setPermissions`, `onNext`, `onPrevious` + * + * @returns The permission section of create role modal + */ +export default function Permission(prop) { + + const { permissions, setPermissions, onNext, onPrevious } = prop; + + const onUpdate = async (values) => { + + onNext(); + setPermissions(values.permissions); + }; + + return ( +
+ +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + ( + + + Assign permission for the role + + ) } + /> + +
+ + + + + + + +
+
+ ) } + /> + +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/users.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/users.tsx new file mode 100644 index 000000000..649340375 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/createRoleComponent/createRoleComponentInner/users.tsx @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { controllerDecodeViewUsers } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import React, { useCallback, useEffect, useState } from "react"; +import { Field, Form } from "react-final-form"; +import { Button, ButtonToolbar, Checkbox, CheckboxGroup } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../../styles/Settings.module.css"; + +/** + * + * @param prop - `setAssignedUsers` - function , `assignedUsers`, `session`, `onNext`, `onPrevious` + * + * @returns The users section of create role modal + */ +export default function Users(prop) { + + const { assignedUsers, setAssignedUsers, session, onNext, onPrevious } = prop; + + const [ users, setUsers ] = useState(null); + + const fetchAllUsers = useCallback(async () => { + const res = await controllerDecodeViewUsers(session); + + await setUsers(res); + }, [ session ]); + + useEffect(() => { + fetchAllUsers(); + }, [ fetchAllUsers ]); + + const onUpdate = async (values) => { + + setAssignedUsers(values.users); + onNext(); + }; + + return ( +
+ +
+ { + users + ? ( ( + { handleSubmit().then(form.restart); } } + fluid> + + ( + + + { users.map(user => ( + + { user.username } + + )) } + + Assign users for the role + + ) } + /> + +
+ + + + + + + +
+
+ ) } + />) + : null + } +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItem.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItem.tsx new file mode 100644 index 000000000..8489860d0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItem.tsx @@ -0,0 +1,157 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodeGetRole } from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { AccordianItemHeaderComponent, JsonDisplayComponent } + from "@pet-management-webapp/shared/ui/ui-components"; +import CodeIcon from "@rsuite/icons/Code"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Nav, Panel } from "rsuite"; +import General from "./roleItemDetailsSection/general"; +import Permission from "./roleItemDetailsSection/permission"; +import Users from "./roleItemDetailsSection/users"; + +interface RoleItemNavProps { + activeKeyNav: string, + activeKeyNavSelect: (eventKey: string) => void +} + +interface RoleItemProps { + session: Session, + id: string +} + +/** + * + * @param prop - `session`, `id`, `roleUri` + * + * @returns role item componet + */ +export default function RoleItem(props: RoleItemProps) { + + const { session, id } = props; + + const [ roleDetails, setRoleDetails ] = useState(null); + const [ activeKeyNav, setActiveKeyNav ] = useState("1"); + + const fetchData = useCallback(async () => { + const res = await controllerDecodeGetRole(session, id); + + setRoleDetails(res); + }, [ session, id ]); + + useEffect(() => { + fetchData(); + }, [ fetchData ]); + + const activeKeyNavSelect = (eventKey: string): void => { + setActiveKeyNav(eventKey); + }; + + const roleItemDetailsComponent = (activeKey): JSX.Element => { + switch (activeKey) { + case "1": + + return ; + case "2": + + return ; + case "3": + + return ; + case "4": + + return ; + } + }; + + + return ( + + roleDetails + ? () + } + eventKey={ id } + id={ id }> +
+ +
+ { roleItemDetailsComponent(activeKeyNav) } +
+
+
) + : null + ); +} + +/** + * + * @param prop - `activeKeyNav`, `activeKeyNavSelect` + * + * @returns navigation bar of role item section + */ +function RoleItemNav(props: RoleItemNavProps) { + + const { activeKeyNav, activeKeyNavSelect } = props; + + return ( + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/general.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/general.tsx new file mode 100644 index 000000000..e1ebd4c81 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/general.tsx @@ -0,0 +1,124 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodePatchRole } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { PatchMethod, checkIfJSONisEmpty } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, fieldValidate } + from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useState } from "react"; +import { Form } from "react-final-form"; +import { Loader, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../../styles/Settings.module.css"; + +interface GeneralProps { + fetchData: () => Promise, + session: Session, + roleDetails: Role +} + +/** + * + * @param prop - `fetchData` - function , `session`, `roleDetails` - Object + * + * @returns The general section of role details + */ +export default function General(props: GeneralProps) { + + const { fetchData, session, roleDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const toaster: Toaster = useToaster(); + + const validate = (values: Record): Record => { + let errors: Record = {}; + + errors = fieldValidate("name", values.name, errors); + + return errors; + }; + + const onDataSubmit = (response: Role, form) => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Role updated successfully."); + fetchData(); + form.restart(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while updating the role. Try again."); + } + }; + + const onUpdate = async (values: Record, form) => { + + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodePatchRole( + session, roleDetails.meta.location, PatchMethod.REPLACE, "displayName", [ values.name ]) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( +
+ +
+ ( + { handleSubmit().then(form.restart); } } + fluid> + + + + + + + + + ) } + /> + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/permission.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/permission.tsx new file mode 100644 index 000000000..9e30755a8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/permission.tsx @@ -0,0 +1,104 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodePatchRole } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { PatchMethod } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { CheckTree, List, Loader, Panel, Toaster, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../../styles/Settings.module.css"; +import orgRolesData from "../../../data/orgRolesData.json"; + +interface PermissionProps { + fetchData: () => Promise, + session: Session, + roleDetails: Role +} + +/** + * + * @param prop - `fetchData` - function , `session`, `roleDetails` - Object + * + * @returns The permission section of role details + */ +export default function Permission(props: PermissionProps) { + + const { fetchData, session, roleDetails } = props; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ selectedPermissions, setSelectedPermissions ] = useState([]); + + const toaster: Toaster = useToaster(); + + const setInitialPermissions = useCallback(async () => { + if (roleDetails.permissions) { + setSelectedPermissions(roleDetails.permissions); + } + }, [ roleDetails ]); + + useEffect(() => { + setInitialPermissions(); + }, [ setInitialPermissions ]); + + const onDataSubmit = (response: Role, form) => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Role updated successfully."); + fetchData(); + form.restart(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while updating the role. Try again."); + } + }; + + return ( +
+ +
+ { + selectedPermissions + ? ( + + { + selectedPermissions.map((permission) => { + return ( + + { permission.value } + + ); + }) + } + + ) + : null + } + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/users.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/users.tsx new file mode 100644 index 000000000..c638cc0e6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/roleItem/roleItemDetailsSection/users.tsx @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role, RoleUsers } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodePatchRole, controllerDecodeViewUsers } from + "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { InternalUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { FormButtonToolbar, FormField } from "@pet-management-webapp/shared/ui/ui-basic-components"; +import { errorTypeDialog, successTypeDialog } from "@pet-management-webapp/shared/ui/ui-components"; +import { PatchMethod } from "@pet-management-webapp/shared/util/util-common"; +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Form } from "react-final-form"; +import { Checkbox, CheckboxGroup, Loader, useToaster } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "../../../../../../../../styles/Settings.module.css"; + +interface UsersProps { + fetchData: () => Promise, + session: Session, + roleDetails: Role +} + +/** + * + * @param prop - `fetchData` - function , `session`, `roleDetails` - Object + * + * @returns The users section of role details + */ +export default function Users(props: UsersProps) { + + const { fetchData, session, roleDetails } = props; + + /** + * + * @param users - users list + * + * @returns get initial assigned user id's. + */ + const getInitialAssignedUserIds = (users: RoleUsers[]): string[] => { + if (users) { + return users.map(user => user.value); + } + + return []; + }; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + const [ users, setUsers ] = useState(null); + const [ initialAssignedUsers, setInitialAssignedUsers ] = useState([]); + + const toaster = useToaster(); + + const fetchAllUsers = useCallback(async () => { + const res = await controllerDecodeViewUsers(session); + + await setUsers(res); + }, [ session ]); + + const setInitialAssignedUserIds = useCallback(async () => { + + await setInitialAssignedUsers(getInitialAssignedUserIds(roleDetails.users)); + }, [ roleDetails ]); + + useEffect(() => { + fetchAllUsers(); + }, [ fetchAllUsers ]); + + useEffect(() => { + setInitialAssignedUserIds(); + }, [ setInitialAssignedUserIds ]); + + const onDataSubmit = (response: Role, form) => { + if (response) { + successTypeDialog(toaster, "Changes Saved Successfully", "Role updated successfully."); + fetchData(); + form.restart(); + } else { + errorTypeDialog(toaster, "Error Occured", "Error occured while updating the role. Try again."); + } + }; + + const onUpdate = async (values: Record, form) => { + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + controllerDecodePatchRole(session, roleDetails.id, PatchMethod.REPLACE, "users", values.users) + .then((response) => onDataSubmit(response, form)) + .finally(() => setLoadingDisplay(LOADING_DISPLAY_NONE)); + }; + + return ( +
+ +
+ { + users + ? ( ( + { handleSubmit().then(form.restart); } } + fluid> + + + + { users.map(user => ( + + { user.username } + + )) } + + + + + + ) } + />) + : null + } + +
+ +
+ +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/rolesList.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/rolesList.tsx new file mode 100644 index 000000000..a6c06c027 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/otherComponents/rolesList.tsx @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import React from "react"; +import { FlexboxGrid, PanelGroup } from "rsuite"; +import RoleItem from "./roleItem/roleItem"; +import styles from "../../../../../../styles/idp.module.css"; + +interface RolesListProps { + session : Session + rolesList : Role[] +} + +/** + * + * @param prop - `session`, `roleList` + * + * @returns List of all the roles in an organization + */ +export default function RolesList(props: RolesListProps) { + + const { session, rolesList } = props; + + return ( + +
+ + { rolesList.map((role) => ( + + )) } + +
+
+ ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/roleManagementSectionComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/roleManagementSectionComponent.tsx new file mode 100644 index 000000000..2c57882e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/components/sections/sections/settingsSection/roleManagementSection/roleManagementSectionComponent.tsx @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { controllerDecodeListAllRoles } + from "@pet-management-webapp/business-admin-app/data-access/data-access-controller"; +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { EmptySettingsComponent, SettingsTitleComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import PeoplesIcon from "@rsuite/icons/Peoples"; +import { Session } from "next-auth"; +import { useCallback, useEffect, useState } from "react"; +import { Container } from "rsuite"; +import RolesList from "./otherComponents/rolesList"; + +interface RoleManagementSectionComponentProps { + session: Session +} + +/** + * + * @param prop - session + * + * @returns The role management interface section. + */ +export default function RoleManagementSectionComponent(props: RoleManagementSectionComponentProps) { + + const { session } = props; + + const [ rolesList, setRolesList ] = useState([]); + + const fetchAllRoles = useCallback(async () => { + + const res = await controllerDecodeListAllRoles(session); + + if (res) { + setRolesList(res.filter((role) => + role?.audience.type == "application" && + role?.audience.display === getConfig().BusinessAdminAppConfig.ManagementAPIConfig.SharedApplicationName + )); + } else { + setRolesList([]); + } + + }, [ session ]); + + useEffect(() => { + fetchAllRoles(); + }, [ fetchAllRoles ]); + + return ( + + + + + { + rolesList + ? + : ( } + />) + } + + + ); + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/index.d.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/index.d.ts new file mode 100644 index 000000000..5e1500a8e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/index.d.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +declare module "*.svg" { + const content: any; + + export const ReactComponent: any; + export default content; +} + + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/jest.config.ts new file mode 100644 index 000000000..3c10578cd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/jest.config.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "my-new-app", + preset: "../../jest.preset.js", + transform: { + "^(?!.*\\.(js|jsx|ts|tsx|css|json)$)": "@nrwl/react/plugins/jest", + "^.+\\.[tj]sx?$": ["babel-jest", { presets: ["@nrwl/next/babel"] }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../coverage/apps/my-new-app" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/next-env.d.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/next-env.d.ts new file mode 100644 index 000000000..4f11a03dc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/next.config.js b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/next.config.js new file mode 100644 index 000000000..22a1520e6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/next.config.js @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const { withNx } = require("@nrwl/next/plugins/with-nx"); +const withFonts = require("next-fonts"); +const withLess = require("next-with-less"); + +const lessConfig = withLess({ + lessLoaderOptions: { + lessOptions: { + strictMath: true + } + } +}); + +module.exports = withFonts({ + webpack(config) { + return config; + } +}); + +const nextConfig = withNx({ + nx: { + svgr: false + + }, + publicRuntimeConfig: { + baseOrgUrl: process.env.BASE_ORG_URL, + baseUrl: process.env.BASE_URL, + channellingServiceUrl: process.env.CHANNELLING_SERVICE_URL, + clientId: process.env.CLIENT_ID, + hostedUrl: process.env.HOSTED_URL, + personalizationServiceUrl: process.env.PERSONALIZATION_SERVICE_URL, + petManagementServiceUrl: process.env.PET_MANAGEMENT_SERVICE_URL, + sharedAppName: process.env.SHARED_APP_NAME + }, + ...lessConfig +}); + +module.exports = nextConfig; + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/404.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/404.tsx new file mode 100644 index 000000000..bcd387720 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/404.tsx @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import dynamic from "next/dynamic"; + +export default function Custom404() { + const DynamicCustom404Component = dynamic(() => + import("@pet-management-webapp/shared/ui/ui-components").then((module) => module.Custom404Component)); + + return (); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/500.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/500.tsx new file mode 100644 index 000000000..d5465c66b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/500.tsx @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { signout } from "@pet-management-webapp/business-admin-app/util/util-authorization-config-util"; +import dynamic from "next/dynamic"; + +export default function Custom500() { + const DynamicCustom500Component = dynamic(() => + import("@pet-management-webapp/shared/ui/ui-components").then((module) => module.Custom500Component)); + + const goBack = async (): Promise => await signout(null); + + return (); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/_app.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/_app.tsx new file mode 100644 index 000000000..524b3d377 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/_app.tsx @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { SessionProvider } from "next-auth/react"; +import Head from "next/head"; +import "rsuite/dist/rsuite.min.css"; +import "../styles/custom-theme.less"; +import "../styles/globals.css"; + +function MyApp(prop) { + + const { Component, pageProps } = prop; + + return ( + + + + + + + { getConfig().BusinessAdminAppConfig.ApplicationConfig.Branding.name } + + + + + + ); +} + +export default MyApp; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/_document.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/_document.tsx new file mode 100644 index 000000000..b8f9c0ba9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/_document.tsx @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Document, { Head, Html, Main, NextScript } from "next/document"; +import React from "react"; + +export default class MyDocument extends Document { + render() { + + return ( + + + + + + + + +
+ + + + ); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/auth/[...nextauth].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/auth/[...nextauth].ts new file mode 100644 index 000000000..591be0e8b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/auth/[...nextauth].ts @@ -0,0 +1,116 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { getLoggedUserFromProfile, getLoggedUserId, getOrgId, getOrgName } from + "@pet-management-webapp/shared/util/util-authorization-config-util"; +import { jwtDecode } from "jwt-decode"; +import { NextApiRequest, NextApiResponse } from "next"; +import NextAuth, { Profile } from "next-auth"; +import { JWT } from "next-auth/jwt"; + +/** + * + * @param req - request body + * @param res - response body + * + * @returns IS provider that will handle the sign in process. Used in `orgSignin()` + * [Use this method to signin] + */ +const wso2ISProvider = (req: NextApiRequest, res: NextApiResponse) => NextAuth(req, res, { + + callbacks: { + + async jwt({ token, account, profile }) { + + if (account) { + token.accessToken = account.access_token; + token.idToken = account.id_token; + token.scope = account.scope; + token.user = profile; + } + + return token; + }, + async redirect({ baseUrl }) { + + return `${baseUrl}/o/moveOrg`; + }, + async session({ session, token }) { + + if (!session) { + session.error = true; + } else { + session.accessToken = token.accessToken as string; + // session.orginalIdToken = token.idToken; + session.scope = token?.scope; + const profile: Profile = jwtDecode(token.idToken); + + session.expires = false; + session.userId = getLoggedUserId(token.idToken as unknown as JWT); + session.user = getLoggedUserFromProfile(profile); + session.orgId = getOrgId(token.idToken as unknown as JWT); + session.orgName = getOrgName(token.idToken as unknown as JWT); + + let rolesList: string[]|string = token.user[ "roles" ]; + + if (typeof rolesList === "string") { + rolesList = [ rolesList ]; + } + if (rolesList == null || rolesList.length === 0) { + session.group = "petOwner"; + } else if (rolesList.some(x => x === "pet-care-doctor")) { + session.group = "doctor"; + } else if (rolesList.some(x => x === "pet-care-admin")) { + session.group = "admin"; + } else { + session.group = "petOwner"; + } + } + + return session; + } + + }, + debug: true, + providers: [ + { + authorization: { + params: { + scope: getConfig().BusinessAdminAppConfig.ApplicationConfig.APIScopes.join(" ") + } + }, + clientId: process.env.CLIENT_ID, + clientSecret: process.env.CLIENT_SECRET, + id: "wso2isAdmin", + name: "WSO2ISAdmin", + profile(profile) { + + return { + id: profile.sub + }; + }, + type: "oauth", + userinfo: `${getConfig().CommonConfig.AuthorizationConfig.BaseOrganizationUrl}/oauth2/userinfo`, + // eslint-disable-next-line + wellKnown: `${getConfig().CommonConfig.AuthorizationConfig.BaseOrganizationUrl}/oauth2/token/.well-known/openid-configuration` + } + ], + secret: process.env.SECRET +}); + +export default wso2ISProvider; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/getApplication/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/getApplication/[id].ts new file mode 100644 index 000000000..f4d688000 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/getApplication/[id].ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to get details of an application + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function getApplication(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/applications/${id}`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/listAllApplications.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/listAllApplications.ts new file mode 100644 index 000000000..9c32b69d6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/listAllApplications.ts @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view all applications + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function listAllApplications(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/applications`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/listCurrentApplication.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/listCurrentApplication.ts new file mode 100644 index 000000000..34315f80c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/listCurrentApplication.ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view current application + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function listCurrentApplication(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + const appName = req.query.appName; + const decodedAppName = appName.toString().replace(/%20/g, ""); + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/applications?filter=name+eq+${decodedAppName}`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/patchApplicationAuthSteps/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/patchApplicationAuthSteps/[id].ts new file mode 100644 index 000000000..28cf7c3dc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/application/patchApplicationAuthSteps/[id].ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to patch authentication steps of an application + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function patchApplicationAuthSteps(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const model = body.param; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/applications/${id}`, + requestOptionsWithBody(session, RequestMethod.PATCH, model) + ); + const data = await fetchData; + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/getBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/getBrandingPreference.ts new file mode 100644 index 000000000..3ed1a599b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/getBrandingPreference.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getBaseUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view current application + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function getBrandingPreference(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getBaseUrl(orgId)}/${orgId}/api/server/v1/branding-preference/` + + `resolve?locale=en-US&name=${orgId}&type=ORG`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/revertBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/revertBrandingPreference.ts new file mode 100644 index 000000000..43f6a39b1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/revertBrandingPreference.ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + requestOptionsWithBody +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view current application + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function revertBrandingPreference(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/branding-preference` + + `?locale=en-US&name=${orgId}&type=ORG`, + requestOptionsWithBody(session, RequestMethod.DELETE, null) + ); + + res.status(200).json(fetchData); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/updateBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/updateBrandingPreference.ts new file mode 100644 index 000000000..d49204462 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/branding/updateBrandingPreference.ts @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + requestOptionsWithBody +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view current application + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function updateBrandingPreference(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const brandingPreference = body.param; + + let fetchData; + + try { + if (brandingPreference?.preference?.configs?.isBrandingEnabled) { + fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/branding-preference`, + requestOptionsWithBody(session, RequestMethod.PUT, brandingPreference) + ); + } + if (brandingPreference?.preference?.configs?.isBrandingEnabled === undefined + || brandingPreference?.preference?.configs?.isBrandingEnabled === false + || fetchData?.status === 404) { + brandingPreference.preference.configs.isBrandingEnabled = true; + brandingPreference.preference.configs.removeDefaultBranding = true; + fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/branding-preference`, + requestOptionsWithBody(session, RequestMethod.POST, brandingPreference) + ); + } + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/addGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/addGroup.ts new file mode 100644 index 000000000..5f241baf0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/addGroup.ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; + +/** + * backend API call to create a group + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function addGroup(req, res) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const user = body.param; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Groups`, + requestOptionsWithBody(session, RequestMethod.POST, user) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/deleteGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/deleteGroup.ts new file mode 100644 index 000000000..69655a617 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/deleteGroup.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function deleteGroup(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const groupId = req.query.groupId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Groups/${groupId}`, + requestOptionsWithBody(session, RequestMethod.DELETE, null) + ); + + res.status(200).json(fetchData); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/patchGroupMembers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/patchGroupMembers.ts new file mode 100644 index 000000000..998969d83 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/patchGroupMembers.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function patchGroupMembers(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const patchBody = body.param; + const groupId = req.query.groupId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Groups/${groupId}`, + requestOptionsWithBody(session, RequestMethod.PATCH, patchBody) + ); + + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/patchGroupName.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/patchGroupName.ts new file mode 100644 index 000000000..7d17dc31a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/patchGroupName.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function patchGroupName(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const patchBody = body.param; + const groupId = req.query.groupId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Groups/${groupId}`, + requestOptionsWithBody(session, RequestMethod.PATCH, patchBody) + ); + + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/viewGroups.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/viewGroups.ts new file mode 100644 index 000000000..3669b1f8c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/viewGroups.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view groups + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function viewGroups(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Groups?excludedAttributes=members`, + requestOptions(session) + ); + const groups = await fetchData.json(); + + res.status(200).json(groups); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/viewUsersInGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/viewUsersInGroup.ts new file mode 100644 index 000000000..804d39fd6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/group/viewUsersInGroup.ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view users + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function viewUsersInGroup(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const group = req.query.group; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Users?domain=PRIMARY&filter=groups+eq+${group}`, + requestOptions(session) + ); + const users = await fetchData.json(); + + res.status(200).json(users); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/createIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/createIdentityProvider.ts new file mode 100644 index 000000000..f1e914b9d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/createIdentityProvider.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + + +/** + * backend API call to create a new identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function createIdentityProvider(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const model = body.param; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers`, + requestOptionsWithBody(session, RequestMethod.POST, model) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/deleteIdentityProvider/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/deleteIdentityProvider/[id].ts new file mode 100644 index 000000000..9d4abdc06 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/deleteIdentityProvider/[id].ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; + +/** + * backend API call to delete an identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function deleteIdentityProvider(req, res) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${id}`, + requestOptionsWithBody(session, RequestMethod.DELETE, null) + ); + + res.status(200).json(fetchData); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getDetailedIdentityProvider/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getDetailedIdentityProvider/[id].ts new file mode 100644 index 000000000..e57ca6b95 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getDetailedIdentityProvider/[id].ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to get all the details of an identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function getDetailedIdentityProvider(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${id}`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getDiscoveryUrl.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getDiscoveryUrl.ts new file mode 100644 index 000000000..2da916280 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getDiscoveryUrl.ts @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { NextApiRequest, NextApiResponse } from "next"; + + +/** + * backend API call to create a new identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function getDiscoveryUrl(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const discoveryUrl = body.param; + + try { + const fetchData = await fetch( + discoveryUrl + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getFederatedAuthenticators/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getFederatedAuthenticators/[id].ts new file mode 100644 index 000000000..a1d6472a0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getFederatedAuthenticators/[id].ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to get federtated authenticators of an identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function getFederatedAuthenticators(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const idpId = body.param; + + const id = req.query.id; + + const url = `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${idpId}/federated-authenticators/${id}`; + + try { + const fetchData = await fetch( + url, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getIdentityProviderGroupMappings/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getIdentityProviderGroupMappings/[id].ts new file mode 100644 index 000000000..a9f12e4c1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getIdentityProviderGroupMappings/[id].ts @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function getIdentityProviderGroupMappings(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${id}/claims`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getLocalClaims.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getLocalClaims.ts new file mode 100644 index 000000000..34bce9a02 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/getLocalClaims.ts @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function getLocalClaims(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/claim-dialects/local/claims`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/listAllIdentityProviders.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/listAllIdentityProviders.ts new file mode 100644 index 000000000..e5845b8c0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/listAllIdentityProviders.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to list all identity providers + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function listAllIdentityProviders(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchGeneralSettingsIdp/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchGeneralSettingsIdp/[id].ts new file mode 100644 index 000000000..149fc4318 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchGeneralSettingsIdp/[id].ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to patch general settings of an identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function patchGeneralSettingsIdp(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const request = body.param; + + const idpId = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${idpId}`, + requestOptionsWithBody(session, RequestMethod.PATCH, request) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchIdpClaims/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchIdpClaims/[id].ts new file mode 100644 index 000000000..b1205576a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchIdpClaims/[id].ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function patchIdpClaims(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const request = body.param; + + const idpId = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${idpId}/claims`, + requestOptionsWithBody(session, RequestMethod.PUT, request) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchIdpGroups/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchIdpGroups/[id].ts new file mode 100644 index 000000000..e0ae7e4f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/patchIdpGroups/[id].ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function patchIdpGroups(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const request = body.param; + + const idpId = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${idpId}/groups`, + requestOptionsWithBody(session, RequestMethod.PUT, request) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/updateFederatedAuthenticators/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/updateFederatedAuthenticators/[id].ts new file mode 100644 index 000000000..849e3d483 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/identityProvider/updateFederatedAuthenticators/[id].ts @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to update federtated authenticators of an identity provider + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function updateFederatedAuthenticators(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const request = body.param; + + const idpId = req.query.id; + + const url = `${getOrgUrl(orgId)}/api/server/v1/identity-providers/${idpId}` + + `/federated-authenticators/${request[0]}`; + + try { + const fetchData = await fetch( + url, + requestOptionsWithBody(session, RequestMethod.PUT, request[1]) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/createRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/createRole.ts new file mode 100644 index 000000000..b2abc10e8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/createRole.ts @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + + +/** + * backend API call to list all roles. + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function createRole(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const role = body.param; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Roles`, + requestOptionsWithBody(session, RequestMethod.POST, role) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/editRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/editRole.ts new file mode 100644 index 000000000..f6af97403 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/editRole.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function editRole(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const role = body.param; + const roleUri = new URL(req.query.roleUri.toString()); + + try { + const fetchData = await fetch( + roleUri, + requestOptionsWithBody(session, RequestMethod.PUT, role) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/getRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/getRole.ts new file mode 100644 index 000000000..2b38d579c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/getRole.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function getRole(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId: string = req.query.orgId.toString(); + const roleId: string = req.query.roleId.toString(); + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/v2/Roles/${roleId}`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/listAllRoles.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/listAllRoles.ts new file mode 100644 index 000000000..1621bbb77 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/listAllRoles.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to list all roles. + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function listAllRoles(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/v2/Roles`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/patchRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/patchRole.ts new file mode 100644 index 000000000..8e0f0b9fd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/patchRole.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function patchRole(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const patchBody = body.param; + const roleId = req.query.roleId; + const orgId = ""; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/v2/Roles/${roleId}`, + requestOptionsWithBody(session, RequestMethod.PATCH, patchBody) + ); + + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/userRoles/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/userRoles/[id].ts new file mode 100644 index 000000000..bba601a8e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/role/userRoles/[id].ts @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function userRoles(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/api/server/v1/organizations/${orgId}/users/${id}/roles`, + requestOptions(session) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/switchOrg.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/switchOrg.ts new file mode 100644 index 000000000..a1b670681 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/switchOrg.ts @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig, getHostedUrl } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * + * @returns get the basic auth for authorize the switch call + */ +const getBasicAuth = (): string => Buffer + // eslint-disable-next-line + .from(`${process.env.MANAGEMENT_APP_CLIENT_ID}:${process.env.MANAGEMENT_APP_CLIENT_SECRET}`).toString("base64"); + +/** + * + * @returns get the header for the switch call + */ +const getSwitchHeader = (): HeadersInit => { + + const headers = { + "Access-Control-Allow-Credentials": true.toString(), + "Access-Control-Allow-Origin": getHostedUrl(), + Authorization: `Basic ${getBasicAuth()}`, + accept: "application/json", + "content-type": "application/x-www-form-urlencoded" + }; + + return headers; +}; + +/** + * + * @param subOrgId - sub organization id + * @param accessToken - access token return from the IS + * + * @returns get the body for the switch call + */ +const getSwitchBody = (subOrgId: string, accessToken: string): Record => { + const body = { + "grant_type": "organization_switch", + "scope": getConfig().BusinessAdminAppConfig.ApplicationConfig.APIScopes.join(" "), + "switching_organization": subOrgId, + "token": accessToken + }; + + return body; +}; + +/** + * + * @param subOrgId - sub organization id + * @param accessToken - access token return from the IS + * + * @returns get the request body for the switch call + */ +const getSwitchRequest = (subOrgId: string, accessToken: string): RequestInit => { + const request = { + body: new URLSearchParams(getSwitchBody(subOrgId, accessToken)).toString(), + headers: getSwitchHeader(), + method: "POST" + }; + + return request; +}; + +/** + * + * @returns get the endpoint for the switch API call + */ +const getSwitchEndpoint = (): string => + `${getConfig().CommonConfig.AuthorizationConfig.BaseOrganizationUrl}/oauth2/token`; + +/** + * + * @param req - request object + * @param res - response object + * + * @returns whether the switch call was successful + */ +export default async function switchOrg(req: NextApiRequest, res: NextApiResponse) { + + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const subOrgId = body.subOrgId; + const accessToken = body.param; + + try { + + const fetchData = await fetch( + getSwitchEndpoint(), + getSwitchRequest(subOrgId, accessToken) + ); + + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/addUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/addUser.ts new file mode 100644 index 000000000..e22d6f1a5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/addUser.ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; + +/** + * backend API call to create a user + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function addUser(req, res) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const user = body.param; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Users`, + requestOptionsWithBody(session, RequestMethod.POST, user) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/deleteUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/deleteUser.ts new file mode 100644 index 000000000..8985233aa --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/deleteUser.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +export default async function deleteUser(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + const userId = req.query.userId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Users/${userId}`, + requestOptionsWithBody(session, RequestMethod.DELETE, null) + ); + + res.status(200).json(fetchData); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/editUser/[id].ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/editUser/[id].ts new file mode 100644 index 000000000..a3aa3daaa --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/editUser/[id].ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptionsWithBody } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { RequestMethod, dataNotRecievedError, notPostError } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to edit a user + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function editUser(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const user = body.param; + const orgId = body.orgId; + + const id = req.query.id; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Users/${id}`, + requestOptionsWithBody(session, RequestMethod.PATCH, user) + ); + const data = await fetchData.json(); + + res.status(200).json(data); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/viewUsers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/viewUsers.ts new file mode 100644 index 000000000..e1f4e3d10 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/api/settings/user/viewUsers.ts @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { requestOptions } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util"; +import { dataNotRecievedError, notPostError } + from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { getOrgUrl } from "@pet-management-webapp/shared/util/util-application-config-util"; +import { NextApiRequest, NextApiResponse } from "next"; + +/** + * backend API call to view users + * + * @param req - request + * @param res - response + * + * @returns correct data if the call is successful, else an error message + */ +export default async function viewUsers(req: NextApiRequest, res: NextApiResponse) { + if (req.method !== "POST") { + notPostError(res); + } + + const body = JSON.parse(req.body); + const session = body.session; + const orgId = body.orgId; + + try { + const fetchData = await fetch( + `${getOrgUrl(orgId)}/scim2/Users?domain=PRIMARY`, + requestOptions(session) + ); + const users = await fetchData.json(); + + res.status(200).json(users); + } catch (err) { + + return dataNotRecievedError(res); + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/bookingDetails.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/bookingDetails.tsx new file mode 100644 index 000000000..1f84d5d77 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/bookingDetails.tsx @@ -0,0 +1,426 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Grid, Table, TableBody, TableCell, TableHead, TableRow, Typography } from "@mui/material"; +import Image from "next/image"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Button, Message, Stack } from "rsuite"; +import PET_IMAGE from "../../../libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png"; +import { getMedicalReport } from "../APICalls/GetMedicalReports/get-medical-reports"; +import { getPet } from "../APICalls/GetPet/get-pet"; +import { getThumbnail } from "../APICalls/GetThumbnail/get-thumbnail"; +import { updateBooking } from "../APICalls/UpdateBooking/put-booking"; +import dateConverter from "../components/sections/sections/sectionsRelatedToBookings/dateConverter"; +import convertTo12HourTime from "../components/sections/sections/sectionsRelatedToBookings/timeConverter"; +import AddMedicalReportComponent from "../components/sections/sections/sectionsRelatedToDoctor/addMedicalReport"; +import MedicalReportOverview from "../components/sections/sections/sectionsRelatedToDoctor/medicalReportOverview"; +import styles from "../styles/booking.module.css"; +import { CompleteBooking } from "../types/booking"; +import { MedicalReport, Pet } from "../types/pets"; + + +/** + * + * @returns Booking Details Page of a Doctor + */ +export default function BookingDetails() { + + const router = useRouter(); + const { token, + appointmentNumber, + date, + doctorId, + emailAddress, + id, + mobileNumber, + petId, + petOwnerName, + sessionEndTime, + sessionStartTime, + status, + orgId + } = router.query; + const [ pet, setPet ] = useState(null); + const [ url, setUrl ] = useState(""); + const [ medicalReport, setMedicalReport ] = useState(null); + const [ medicalReportList, setMedicalReportList ] = useState(null); + const [ isAddMedicalReportOpen, setIsAddMedicalReportOpen ] = useState(false); + const [ isMedicalReportOverviewOpen, setIsMedicalReportOverviewOpen ] = useState(false); + const [ isMedicalReportEditOpen, setIsMedicalReportEditOpen ] = useState(false); + const [ bookingStatus, setBookingStatus ] = useState("Confirmed"); + + const handleGoBack = () => { + router.back(); + }; + + async function getPetInfo() { + const accessToken = token; + + if(typeof accessToken === "string" && typeof petId === "string" ) { + getPet(accessToken, petId) + .then(async (res) => { + if (res.data) { + setPet(res.data); + const response = await getThumbnail(accessToken, res.data.id, "", ""); + + if (response.data.size > 0) { + const imageUrl = URL.createObjectURL(response.data); + + setUrl(imageUrl); + } + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + + } + } + + async function getMedicalReportInfo() { + const accessToken = token; + + if(typeof accessToken === "string" && typeof petId === "string" ) { + getMedicalReport(accessToken, petId) + .then(async (res) => { + if (res.data instanceof Array) { + setMedicalReportList(res.data); + } + }) + .catch((e) => { + // eslint-disable-next-line no-console + console.log(e); + }); + } + } + + useEffect(() => { + getPetInfo(); + getMedicalReportInfo(); + }, [ ]); + + useEffect(() => { + getMedicalReportInfo(); + }, [ isMedicalReportEditOpen ]); + + useEffect(() => { + getMedicalReportInfo(); + }, [ isAddMedicalReportOpen ]); + + const handleRowClick = (report: MedicalReport) => { + setIsMedicalReportOverviewOpen(true); + setMedicalReport(report); + }; + + const handleComplete = async () => { + async function updateBookingInfo() { + const accessToken = token?.toString(); + const payload: CompleteBooking = { + date: date?.toString(), + doctorId: doctorId?.toString(), + email: emailAddress?.toString(), + mobileNumber: mobileNumber?.toString(), + petDoB: pet?.dateOfBirth, + petId: petId?.toString(), + petName: pet?.name, + petOwnerName: petOwnerName?.toString(), + petType: pet?.breed, + sessionEndTime: sessionEndTime?.toString(), + sessionStartTime: sessionStartTime?.toString(), + status: "Completed" + }; + const response = await updateBooking(accessToken, orgId?.toString(), id?.toString(), payload); + } + updateBookingInfo(); + setBookingStatus("Completed"); + }; + + return ( + <>
+
+ + +

{ "Booking Details" }

+

{ "Available Bookings for the doctor" }

+
+ { (status !== "Completed" && bookingStatus !== "Completed") && ( + + ) } +
+
+ +
+
+ Booking Details +
+
+ + + +

Appointment No

+
+ +

Date

+
+ +

Mobile Number

+
+ +

Email Address

+
+ +

Session Start Time

+
+ +

Session End Time

+
+ +

Status

+
+
+ + +

+ { appointmentNumber === "" ? " - " : appointmentNumber }

+
+ +

{ date === "" ? " - " : date }

+
+ +

+ { mobileNumber === "" ? " - " : mobileNumber }

+
+ +

+ { emailAddress === "" ? " - " : emailAddress }

+
+ +

+ { sessionStartTime === "" ? " - " : + convertTo12HourTime(sessionStartTime?.toString()) } +

+
+ +

+ { sessionEndTime === "" ? " - " : + convertTo12HourTime(sessionEndTime?.toString()) }

+
+ +

+ { (bookingStatus === "Completed" || status === "Completed")? + "Completed":"Confirmed" } +

+
+
+
+
+
+
+
+ Pet Details +
+
+ { url ? ( + pet-thumbnail + ) : ( + pet-thumbnail + ) } +
+
+ { pet && ( + + + +

Name

+
+ +

Breed

+
+ +

Date of Birth

+
+
+ + +

{ pet.name }

+
+ +

{ pet.breed }

+
+ +

{ pet.dateOfBirth }

+
+
+
+ ) } + +
+
+
+ Vaccination Details +
+
+ { pet && pet.vaccinations && pet.vaccinations.length > 0 ? ( +
+
+ + + + + Vaccine Name + + Last vaccination Date + + Next Vaccination Date + + + + { pet.vaccinations.map((vaccine) => ( + + + { vaccine.name } + + { vaccine.lastVaccinationDate } + + { vaccine.nextVaccinationDate } + + )) } + +
+
+
+ ) : ( +
+ +
+ ) } +
+
+ Medical Reports +
+
+ + Click a table row to view the full medical report. + +
+
+ { medicalReportList && medicalReportList.length > 0 ? ( +
+
+ + + + + Date + + Diagnosis + + Treatment + + + + { medicalReportList.map((report) => ( + {handleRowClick(report);} } + className={ styles.medicalReportRow } + > + + { dateConverter(report.createdAt) } + + + { report.diagnosis } + + + { report.treatment } + + + )) } + +
+
+
+ ) : ( +
+ The medical reports are currently unavailable. +
+ ) } +
+
+ +
+
+ +
+
+ +
+ + ); +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/index.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/index.tsx new file mode 100644 index 000000000..75c17ea94 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/index.tsx @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { LogoComponent } from "@pet-management-webapp/business-admin-app/ui/ui-components"; +import { IndexHomeComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { NextRouter, useRouter } from "next/router"; +import React, { useEffect } from "react"; +import "rsuite/dist/rsuite.min.css"; +import homeImage from "../../../libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome.jpeg"; +import { getPersonalization } from "../APICalls/GetPersonalization/get-personalization"; +import personalize from "../components/sections/sections/settingsSection/personalizationSection/personalize"; +import { Personalization } from "../types/personalization"; + +/** + * + * @returns - First interface of the app + */ +export default function Home() { + + const router: NextRouter = useRouter(); + + const getOrgIdFromUrl = (): string => { + const currentUrl = window.location.href; + const url = new URL(currentUrl); + const searchParams = url.searchParams; + const orgId = searchParams.get("orgId"); + + return orgId; + }; + + const signinOnClick = (): void => { + if (getOrgIdFromUrl()) { + router.push("/signin?orgId=" + getOrgIdFromUrl()); + } else { + router.push("/signin"); + } + }; + + useEffect(() => { + if (getOrgIdFromUrl()) { + getPersonalization(getOrgIdFromUrl()) + .then((response) => { + personalize(response.data); + }) + .catch(async (err) => { + if (err.response.status === 404) { + const defaultPersonalization: Personalization = { + faviconUrl: "https://user-images.githubusercontent.com/1329596/" + + "242288450-b511d3dd-5e02-434f-9924-3399990fa011.png", + logoAltText: "Pet Care App Logo", + logoUrl: "https://user-images.githubusercontent.com/" + + "35829027/241967420-9358bd5c-636e-48a1-a2d8-27b2aa310ebf.png", + org: "", + primaryColor: "#4F40EE", + secondaryColor: "#E0E1E2" + }; + + personalize(defaultPersonalization); + + } + }); + } + + + }, [ ]); + + return ( + } + /> + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/o/[id].tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/o/[id].tsx new file mode 100644 index 000000000..084023740 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/o/[id].tsx @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + BrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { orgSignin, redirect } from "@pet-management-webapp/shared/util/util-authorization-config-util"; +import { postDoctor } from "apps/business-admin-app/APICalls/CreateDoctor/post-doc"; +import { getDoctor } from "apps/business-admin-app/APICalls/getDoctors/get-doctor"; +import { getPersonalization } from "apps/business-admin-app/APICalls/GetPersonalization/get-personalization"; +import { postPersonalization } from "apps/business-admin-app/APICalls/UpdatePersonalization/post-personalization"; +import personalize from "apps/business-admin-app/components/sections/sections/settingsSection/personalizationSection/personalize"; +import { DoctorInfo } from "apps/business-admin-app/types/doctor"; +import { Personalization } from "apps/business-admin-app/types/personalization"; +import controllerDecodeGetBrandingPreference + from "libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeGetBrandingPreference"; +import { Session } from "next-auth"; +import { getSession } from "next-auth/react"; +import { useEffect } from "react"; +import Home from "../../components/sections/home"; + +export async function getServerSideProps(context) { + + const routerQuery = context.query.id; + const session = await getSession(context); + + if (session === null || session === undefined|| session.error) { + + return { + props: { routerQuery } + }; + } else { + if (routerQuery !== session.orgId) { + + return redirect("/404"); + } else { + + return { + props: { session } + }; + } + + } + +} + +interface OrgProps { + session: Session + routerQuery: string +} + +/** + * + * @param prop - session, routerQuery (orgId) + * + * @returns Organization distinct interace + */ +export default function Org(props : OrgProps) { + + const { session, routerQuery } = props; + + useEffect(() => { + if (routerQuery) { + orgSignin(true,routerQuery); + + return; + } + }, [ routerQuery ]); + + useEffect(() => { + getDoctor(session.accessToken, session.user.emails[0]) + .catch((err) => { + if (err.response.status === 404 && session.group === "doctor") { + const payload: DoctorInfo = { + address: "", + availability: [], + dateOfBirth: "", + emailAddress: session.user.emails[0], + gender: "", + name: session.user.name.givenName + " " + session.user.name.familyName, + registrationNumber: Math.floor(100000 + Math.random() * 900000).toString(), + specialty: "N/A" + }; + + postDoctor(session.accessToken, payload); + } + }); + + getPersonalization(session.orgId) + .then((response) => { + personalize(response.data); + }) + .catch(async (err) => { + if (err.response.status === 404 && session.group === "admin") { + const res: BrandingPreference = + (await controllerDecodeGetBrandingPreference(session) as BrandingPreference); + const activeTheme: string = res["preference"]["theme"]["activeTheme"]; + + const newPersonalization: Personalization = { + faviconUrl: res["preference"]["theme"][activeTheme]["images"]["favicon"]["imgURL"], + logoAltText: res["preference"]["theme"][activeTheme]["images"]["logo"]["altText"], + logoUrl: res["preference"]["theme"][activeTheme]["images"]["logo"]["imgURL"], + org: session.orgId, + primaryColor: res["preference"]["theme"][activeTheme]["colors"]["primary"]["main"], + secondaryColor: res["preference"]["theme"][activeTheme]["colors"]["secondary"]["main"] + }; + + postPersonalization(session.accessToken, newPersonalization); + } + }); + }, [ session ]); + + return ( + session + ? () + : null + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/o/moveOrg.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/o/moveOrg.tsx new file mode 100644 index 000000000..0919f8a32 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/o/moveOrg.tsx @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { redirect } from "@pet-management-webapp/shared/util/util-authorization-config-util"; +import { getSession } from "next-auth/react"; +import dynamic from "next/dynamic"; +import { useRouter } from "next/router"; +import { useCallback, useEffect, useState } from "react"; + +export async function getServerSideProps(context) { + + const session = await getSession(context); + + if (session) { + + if (session.expires || session.error) { + + return redirect("/500"); + } else { + + const orgId = session.orgId; + const orgName = session.orgName; + + return { + props: { orgId, orgName } + }; + } + } else { + + return redirect("/404"); + } +} + +interface MoveOrgProps { + orgId : string, + orgName : string +} + +/** + * + * @param prop - orgId, orgName + * + * @returns Interface to call organization switch function + */ +export default function MoveOrg(props: MoveOrgProps) { + + const { orgId, orgName } = props; + + const router = useRouter(); + + const moveTime = 40; + const [ redirectSeconds, setRedirectSeconds ] = useState(moveTime); + + const redirectToOrg = useCallback(() => { + router.push(`/o/${orgId}`); + }, [ orgId, router ]); + + const DynamicMoveOrganizationComponent = dynamic(() => + import("@pet-management-webapp/shared/ui/ui-components").then((module) => module.MoveOrganizationComponent)); + + useEffect(() => { + if (redirectSeconds <= 1) { + redirectToOrg(); + + return; + } + + setTimeout(() => { + setRedirectSeconds((redirectSeconds) => redirectSeconds - 1); + }, moveTime); + }, [ redirectSeconds, orgId, redirectToOrg ]); + + return ( + + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/signin.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/signin.tsx new file mode 100644 index 000000000..69bacde31 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/pages/signin.tsx @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { LogoComponent } from "@pet-management-webapp/business-admin-app/ui/ui-components"; +import { SigninRedirectComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import { orgSignin } from "@pet-management-webapp/shared/util/util-authorization-config-util"; +import React, { useEffect, useState } from "react"; +import "rsuite/dist/rsuite.min.css"; + +/** + * + * @returns Signin interface (redirecting to the login or main interface) + */ +export default function Signin() { + + const moveTime = 40; + const [ redirectSeconds, setRedirectSeconds ] = useState(moveTime); + + const getOrgIdFromUrl = (): string => { + const currentUrl = window.location.href; + const url = new URL(currentUrl); + const searchParams = url.searchParams; + const orgId = searchParams.get("orgId"); + + return orgId; + }; + + useEffect(() => { + if (redirectSeconds <= 1) { + if (getOrgIdFromUrl()) { + orgSignin(true, getOrgIdFromUrl()); + } else { + orgSignin(true); + } + + return; + } + + setTimeout(() => { + setRedirectSeconds((redirectSeconds) => redirectSeconds - 1); + }, moveTime); + }, [ redirectSeconds ]); + + return ( + } + loaderContent="Redirecting to the organization login" + /> + ); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon-easy.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon-easy.png new file mode 100644 index 000000000..118c1d097 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon-easy.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon.png new file mode 100644 index 000000000..31eca84da Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon1.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon1.png new file mode 100644 index 000000000..56e11e44e Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon1.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon2.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon2.png new file mode 100644 index 000000000..17f077e5f Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/public/favicon2.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/Home.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/Home.module.css new file mode 100644 index 000000000..ba62fcc4c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/Home.module.css @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.title a { + text-decoration: none; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; +} + +.title, +.description { + text-align: center; +} + +.description { + margin: 4rem 0; + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 800px; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + max-width: 300px; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} + +@media (prefers-color-scheme: dark) { + + .card { + border-color: #222; + } + + .code { + background: #111; + } + + .logo img { + filter: invert(1); + } +} + +.chartDivForDoc { + width: 70vw; + height: 60vh; + margin-top: 5vh; + background-color: rgb(255, 255, 255); + border-radius: 1vh; +} + +.orgProfileDiv { + width: 70vw; + height: 45vh; + margin-top: 5vh; + background-color: rgb(255, 255, 255); + border-radius: 1vh; + overflow: auto; +} + +.bookingSummaryHeader { + font-size: 3vh; + font-weight: bold; + padding-top: 3vh; + padding-left: 3vh; +} + +.chartForBookingSummary { + width: 50vh; + height: 50vh; + margin-left: 40vw; +} + +.totalBookingCountHeader { + font-weight: bold; + font-size: 6vh; + margin-top: -40vh; + margin-left: 10vh; +} + +.totalBookingHeader { + font-weight: bold; + font-size: 3vh; + margin-left: 10vh; +} + +.dailyChartDivForDoc { + width: 70vw; + height: 80vh; + margin-top: 5vh; + background-color: rgb(255, 255, 255); + border-radius: 1vh; +} + +.dailyBookingSummaryHeader { + font-size: 3vh; + font-weight: bold; + padding-top: 3vh; + padding-left: 3vh; +} + +.dailiBookingsChart { + margin-left: 5vw; + margin-top: 10vh; + width: 100vh; + height: 50vh; +} + +.welcomeDiv { + margin-top: -8vh; + margin-left: 9vh; + font-weight: bold; + font-size: 3vh; +} + +.welcomeMainDiv { + background-color: #ffffff; + height: 13vh; + min-width: 28vw; + width: 70vw; + border-radius: 1vh; + padding: 2vh; +} + +.tagLine { + margin-top: 0vh; + margin-left: 9vh; + font-size: 2vh; +} + +.upcomingBookingsDivForUser { + width: 70vw; + min-height: 15vh; + margin-top: 5vh; + background-color: rgb(255, 255, 255); + border-radius: 1vh; +} + +.dashboardBookingDiv { + background-color: rgb(236, 238, 238); + padding: 3vh; +} + +.noUpcomingBookingsDiv { + margin-left: 1.5vw; + margin-top: 1vh; +} + +.orgInfoGrid { + width: 30vw; + margin-left: 2vw; + margin-top: -5vh; +} + +.orgInfoFont { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + /* margin-bottom: 2.5vh; */ +} + +.orgInfoInputStyle { + width: 25vw; + font-size: 2vh; + margin-bottom: 1.5vh; + /* padding: 0.1vh; + margin-bottom: 1vh; */ +} + +.editOrgDetailBtn { + position: sticky; + margin-left: 65vw; + width: 2.5vw; + height: 2.5vw; + background-color: #d8d8d8; + border-radius: 1vh; + +} + +.buttonContainer { + position: sticky; + top: 0; + right: 0; + margin-left: 61vw; + display: flex; + align-items: center; + padding-left: 1vw; + } + +.saveEditOrgDetailBtn { + width: 2.5vw; + height: 2.5vw; + background-color: #d8d8d8; + border-radius: 1vh; + margin-right: 0.5vw; +} + +.closeEditOrgDetailBtn { + width: 2.5vw; + height: 2.5vw; + background-color: #d8d8d8; + border-radius: 1vh; + margin-right: 0.5vw; +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/Settings.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/Settings.module.css new file mode 100644 index 000000000..1552821e9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/Settings.module.css @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.tableMainPanelDiv { + display: flex; + flex-direction: column; + gap: 40px; + height: 100%; +} + +.tableMainPanelDiv .rs-table-body-row-wrapper { + height: 100vh; +} + +.addUserMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; +} + +.addUserButton{ + width: 25%; +} + +/* getStartedSectionComponent */ + +/* getStartedSectionComponent-GetStartedText-Div */ +.getStartedSectionComponentGetStartedTextDiv { + height: 80vh +} + +/* getStartedSectionComponent-GetStartedText-Panel */ +.getStartedSectionComponentGetStartedTextPanel{ + height: 100%; + display: flex; + justify-content: center; + align-items: center; + padding: 10px; +} + +/* getStartedSectionComponent-GetStartedText-P */ +.getStartedSectionComponentGetStartedTextP { + text-align: center ; +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/app.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/app.module.css new file mode 100644 index 000000000..ca46d95d0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/app.module.css @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.step_wrapper { + background: #fafafa; + margin-bottom: 10px; + padding: 20px; + border-radius: 8px; + display: flex; + row-gap: 10px; + align-items: center; + border: 1px lightgrey solid; + position: relative; +} + +.step_name { + position: absolute; + border: 1px lightgrey solid; + background: #fafafa; + padding: 8px 12px; + top: -15px; + left: 15px; + border-radius: 16px; +} + +.step { + padding-top: 15px; + border-radius: 4px; + display: flex; + column-gap: 15px; +} + +.option { + background: white; + width: fit-content; + border: 1px lightgrey solid; + display: flex; + align-items: center; + justify-content: center; + column-gap: 10px; + padding: 10px; + border-radius: 8px; +} + +.option_wrapper { + display: flex; + align-items: center; + justify-content: center; + column-gap: 10px; +} + +.option_add_button { + display: flex; + align-items: center; + justify-content: center; + position: absolute; + background: #eaeaea; + padding: 30px; + right: 0; + height: 100%; + font-size: 2em; + color: slategray; + border-top-right-radius: 7px; + border-bottom-right-radius: 7px; +} + +.option_add_button:hover { + background: #d9d9d9; + cursor: pointer; +} + +.idp_option_list { + display: flex; + flex-direction: column; + row-gap: 10px; +} + +.idp_option { + padding: 10px; + border: 1px lightgray solid; + border-radius: 8px; +} + +.idp_option:hover { + background: #fafafa; + cursor: pointer; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/application.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/application.module.css new file mode 100644 index 000000000..ac027fdd9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/application.module.css @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.select__app__empty__card { + display: flex; + flex-direction: column; + align-items: left; + justify-content: space-between; + border: whitesmoke 0.5px solid; + border-radius: 5px; + padding: 8px; + width: 100%; +} + +.select__app__list { + display: flex; + flex-direction: column; + row-gap: 10px; +} + +.select__app__list_item__card { + border: whitesmoke 0.5px solid; + border-radius: 5px; + padding: 8px; + width: 100%; +} + +.select__app__list_item__card:hover { + background-color: rgba(245, 245, 245, 0.2); + transition: background-color 10ms linear; + cursor: pointer; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/booking.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/booking.module.css new file mode 100644 index 000000000..4681c7c2e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/booking.module.css @@ -0,0 +1,484 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + .addBookingFormDiv { + position: absolute; + top: 0vh; + left: 2vw; + width: 42vw; + height: 50vh; + overflow: hidden; +} + +.addUserMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; + width: 45vw; + height: 50vh; +} + +.channelDocMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; + width: 100vw; + height: 50vh; +} + +.chooseTimeHeader { + font-weight: bold; + font-size: 3vh; + color: #6b6e6e; + text-align: left; + +} + +.timeSlotButton { + background-color: #d1cfcf; + border-radius: 3px; + border: none; + color: #080808; + display: inline-block; + font-size: 2vh; + text-align: center; + text-decoration: none; + width: 45vw; + cursor: pointer; + -webkit-text-size-adjust: none; + padding: 1vh; + position: absolute; + outline: none; +} + +.timeSlotButton:focus{ + background-color: var(--primary-color); + color: white; +} + +.nextBtnDiv { + position: absolute; + bottom: 2vh; + right: 3vw; +} + +.cancelBtnDiv { + position: absolute; + bottom: 2vh; + right: 11vw; +} + +.docUnavailableDiv { + font-size: 2vh; + color: #6b6e6e; + margin-top: 2vh; +} + +.petsDiv { + text-align: left; + margin-top: 2vh; + background-color: #dbdcdc; + position: absolute; + padding: 1vh; + width: 43vw; + height: 42vh; + overflow-y: scroll; + overflow-x: hidden; +} + +.petInAddBooking { + background-color: #ffffff; + border-radius: 3px; + border: none; + color: #080808; + display: inline-block; + font-size: 2vh; + text-align: center; + text-decoration: none; + width: 19vw; + height: 20vh; + cursor: pointer; + -webkit-text-size-adjust: none; + padding: 1vh; + position: relative; + outline: none; +} + +.petInAddBooking:focus { + background-color: var(--primary-color); +} + +.petIcon { + position: absolute; + width: 15vh; + height: 15vh; + top: 1vh; + left: 1vw; +} + +.petSummary { + position: absolute; + width: 10vw; + left: 11vw; + top: 5vh; + text-align: left; +} + +.petTitleInCard { + font-size: 2.5vh; + font-weight: bold; +} + +.petSummaryInCard { + font-size: 2vh; + color: rgb(145, 143, 143); + font-weight: bold; +} + +.timeslotDiv { + text-align: left; + margin-top: 2vh; +} + +.alignLeft { + display: inline-block; + text-align: left; + padding: 1.5vh; + font-size: 3vh; + } + +.labelStyle { + margin-bottom: 2vh; + font-size: medium; +} + +.inputStyle2 { + width: 40vw; + height: 2vh; + font-size: 2.5vh; + padding: 2vh; +} + +.bookingCard { + height: 27vh; +} + +.bookingIcon { + /* position: absolute; */ + /* width: 5vh; + height: 5vh; + margin-top: 2.5vh; + margin-left: 0.5vw; */ + display: flex; + align-items: center; + justify-content: flex-start; + width: 5vh; + height: 5vh; + margin-top: 3vh; + margin-left: 0.5vw; +} + +.bookingSummary { + /* position: absolute; */ + /* width: 18vw; + margin-left: 4vw; + margin-top: 0vh; + text-align: left; */ + display: flex; + align-items: flex-start; + justify-content: flex-start; + width: 15vw; + margin-left: 4vw; + margin-top: -4vh; + text-align: left; +} + +.bookingOverviewFont { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + padding-bottom: 1vh; +} + +.bookingOverviewFontSec { + font-size: 2vh; + color: rgb(22, 164, 36); + font-weight: bold; + padding-bottom: 1vh; +} + +.bookingIconInOverview { + width: 30vh; + height: 30vh; + object-fit: contain; + left:4vw; + top:1vh; + position: absolute; +} + +.bookingOverviewMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; + width: 75vw; + height: 80vh; +} + +.bookingOverviewFont { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + padding-bottom: 1vh; +} + +.basicInfoDiv { + width: 45vw; + position: absolute; + margin-left: 24vw; +} + +.bookingInfoDiv { + background-color: rgb(240, 239, 239); + border-radius: 1vh; + width: 33vw; + height: 40vh; + position: absolute; + margin-top: 25vh; + right: 3vw; +} + +.bookingDetailsMainDiv { + display: flex; + flex-direction: column; + gap: 40px; + height: 100vh; + width: 100vw; + overflow-y: scroll; +} + +.bookingDetailHeader { + position: absolute; + left: 20vw; + top: 3vh; + width: 76%; +} + +.backBtn { + background-color: var(--primary-color); + border-radius: 3px; + border: none; + color: #ffffff; + display: inline-block; + font-size: 2vh; + text-align: center; + text-decoration: none; + width: 8vw; + cursor: pointer; + -webkit-text-size-adjust: none; + padding: 1vh; + position: absolute; + margin-top: 5vh; + left: 7vw; + outline: none; +} + + +.bookingInfoDivHeader { + font-size: 2.5vh; + font-weight: bold; + text-align: left; + margin-top: 3vh; + margin-left: 2vw; +} + +.bokingDetailGridItemInfo { + position: absolute; + margin-top: 3vh; + margin-left: 2vw; + width: 28vw; + height: 40vh; +} + +.bookingDetailFont { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + padding-bottom: 1vh; +} + +.bookingDetailFontSec { + font-size: 2vh; + color: rgb(22, 164, 36); + font-weight: bold; +} + +.petInfoDiv { + position: absolute; + margin-top: 25vh; + margin-left: 20vw; +} + +.petInfoHeader { + font-size: 2.5vh; + font-weight: bold; + margin-top: 2vh; +} + +.petImageInBookingDetails { + position: absolute; + width: 30vh; + height: 30vh; + margin-top: 8vh; + margin-left: 0vw; +} + +.petInfoBasicDetails { + position: absolute; + width: 20vw; + height: 17vh; + margin-top: 8vh; + margin-left: 18vw; + background-color: rgb(240, 239, 239); + border-radius: 1vh; + padding: 2vh; +} + +.vaccInfoDivHeader { + font-size: 2.5vh; + font-weight: bold; + text-align: left; + margin-top: 80vh; + margin-left: 20vw; + overflow-y: auto; +} + +.vaccInfoDiv { + position: absolute; + background-color: rgb(240, 239, 239); + border-radius: 1vh; + width: 45vw; + height: 30vh; + margin-top: 88vh; + margin-left: 20vw; + overflow-y: auto; +} + +.vaccineInfoBoxInBookingDetail{ + width: 40vw; + padding-left: 2vh; +} + +.noVaccDetailsLabel { + position: absolute; + left: 1vw; + top: 3vh; +} + +.noDetailLabel { + font-size: 2vh; + color: #6d7273; +} + +.medicalReportDivHeader { + font-size: 2.5vh; + font-weight: bold; + text-align: left; + position: absolute; + margin-top: 125vh; + margin-left: 20vw; +} + +.medicalReportInfoDivHeader { + font-size: 2.5vh; + font-weight: bold; + text-align: left; + position: absolute; + margin-top: 130vh; + margin-left: 20vw; +} + +.medicalReportDiv { + position: absolute; + background-color: rgb(240, 239, 239); + border-radius: 1vh; + width: 45vw; + height: 30vh; + margin-top: 140vh; + margin-left: 20vw; + overflow-x: auto; + overflow-y: auto; +} + +.noMedicalReportsLabel { + position: absolute; + left: 1vw; + top: 4vh; + font-size: 2vh; + color: #6d7273; + overflow-y: auto; +} + +.addMedicalReportBtnDiv{ + position: absolute; + top: 128vh; + margin-left: 60vw; +} + +.addReportBtn { + background-color: var(--primary-color); + border-radius: 3px; + border: none; + color: #ffffff; + display: inline-block; + font-size: 2vh; + text-align: center; + text-decoration: none; + width: 5vw; + cursor: pointer; + -webkit-text-size-adjust: none; + padding: 1vh; + position: absolute; + margin-top: 12vh; + left: 7vw; + outline: none; +} + +.medicalReportRow { + background-color: #f8f8f8; +} + +.medicalReportRow:hover { + background-color: #bcbcbc; +} + +.medicalReportInfolabel { + font-size: 2vh; + height: 9vh; +} + +.doctorOverviewMainDiv { + width: 50vw; + height: 80vh; + min-height: 50vh; +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/custom-theme.less b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/custom-theme.less new file mode 100644 index 000000000..e67858a23 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/custom-theme.less @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +@import "~rsuite/styles/index.less"; +@import "custom-theme.less"; + +@primary-color: #4e40ed; +@primary-color-dark: #35c2ff; +@primary-color-high-contrast: #ffff00; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/doctor.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/doctor.module.css new file mode 100644 index 000000000..abd311f49 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/doctor.module.css @@ -0,0 +1,591 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + .tableMainPanelDivDoc { + display: flex; + flex-direction: column; + gap: 40px; + height: 100%; + background-color: rgb(228, 228, 228); +} + +.tableMainPanelDivDoc .rs-table-body-row-wrapper { + height: 100vh; +} + + .doctorIcon { + position: relative; + width: 15vh; + height: 15vh; + margin-top: 1.5vh; + margin-left: 1vw; + } + + .petIcon { + position: relative; + width: 15vh; + height: 15vh; + margin-top: 1.5vh; + margin-left: 1vw; + } + + .doctorCard { + height: 25vh; + } + + .doctorSummary { + position: relative; + width: 10vw; + margin-left: 10vw; + margin-top: -15vh; + text-align: left; + } + + .petSummary { + position: relative; + width: 10vw; + margin-left: 10vw; + margin-top: -15vh; + text-align: left; + } + + .docTitleInCard { + font-size: 2.5vh; + font-weight: bold; + } + + .docSummaryInCard { + font-size: 2vh; + color: rgb(145, 143, 143); + font-weight: bold; + } + +.doctorOverviewMainDiv { + width: 70vw; + height: 80vh; + min-height: 50vh; + /* overflow: hidden; */ +} + +.doctorOverviewTitle{ + width: 30%; + position: absolute; + left: 25vw; + text-align: left; + font-weight: bold; + font-size: 5vh; +} + +.basicInfoDiv { + width: 29vw; + margin-left: 24vw; +} + +.docOverviewFont { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + padding-bottom: 1vh; +} + +.availabilityHeaderInOverview { + width: 20vw; + position: absolute; + left: 24vw; + text-align: left; + font-weight: bold; + font-size: 2.5vh; + color: black; + top: 35vh; +} + +.availabilityHeaderInProfileEdit { + width: 20vw; + position: absolute; + left: 24vw; + text-align: left; + font-weight: bold; + font-size: 2.5vh; + color: black; + top: 48vh; +} + +.availabilityHeaderInEdit { + width: 20vw; + position: absolute; + left: 24vw; + text-align: left; + font-weight: bold; + font-size: 2.5vh; + color: black; + top: 50vh; +} + +.medicineHeaderInReport { + width: 20vw; + /* position: absolute; */ + left: 0vw; + text-align: left; + font-weight: bold; + font-size: 2.3vh; + color: rgb(82, 82, 82); + /* top: 35vh; */ +} + +.noAvailabilityInfoDiv { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + position: relative; + left: 0vw; + margin-top: 2vw; +} + +.availabilityInfoDivInOverview { + width:30vw; + position: absolute; + left: 24vw; + top: 38vh; +} + +.availabilityInfoDivInEdit { + width:30vw; + position: absolute; + left: 24vw; +} + +.vaccInfoDivInOverview { + width:30vw; + /* position: absolute; */ + top:18vh; + margin-left: 24vw; +} + +.docImageStyle { + width: 30vh; + height: 30vh; + object-fit: contain; + left:4vw; + top:1vh; + position: absolute; +} + +.editButton { + width: 6vw; + height: 6vh; + object-fit: contain; + right:1%; + position: absolute; + transform: translate(-35%, 10vh); +} + +.docEditFont { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + padding-bottom: 1.5vh; + padding-top: 1vh; +} + +.docEditInputStyle { + width: 13vw; + height: 2vh; + padding: 2vh; + margin-bottom: 1vh; + font-size: 2vh; + color: rgb(105, 105, 105); +} + +.availabilityInfoGridInEditView { + width: 40vw; + left: 24vw; + position: absolute; + top: 70vh; +} + +.availabilityInfoGridHeadersInEdit { + text-align: left; + width: 40vw +} + +.availabilityInfoGridHeaderStyleInEdit{ + width: 6.7vw; + font-size: 1.5vh; + padding: 1vh; + margin-right: 4vw; + font-weight: bold; + color: rgb(101, 101, 101); +} + +.availabilityInputStyle { + width: 8vw; + font-size: 1.5vh; + padding: 1vh; + margin-right: 1vw; +} + +.availabilityPlusButtonStyle { + height: 5vh; + width: 5vh; + background-color: var(--primary-color); + border: none; + border-radius: 1vh; + color: white; + font-weight: bolder; + font-size: 2vh; +} + +.availabilityInfoResultTableInEdit { + width: 40vw; + left: 24vw; + position: absolute; + top: 78vh; +} + +.removeBtn { + border: none; + border-radius: 3px; + background-color: #f09090; + color: white; + font-weight: bolder; +} + +.updateDocImageDiv { + width: 15vw; + height: 5vh; + object-fit: contain; + left:4vw; + top:35vh; + position: absolute; + text-align: left; + font-family: Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 2vh; + color: rgb(105, 105, 105); +} + +.docUploadBtnDiv { + position: absolute; + top: 40vh; + left: 4vw; +} + +.docUploadBtnStyleSec { + text-decoration: none; + border: none; + padding: 1vh 2vh; + margin-right: 1vw; + font-size: 2vh; + background-color: var(--primary-color); + color: #fff; + border-radius: 5px; + box-shadow: 7px 6px 28px 1px rgba(0, 0, 0, 0.24); + cursor: pointer; + outline: none; + transition: 0.2s all; +} + + +.fileNameLabel { + max-width: 10vw; + display: inline-block; + font-size: 2vh; + font-family: Arial, Helvetica, sans-serif; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.docUploadBtnDivSec { + position: absolute; + top: 47vh; + left: 4vw; +} + +.infoDiv { + position: absolute; + left: 24vw; + top: 55vh; + width: 40vw; + height: 13vh; + font-size: 2vh; +} + +.doctorProfilePic { + position: absolute; + width: 30vh; + height: 30vh; + margin-top: 25vh; + margin-left: 5vw; +} + +.docProfileInfoDiv { + position: absolute; + width: 50vw; + margin-top: 25vh; + margin-left: 25vw; + padding: 1vw; + padding-left: 2vw; + padding-right: 7vw; + background-color: #fff; + border-radius: 1vh; +} + +.docProfileFont { + font-size: 2.5vh; + color: rgb(124, 124, 124); + font-weight: bold; + padding: 1vh; +} + +.noVaccinationInfoDiv { + font-size: 2vh; + color: rgb(105, 105, 105); + font-weight: bold; + left: 0vw; + margin-top: 1vh; + padding-bottom: 1vh; +} + +.addUserMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; +} + +.addMedicalMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; + height: fit-content; + width: 45vw +} + +.petOverviewMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; + min-height: 40vh; +} + +.editMedicalReportMainDiv { + display: flex; + overflow: hidden; + flex-direction: column; + margin-top: 10px; + margin-bottom: 10px; + min-height: 40vh; +} +.vaccinationHeaderInOverview { + width: 20vw; + /* position: absolute; */ + margin-left: 24vw; + text-align: left; + font-weight: bold; + font-size: 2.5vh; + top: 15vh; + color: black; +} + +.medicalReportHeaderInOverview { + text-align: left; + font-weight: bold; + font-size: 2.5vh; + color: black; + margin-left: 24vw; + /* margin-top: 10vh; */ +} + +.vaccinationHeaderInEdit { + width: 20vw; + position: absolute; + left: 24vw; + text-align: left; + font-weight: bold; + font-size: 2.5vh; + top: 20vh; + color: black; +} + +.vccDivGridStyle { + width: 50vw; + top:43vh; + left: 24vw; + position: absolute; +} + +.infoDivInPetEdit { + position: absolute; + top: 25vh; + left: 24vw; + width: 40vw; + height: 13vh; + font-size: 2vh; +} + +.vccUpdateInputStyleSec { + width: 11vw; + font-size: 2vh; + padding: 1vh; +} + +.editPetMainDiv { + width: 29vw; + height: 40vh; + margin-left: 24vw; + overflow-x: hidden; +} + +.plusButtonStyle { + height: 5vh; + width: 5vh; + background-color: var(--primary-color); + border: none; + border-radius: 1vh; + color: white; + font-weight: bolder; + font-size: 2vh; +} + +.vaccineInfoBox{ + width: 50vw; + position: absolute; + left: 23vw; + top: 50vh; +} + +.medicineInfoGrid { + width: 40vw; + left: 2vw; + padding-top: 3vh; +} + +.medicineInputStyle { + width: 10vw; + font-size: 1.5vh; + padding: 1vh; + margin-right: 1vw; +} + +.medicinePlusButtonStyle { + height: 5vh; + width: 5vh; + background-color: var(--primary-color); + border: none; + border-radius: 1vh; + color: white; + font-weight: bolder; + font-size: 2vh; +} + +.medicalReportCard { + background-color: #e0dfdf; + padding: 2vh; + margin-bottom: 2vh; + width: 40vw; + overflow-y: auto; +} + +.medicationTable { + background-color: #ededed; + margin-top:2vh; +} + +.trashIcon { + width: 100%; + height: 3vw; + padding-top: 2vh; + padding-left: 36vw; + position: relative; + right: 0px; bottom: 0px; +} + +.trashButton { + height: 4vh; + width: 4vh; + background-color: #ffffff; + border-radius: 1vh; +} + +.notificationDiv { + background-color: #ffffff; + height: 40vh; + width: 50vw; + border-radius: 1vh; +} + +.notificationHeader { + padding-left: 3vh; + padding-top: 2vh; + font-size: 2.5vh; + font-weight: bold; +} + +.settingsGrid { + margin-top: 5vh; +} + +.container { + position: relative; + background-color: #f09090; +} + +.settingsSaveBtn { + background-color: var(--primary-color); + color: white; + border: none; + width: 7vw; + height: 5vh; + border-radius: 5px; + position: absolute; + bottom: -13vh; + right: 2vw; + font-size: 2vh; +} + +.settingsEmailInputStyle { + width: 15vw; + height: 2vh; + font-size: 2vh; + padding: 2vh; +} + +.datePickerDiv { + width: 40vw; + height: 30vh; +} + +.petVaccInfoContainer { + display: flex; + flex-direction: column; +} + +.tailSpinDiv { + position: sticky; + top:50%; + left: 50%; + height: 100%; + margin-left: 20%; + margin-top: 5%; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/globals.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/globals.css new file mode 100644 index 000000000..b5b8c7f68 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/globals.css @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (http://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +html, +body { + padding: 0; + margin: 0; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; + font-family: 'Nunito Sans', sans-serif; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/idp.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/idp.module.css new file mode 100644 index 000000000..31625adb2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/styles/idp.module.css @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 WSO2 LLC. (https://www.wso2.com). + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + *http://www.apache.org/licenses/LICENSE-2. + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.idp__template__list { + display: flex; + flex-direction: column; + row-gap: 10px; +} + +.idp__template__card { + display: flex; + align-items: center; + justify-content: space-between; + border: whitesmoke 1px solid; + border-radius: 5px; + padding: 8px; + width: 100%; +} + +.idp__template__card:hover { + background-color: rgba(245, 245, 245, 0.2); + transition: background-color 10ms linear; + cursor: pointer; +} + +.idp__list { + width: 100%; + margin-top: 10px; +} + +.idp__list__item { + padding: 10px; + width: 100vw; + display: flex; + align-items: center; + justify-content: space-between; + +} + +.idp__list__item small { + font-weight: lighter; + font-size: 12px; +} + +.idp__item__details { + width: 100px; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/tsconfig.json new file mode 100644 index 000000000..744e2a939 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/tsconfig.json @@ -0,0 +1,30 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "jsx": "preserve", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": false, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "resolveJsonModule": true, + "isolatedModules": true, + "incremental": true, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "**/*.js", + "**/*.jsx", + "next-env.d.ts" + ], + "exclude": [ + "node_modules", + "jest.config.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/tsconfig.spec.json new file mode 100644 index 000000000..e9999c8aa --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/tsconfig.spec.json @@ -0,0 +1,24 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": [ + "jest", + "node" + ], + "jsx": "react" + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/booking.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/booking.ts new file mode 100644 index 000000000..49eb1eb35 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/booking.ts @@ -0,0 +1,93 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface Booking { + appointmentNumber: number; + date: string; + doctorId: string; + mobileNumber: string; + petDoB: string; + petId: string; + petName: string; + petOwnerName: string; + petType: string; + sessionEndTime: string; + sessionStartTime: string; + status: string; + createdAt: string; + emailAddress: string; + id: string; + org: string; + } + +export interface BookingResult { + appointmentNumber: number; + date: string; + doctorId: string; + mobileNumber: string; + petDoB: string; + petId: string; + petName: string; + petOwnerName: string; + petType: string; + sessionEndTime: string; + sessionStartTime: string; + status: string; + createdAt: string; + emailAddress: string; + id: string; + org: string; + referenceNumber: string; + } + +export interface BookingInfo { + date: string; + doctorId: string; + mobileNumber: string; + petDoB: string; + petId: string; + petName: string; + petOwnerName: string; + petType: string; + sessionEndTime: string; + sessionStartTime: string; + } + +export interface CompleteBooking{ + date: string; + doctorId: string; + email: string; + mobileNumber: string; + petDoB: string; + petId: string; + petName: string; + petOwnerName: string; + petType: string; + sessionEndTime: string; + sessionStartTime: string; + status: string; + } + +export interface AppointmentNoInfo { + activeBookingCount: number; + date: string; + doctorId: string; + nextAppointmentNumber: 0; + sessionEndTime: string; + sessionStartTime: string; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/doctor.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/doctor.ts new file mode 100644 index 000000000..7bd386764 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/doctor.ts @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface Doctor { + address: string; + availability: Availability[]; + dateOfBirth: string; + emailAddress: string; + gender: string; + name: string; + registrationNumber: string; + specialty: string; + createdAt: string; + id: string; + org: string; +} + +export interface DoctorInfo { + address?: string; + availability?: Availability[]; + dateOfBirth?: string; + emailAddress: string; + gender?: string; + name: string; + registrationNumber: string; + specialty?: string; +} + +export interface Availability { + date: string; + timeSlots: TimeSlot[]; + +} + +export interface TimeSlot { + availableBookingCount: number; + endTime: string; + startTime: string; +} + +export interface OrgInfo { + address: string; + name: string; + registrationNumber: string; + telephoneNumber: string; + orgName: string; +} + +export interface UpdateOrgInfo { + address: string; + name: string; + registrationNumber: string; + telephoneNumber: string; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/next-auth.d.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/next-auth.d.ts new file mode 100644 index 000000000..55de3b7a9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/next-auth.d.ts @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Profile } from "next-auth"; +import { JWT } from "next-auth/jwt"; + +declare module "next-auth" { + interface Session { + error: boolean, + expires: boolean, + accessToken?: string, + adminAccessToken?: string, + idToken?: JWT, + scope?: string, + refreshToken?: string, + userId?: string, + user?: User | null, + orgId?: string, + orgName?: string, + orginalIdToken?: string, + group?: string, + } +} + +declare module "next-auth/jwt" { + interface JWT { + idToken?: string, + accessToken?: string, + scope?: string, + user?: Profile + } +} + +declare module "next-auth" { + interface Profile { + email?: string, + sub?: string, + family_name?: string, + given_name?: string, + username?: string, + user_organization?: string, + org_name?: string, + org_id: string, + groups: string[] + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/personalization.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/personalization.ts new file mode 100644 index 000000000..c70b184f8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/personalization.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface Personalization { + org: string; + logoUrl: string; + logoAltText: string; + faviconUrl: string; + primaryColor: string; + secondaryColor: string; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/pets.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/pets.ts new file mode 100644 index 000000000..79006340d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/apps/business-admin-app/types/pets.ts @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface PetInfo { + name: string; + breed: string; + dateOfBirth: string; + id: string; + owner: string; + + } + +export interface Pet { + name: string; + breed: string; + dateOfBirth: string; + id: string; + vaccinations: VaccineInfo[]; + } + + +export interface VaccineInfo { + name: string; + lastVaccinationDate: string; + nextVaccinationDate: string; + enableAlerts: boolean; + } + +export interface updatePetInfo { + name: string; + breed: string; + dateOfBirth: string; + vaccinations: VaccineInfo[]; + } + +export interface Notifications { + notifications: NotificationInfo; + } + +export interface NotificationInfo { + enabled: boolean; + emailAddress: string; + } + + +export interface MedicalReport { + diagnosis: string; + medications: Medicine[]; + treatment: string; + createdAt: string; + reportId: string; + } + +export interface UpdateMedicalReport { + diagnosis: string; + medications: Medicine[]; + treatment: string; + } + +export interface Medicine { + dosage: string; + drugName: string; + duration: string; + } diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/babel.config.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/babel.config.json new file mode 100644 index 000000000..bccf49288 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/babel.config.json @@ -0,0 +1,5 @@ +{ + "babelrcRoots": [ + "*" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/config.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/config.json new file mode 100644 index 000000000..5863c0425 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/config.json @@ -0,0 +1,97 @@ +{ + "CommonConfig": { + "AuthorizationConfig": { + "BaseOrganizationUrl": " ex: https://api.asgardeo.io/t/guardio", + "BaseUrl": "https://localhost:9443" + }, + "ApplicationConfig": { + "SampleOrganization": [ + { + "id": "", + "name": "" + } + ] + } + }, + "BusinessAdminAppConfig": { + "AuthorizationConfig": { + "ClientId": "", + "ClientSecret": "" + }, + "ManagementAuthorizationConfig": { + "ClientId": "", + "ClientSecret": "" + }, + "ApplicationConfig": { + "HostedUrl": "http://localhost:3002", + "APIScopes": [ + "openid", + "email", + "profile", + "groups", + "roles", + "internal_login", + "internal_org_user_mgt_view", + "internal_org_user_mgt_list", + "internal_org_user_mgt_update", + "internal_org_user_mgt_delete", + "internal_org_user_mgt_create", + "internal_org_idp_view", + "internal_org_idp_create", + "internal_org_idp_update", + "internal_org_idp_delete", + "internal_org_application_mgt_view", + "internal_org_application_mgt_update", + "internal_org_organization_view", + "internal_org_group_mgt_view", + "internal_org_group_mgt_list", + "internal_org_group_mgt_update", + "internal_org_group_mgt_delete", + "internal_org_group_mgt_create", + "internal_org_role_mgt_view", + "internal_org_role_mgt_update", + "internal_org_branding_preference_update", + "list_doctors", + "create_doctor", + "view_doctor", + "update_doctor", + "delete_doctor", + "list_bookings", + "view_appointment", + "view_profile", + "create_bookings", + "view_booking", + "update_booking", + "delete_booking", + "view_org_info", + "update_org_info", + "list_pets", + "create_pet", + "view_pet", + "update_pet", + "view_user_settings", + "update_user_settings", + "create_branding", + "update_branding", + "delete_branding", + "internal_org_claim_meta_create", + "internal_org_claim_meta_view", + "internal_org_claim_meta_update", + "internal_org_claim_meta_delete" + ], + "Branding": { + "name": "Pet Care App", + "tag": "Taking good care of your pet" + } + }, + "resourceServerURLs": { + "channellingService": "", + "petManagementService": "", + "personalizationService": "" + }, + "ManagementAPIConfig": { + "SharedApplicationName": " ex: guardio-app", + "UserStore" : "PRIMARY" + } + } +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/jest.config.ts new file mode 100644 index 000000000..4dca27662 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/jest.config.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getJestProjects } from "@nrwl/jest"; + +export default { + projects: getJestProjects() +}; \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/jest.preset.js b/petcare-sample/b2b/web-app/petvet/web/nextjs/jest.preset.js new file mode 100644 index 000000000..b75215d5d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/jest.preset.js @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const nxPreset = require("@nrwl/jest/preset").default; + +module.exports = { ...nxPreset } \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/README.md b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/README.md new file mode 100644 index 000000000..3984314c7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/README.md @@ -0,0 +1,7 @@ +# business-admin-app-data-access-data-access-common-api-util + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test business-admin-app-data-access-data-access-common-api-util` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/jest.config.ts new file mode 100644 index 000000000..f87c5d412 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "business-admin-app-data-access-data-access-common-api-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/business-admin-app/data-access/data-access-common-api-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/src/index.ts new file mode 100644 index 000000000..1aae75579 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/src/index.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/apiUtil/api/apiRequestOptions"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiRequestOptions.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiRequestOptions.ts new file mode 100644 index 000000000..96310b118 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiRequestOptions.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getHostedUrl } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { RequestMethod, apiRequestOptions, apiRequestOptionsWithBody } from + "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * + * @param session - session object + * + * @returns header object that can used for IS API calls + */ +export function requestOptions(session: Session): RequestInit { + return apiRequestOptions(session, getHostedUrl()); +} + +export function requestOptionsWithBody(session: Session, method: RequestMethod, body: BodyInit): RequestInit { + return apiRequestOptionsWithBody(session, method, body, getHostedUrl()); +} + +export default { requestOptions, requestOptionsWithBody }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-api-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/jest.config.ts new file mode 100644 index 000000000..cf185b77d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "business-admin-app-data-access-data-access-common-models-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/business-admin-app/data-access/data-access-common-models-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/index.ts new file mode 100644 index 000000000..ec33129d6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/index.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as EnterpriseIdentityProvider from "./lib/identityProvider/data/templates/enterprise-identity-provider.json"; +import * as GoogleIdentityProvider from "./lib/identityProvider/data/templates/google.json"; +import * as StandardBasedOidcIdentityProvider + from "./lib/identityProvider/data/templates/standard-based-oidc-identity-provider.json"; +import * as StandardBasedSAMLIdentityProvider + from "./lib/identityProvider/data/templates/standard-based-saml-identity-provider.json"; + +export * from "./lib/application/application"; +export * from "./lib/application/applicationList"; +export * from "./lib/application/applicationUtils"; +export * from "./lib/application/authenticaitonSequenceModel"; +export * from "./lib/application/authenticationSequence"; +export * from "./lib/application/authenticationSequenceStepOption"; +export * from "./lib/identityProvider/identityProvider"; +export * from "./lib/identityProvider/identityProviderConfigureType"; +export * from "./lib/identityProvider/identityProviderDiscoveryUrl"; +export * from "./lib/identityProvider/identityProviderFederatedAuthenticator"; +export * from "./lib/identityProvider/identityProviderList"; +export * from "./lib/identityProvider/identityProviderTemplate"; +export * from "./lib/identityProvider/identityProviderTemplateModel"; +export * from "./lib/identityProvider/identityProviderUtils"; +export * from "./lib/role/role"; +export * from "./lib/role/roleGroups"; +export * from "./lib/role/roleList"; +export * from "./lib/role/roleUsers"; +export * from "./lib/branding/brandingPreference"; + +export { EnterpriseIdentityProvider }; +export { GoogleIdentityProvider }; +export { StandardBasedOidcIdentityProvider }; +export { StandardBasedSAMLIdentityProvider }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/application.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/application.ts new file mode 100644 index 000000000..90ab29589 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/application.ts @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallReturn, ControllerDecodeReturn } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import AuthenticationSequence from "./authenticationSequence"; + +export interface Application extends ControllerCallReturn, ControllerDecodeReturn { + id: string, + name: string, + description: string, + authenticationSequence: AuthenticationSequence, + [key: string]: unknown; +} + +export default Application; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/applicationList.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/applicationList.ts new file mode 100644 index 000000000..95be9ad4a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/applicationList.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallReturn, ControllerDecodeReturn } from + "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import Application from "./application"; + +export interface ApplicationList extends ControllerCallReturn, ControllerDecodeReturn { + totalResults: number, + applications: Application[], + [key: string]: unknown, +} + +export default ApplicationList; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/applicationUtils.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/applicationUtils.ts new file mode 100644 index 000000000..31708c56d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/applicationUtils.ts @@ -0,0 +1,128 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { OIDC_IDP, SAML_IDP } from "@pet-management-webapp/shared/util/util-common"; +import Application from "./application"; +import enterpriseOIDCFederatedAuthenticators + from "../identityProvider/data/templates/standard-based-oidc-identity-provider.json"; +import enterpriseSAMLFederatedAuthenticators + from "../identityProvider/data/templates/standard-based-saml-identity-provider.json"; +import IdentityProviderTemplateModel from "../identityProvider/identityProviderTemplateModel"; + +/** + * + * @param templateId - application details template id + * + * @returns template related to the template id. + */ + +export function selectedTemplateBaesedonTemplateId(templateId: string): IdentityProviderTemplateModel | null { + switch (templateId) { + case OIDC_IDP: + return enterpriseOIDCFederatedAuthenticators; + case SAML_IDP: + return enterpriseSAMLFederatedAuthenticators; + default: + return null; + } +} + +/** + * + * @param template - applicaiton details template + * @param idpDetails - identity provider details + + * @returns `[check,onlyIdp]` + * `check` - if the idp is in authentication sequence, + * `onlyIdp` - is the idp is the only idp in the sequence + */ +export function checkIfIdpIsinAuthSequence(template: Application, idpDetails): boolean[] { + const authenticationSequenceModel = template.authenticationSequence; + const idpName = idpDetails.name; + let check = false; + let onlyIdp = false; + + authenticationSequenceModel.steps.forEach((step) => { + step.options.forEach((option) => { + if (option.idp === idpName) { + check = true; + } + }); + + if (step.options.length === 1) { + onlyIdp = true; + } + }); + + return [ check, onlyIdp ]; +} + +export function checkIfAuthenticatorIsinAuthSequence(template: Application, authenticatorName: string): boolean[] { + const authenticationSequenceModel = template.authenticationSequence; + let check = false; + let onlyIdp = false; + + authenticationSequenceModel.steps.forEach((step) => { + step.options.forEach((option) => { + if (option.authenticator === authenticatorName) { + check = true; + } + }); + + if (step.options.length === 1) { + onlyIdp = true; + } + }); + + return [ check, onlyIdp ]; +} + +/** + * + * @param template - applicaiton details template + * @returns `true` if BASIC AUTH is available in auth sequence, else `false` + */ +export function checkIfBasicAvailableinAuthSequence(template): boolean { + const authenticationSequenceModel = template.authenticationSequence; + let check = false; + + authenticationSequenceModel.steps.forEach((step) => { + step.options.forEach((option) => { + if (option.authenticator === "BasicAuthenticator") { + check = true; + } + }); + }); + + return check; +} + +/** + * PatchApplicationAuthMethod mentioned whether we are adding or removing the idp. + * `REMOVE` Will remove the idp from every step + */ +export const PatchApplicationAuthMethod = { + ADD: true, + REMOVE: false +}; + +export default { + PatchApplicationAuthMethod, checkIfBasicAvailableinAuthSequence, checkIfIdpIsinAuthSequence, + selectedTemplateBaesedonTemplateId + +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticaitonSequenceModel.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticaitonSequenceModel.ts new file mode 100644 index 000000000..b04aef77e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticaitonSequenceModel.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import AuthenticationSequence from "./authenticationSequence"; + +export interface AuthenticationSequenceModel { + authenticationSequence: AuthenticationSequence +} + +export default AuthenticationSequenceModel; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticationSequence.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticationSequence.ts new file mode 100644 index 000000000..93d2dac4e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticationSequence.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import AuthenticationSequenceStepOption from "./authenticationSequenceStepOption"; + +interface AuthenticationSequenceStep { + id: number, + options: AuthenticationSequenceStepOption[] +} + +export interface AuthenticationSequence { + attributeStepId: number, + requestPathAuthenticators?: string[], + steps: AuthenticationSequenceStep[], + subjectStepId: number, + type: string +} + +export default AuthenticationSequence; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticationSequenceStepOption.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticationSequenceStepOption.ts new file mode 100644 index 000000000..1b5cd7310 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/application/authenticationSequenceStepOption.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface AuthenticationSequenceStepOption { + idp: string, + authenticator: string +} + +export default AuthenticationSequenceStepOption; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/branding/brandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/branding/brandingPreference.ts new file mode 100644 index 000000000..fa9672269 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/branding/brandingPreference.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ControllerCallParam, ControllerCallReturn, ControllerDecodeReturn +} from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export interface BrandingPreference extends ControllerCallParam, ControllerCallReturn, ControllerDecodeReturn { + type: string, + name: string, + locale: string, + preference: unknown +} + +export default BrandingPreference; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/enterprise-identity-provider.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/enterprise-identity-provider.json new file mode 100644 index 000000000..1bda5db8e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/enterprise-identity-provider.json @@ -0,0 +1,151 @@ +{ + "category": "DEFAULT", + "description": "Enterprise login via standard OIDC protocol.", + "displayOrder": 3, + "id": "enterprise-idp", + "idp": { + "certificate": { + "jwksUri": "", + "certificates": [ + "" + ] + }, + "claims": { + "provisioningClaims": [], + "roleClaim": { + "uri": "" + }, + "userIdClaim": { + "uri": "" + } + }, + "description": "Enable login for users with their accounts in your existing identity providers via standard authentication protocols.", + "federatedAuthenticators": { + "authenticators": [ + { + "authenticatorId": "T3BlbklEQ29ubmVjdEF1dGhlbnRpY2F0b3I", + "isEnabled": true, + "properties": [ + { + "key": "ClientId", + "displayName": "Client Id", + "description": "The client identifier value of the identity provider.", + "type": "STRING", + "displayOrder": 1, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "ClientSecret", + "displayName": "Client Secret", + "description": "The client secret value of the identity provider.", + "type": "STRING", + "displayOrder": 2, + "regex": ".*", + "isMandatory": true, + "isConfidential": true, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "OAuth2AuthzEPUrl", + "displayName": "Authorization Endpoint URL", + "description": "The standard authorization endpoint URL obtained from the identity provider.", + "type": "STRING", + "displayOrder": 3, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "OAuth2TokenEPUrl", + "displayName": "Token Endpoint URL", + "description": "The standard token endpoint URL obtained from the identity provider.", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "OIDCLogoutEPUrl", + "displayName": "Logout URL", + "description": "The URL of the identity provider to which Asgardeo will send session invalidation requests.", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "callbackUrl", + "displayName": "Callback Url", + "description": "The WSO2 Identity Server URL to which the user needs to be redirected after completing the authentication at the identity provider. The identity provider needs to send the authorization code to this URL upon successful authentication.", + "type": "STRING", + "displayOrder": 5, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [], + "readOnly": true + }, + { + "key": "Scopes", + "displayName": "Scopes", + "description": "Scopes. e.g: value1 value2", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [], + "readOnly": true + } + ] + } + ], + "defaultAuthenticatorId": "T3BlbklEQ29ubmVjdEF1dGhlbnRpY2F0b3I" + }, + "homeRealmIdentifier": "", + "isFederationHub": false, + "isPrimary": false, + "name": "Enterprise Authentication Provider", + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "PRIMARY", + "associateLocalUser": true + } + }, + "roles": { + "mappings": [], + "outboundProvisioningRoles": [] + }, + "templateId": "enterprise-idp" + }, + "image": "enterprise", + "name": "Enterprise", + "services": [], + "disabled": false, + "templateId": "enterprise-idp", + "type": "ENTERPRISE" +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/google.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/google.json new file mode 100644 index 000000000..21dd67651 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/google.json @@ -0,0 +1,112 @@ +{ + "id": "8ea23303-49c0-4253-b81f-82c0fe6fb4a0", + "name": "Google", + "description": "Login users with existing Google accounts.", + "image": "google", + "category": "DEFAULT", + "displayOrder": 1, + "services": [], + "tags": [ + "Social-Login" + ], + "idp": { + "name": "Google", + "description": "Enable login for users with existing Google accounts.", + "isPrimary": false, + "isFederationHub": false, + "homeRealmIdentifier": "", + "certificate": { + "certificates": [] + }, + "alias": "https://localhost:9443/oauth2/token", + "claims": { + "userIdClaim": { + "uri": "http://wso2.org/claims/username" + }, + "roleClaim": { + "uri": "http://wso2.org/claims/role" + }, + "provisioningClaims": [] + }, + "roles": { + "mappings": [], + "outboundProvisioningRoles": [] + }, + "federatedAuthenticators": { + "defaultAuthenticatorId": "R29vZ2xlT0lEQ0F1dGhlbnRpY2F0b3I", + "authenticators": [ + { + "authenticatorId": "R29vZ2xlT0lEQ0F1dGhlbnRpY2F0b3I", + "isEnabled": true, + "properties": [ + { + "key": "ClientId", + "displayName": "Client ID", + "description": "Enter Google IDP client identifier value", + "type": "STRING", + "displayOrder": 1, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "ClientSecret", + "displayName": "Client secret", + "description": "Enter Google IDP client secret value", + "type": "STRING", + "displayOrder": 2, + "regex": ".*", + "isMandatory": true, + "isConfidential": true, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "callbackUrl", + "displayName": "Callback URL", + "description": "The callback URL used to obtain Google credentials.", + "type": "STRING", + "displayOrder": 3, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [], + "readOnly": true + }, + { + "key": "Scopes", + "displayName": "Scopes", + "description": "Scopes. e.g: value1 value2", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [], + "readOnly": true + } + ] + } + ] + }, + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "PRIMARY", + "associateLocalUser": true + } + }, + "templateId": "google-idp" + }, + "type": "SOCIAL", + "templateId": "google-idp" +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/standard-based-oidc-identity-provider.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/standard-based-oidc-identity-provider.json new file mode 100644 index 000000000..43c6bd7f7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/standard-based-oidc-identity-provider.json @@ -0,0 +1,149 @@ +{ + "description": "Authenticate users with Enterprise OIDC connections.", + "id": "enterprise-oidc-idp", + "idp": { + "certificate": { + "jwksUri": "", + "certificates": [ + "" + ] + }, + "claims": { + "provisioningClaims": [], + "roleClaim": { + "uri": "" + }, + "userIdClaim": { + "uri": "" + } + }, + "description": "Configure a new enterprise identity provider with OpenID Connect", + "federatedAuthenticators": { + "authenticators": [ + { + "isEnabled": true, + "authenticatorId": "T3BlbklEQ29ubmVjdEF1dGhlbnRpY2F0b3I", + "properties": [ + { + "key": "ClientId", + "displayName": "Client Id", + "description": "The client identifier value of the identity provider.", + "type": "STRING", + "displayOrder": 1, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "ClientSecret", + "displayName": "Client Secret", + "description": "The client secret value of the identity provider.", + "type": "STRING", + "displayOrder": 2, + "regex": ".*", + "isMandatory": true, + "isConfidential": true, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "OAuth2AuthzEPUrl", + "displayName": "Authorization Endpoint URL", + "description": "The standard authorization endpoint URL obtained from the identity provider.", + "type": "STRING", + "displayOrder": 3, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "OAuth2TokenEPUrl", + "displayName": "Token Endpoint URL", + "description": "The standard token endpoint URL obtained from the identity provider.", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": true, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "OIDCLogoutEPUrl", + "displayName": "Logout URL", + "description": "The URL of the identity provider to which Asgardeo will send session invalidation requests.", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [] + }, + { + "key": "callbackUrl", + "displayName": "Callback Url", + "description": "The WSO2 Identity Server URL to which the user needs to be redirected after completing the authentication at the identity provider. The identity provider needs to send the authorization code to this URL upon successful authentication.", + "type": "STRING", + "displayOrder": 5, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [], + "readOnly": true + }, + { + "key": "Scopes", + "displayName": "Scopes", + "description": "Scopes. e.g: value1 value2", + "type": "STRING", + "displayOrder": 4, + "regex": ".*", + "isMandatory": false, + "isConfidential": false, + "options": [], + "defaultValue": "", + "subProperties": [], + "readOnly": false + } + ] + } + ], + "defaultAuthenticatorId": "T3BlbklEQ29ubmVjdEF1dGhlbnRpY2F0b3I" + }, + "homeRealmIdentifier": "", + "isFederationHub": false, + "isPrimary": false, + "name": "Enterprise Authentication Provider", + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "PRIMARY", + "associateLocalUser": true + } + }, + "roles": { + "mappings": [], + "outboundProvisioningRoles": [] + }, + "templateId": "enterprise-oidc-idp" + }, + "image": "enterprise", + "name": "OpenID Connect", + "services": [], + "disabled": false, + "templateId": "enterprise-oidc-idp", + "type": "ENTERPRISE" +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/standard-based-saml-identity-provider.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/standard-based-saml-identity-provider.json new file mode 100644 index 000000000..6f75581eb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/data/templates/standard-based-saml-identity-provider.json @@ -0,0 +1,154 @@ +{ + "description": "Configure a new enterprise identity provider with SAML 2.0", + "id": "enterprise-saml-idp", + "idp": { + "image": "", + "isPrimary": false, + "roles": { + "mappings": [], + "outboundProvisioningRoles": [] + }, + "certificate": { + "certificates": [ + "" + ] + }, + "claims": { + "userIdClaim": { + "uri": "" + }, + "provisioningClaims": [], + "roleClaim": { + "uri": "" + } + }, + "name": "SAML 2.0 Authentication Provider", + "description": "Authenticate users with Enterprise SAML connections.", + "federatedAuthenticators": { + "defaultAuthenticatorId": "U0FNTFNTT0F1dGhlbnRpY2F0b3I", + "authenticators": [ + { + "isEnabled": true, + "authenticatorId": "U0FNTFNTT0F1dGhlbnRpY2F0b3I", + "properties": [ + { + "regex": ".*", + "isConfidential": false, + "displayName": "HTTP Binding", + "defaultValue": "redirect", + "displayOrder": 32, + "options": [ + "redirect", + "post", + "as_request" + ], + "description": "Choose the HTTP Binding or decide from incoming request", + "subProperties": [], + "type": "STRING", + "key": "RequestMethod", + "isMandatory": false + }, + { + "regex": ".*", + "isConfidential": false, + "displayName": "SSO URL", + "defaultValue": "", + "displayOrder": 6, + "options": [], + "description": "Enter identity provider's SAML2 Web SSO URL value", + "subProperties": [], + "type": "STRING", + "key": "SSOUrl", + "isMandatory": true + }, + { + "regex": ".*", + "isConfidential": false, + "displayName": "Identity Provider Entity ID", + "defaultValue": "", + "displayOrder": 5, + "options": [], + "description": "Enter identity provider's entity identifier value. This should be a valid URI/URL.", + "subProperties": [], + "type": "STRING", + "key": "IdPEntityId", + "isMandatory": true + }, + { + "regex": ".*", + "isConfidential": false, + "displayName": "Service Provider Entity ID", + "defaultValue": "", + "displayOrder": 1, + "options": [], + "description": "Enter the service provider's entity identifier value", + "subProperties": [], + "type": "STRING", + "key": "SPEntityId", + "isMandatory": true + }, + { + "regex": ".*", + "isConfidential": false, + "displayName": "SAML Metadata File", + "defaultValue": "", + "displayOrder": 4, + "options": [], + "description": "Base-64 encoded metadata file content for SAML configuration", + "subProperties": [], + "type": "STRING", + "key": "meta_data_saml", + "isMandatory": false + }, + { + "regex": ".*", + "isConfidential": false, + "displayName": "NameID format", + "defaultValue": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "displayOrder": 2, + "options": [], + "description": "NameID format to be used in the SAML request", + "subProperties": [], + "type": "STRING", + "key": "NameIDType", + "isMandatory": true + }, + { + "regex": ".*", + "isConfidential": false, + "displayName": "Select Mode", + "defaultValue": "Manual Configuration", + "displayOrder": 3, + "options": [ + "Manual Configuration", + "Metadata File Configuration" + ], + "description": "Select the input method for SAML configuration", + "subProperties": [], + "type": "STRING", + "key": "selectMode", + "isMandatory": false + } + ] + } + ] + }, + "homeRealmIdentifier": "", + "isFederationHub": false, + "templateId": "enterprise-saml-idp", + "provisioning": { + "jit": { + "isEnabled": true, + "scheme": "PROVISION_SILENTLY", + "userstore": "PRIMARY", + "associateLocalUser": true + } + } + }, + "image": "enterprise", + "name": "SAML 2.0", + "services": [], + "disabled": false, + "templateId": "enterprise-saml-idp", + "type": "ENTERPRISE" +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProvider.ts new file mode 100644 index 000000000..28c6558aa --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProvider.ts @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ControllerCallReturn, ControllerDecodeReturn } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import IdentityProviderFederatedAuthenticator from "./identityProviderFederatedAuthenticator"; + +interface FederatedAuthenticatorForIdentityProvider { + defaultAuthenticatorId : string, + authenticators: IdentityProviderFederatedAuthenticator + [key: string]: unknown, +} + +export interface IdentityProvider extends ControllerCallReturn, ControllerDecodeReturn { + id: string, + name: string, + image : string, + description : string, + federatedAuthenticators?: FederatedAuthenticatorForIdentityProvider, + templateId: string, + groups?: IdpGroup[], + [key: string]: unknown, +} + +export interface IdentityProviderGroupMappings extends ControllerCallReturn, ControllerDecodeReturn { + userIdClaim: { + uri: string + }, + roleClaim: { + uri: string + }, + provisioningClaims: string[], + mappings: ClaimMapping[] +} + +export interface IdpGroup extends ControllerCallReturn, ControllerDecodeReturn { + id: string, + name: string +} + +interface ClaimMapping { + idpClaim: string, + localClaim: { + id?: string, + uri: string, + displayName?: string + } +} + +export interface LocalClaim extends ControllerCallReturn, ControllerDecodeReturn { + [key: string]: unknown +} + +export default IdentityProvider; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderConfigureType.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderConfigureType.ts new file mode 100644 index 000000000..271abb561 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderConfigureType.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export enum IdentityProviderConfigureType { + MANUAL = "manual", + AUTO = "auto" +} + +export default IdentityProviderConfigureType; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderDiscoveryUrl.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderDiscoveryUrl.ts new file mode 100644 index 000000000..1d91a59ed --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderDiscoveryUrl.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ControllerCallReturn, ControllerDecodeReturn } from + "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export interface IdentityProviderDiscoveryUrl extends ControllerCallReturn, ControllerDecodeReturn { + authorization_endpoint: string, + token_endpoint: string, + end_session_endpoint: string, + jwks_uri: string +} + +export default IdentityProviderDiscoveryUrl; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderFederatedAuthenticator.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderFederatedAuthenticator.ts new file mode 100644 index 000000000..12e61ec23 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderFederatedAuthenticator.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallReturn, ControllerDecodeReturn } from + "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export interface IdentityProviderFederatedAuthenticatorProperty { + key: string, + value: string +} + +export interface IdentityProviderFederatedAuthenticator extends ControllerCallReturn, ControllerDecodeReturn { + authenticatorId?: string, + tags?: string[], + properties: IdentityProviderFederatedAuthenticatorProperty[], + [key: string]: unknown +} + +export default IdentityProviderFederatedAuthenticator; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderList.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderList.ts new file mode 100644 index 000000000..8fbb4e496 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderList.ts @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { ControllerCallReturn } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import IdentityProvider from "./identityProvider"; + +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface IdentityProviderList extends ControllerCallReturn { + count: number + identityProviders: IdentityProvider[] + totalResults: number, + [key: string]: unknown +} + +export default IdentityProviderList; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderTemplate.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderTemplate.ts new file mode 100644 index 000000000..ab9e27897 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderTemplate.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import IdentityProviderTemplateModel from "./identityProviderTemplateModel"; + +export interface IdentityProviderTemplate { + id?: string, + idp?: IdentityProviderTemplateModel, + templateId?: string, + name: string, + description? : string, + [key: string] : unknown +} + +export default IdentityProviderTemplate; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderTemplateModel.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderTemplateModel.ts new file mode 100644 index 000000000..ab23c5ccb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderTemplateModel.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallParam } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export interface IdentityProviderTemplateModelAuthenticatorProperty { + key?: string, + value?: string, + displayName?: string, + readOnly?: boolean, + description?: string, + [key: string]: unknown +} + +interface IdentityProviderTemplateModelAuthenticator { + authenticatorId: string, + isEnabled: boolean, + properties: IdentityProviderTemplateModelAuthenticatorProperty[], + [key: string]: unknown +} + +interface IdentityProviderTemplateModelFederatedAuthenticator { + authenticators: IdentityProviderTemplateModelAuthenticator[], + defaultAuthenticatorId: string, + [key: string]: unknown +} + +interface IdentityProviderTemplateModelCertificate { + jwksUri?: string, + certificates?: string[] +} + +export interface IdentityProviderTemplateModel extends ControllerCallParam { + name: string, + image?: string, + alias?: string, + certificate?: IdentityProviderTemplateModelCertificate, + federatedAuthenticators?: IdentityProviderTemplateModelFederatedAuthenticator, + [key: string]: unknown + +} + +export default IdentityProviderTemplateModel; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderUtils.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderUtils.ts new file mode 100644 index 000000000..b0f14f15b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/identityProvider/identityProviderUtils.ts @@ -0,0 +1,259 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getBaseUrl, getOrgUrl } + from "@pet-management-webapp/shared/util/util-application-config-util"; +import { EMPTY_STRING, OIDC_IDP, SAML_IDP } from "@pet-management-webapp/shared/util/util-common"; +import IdentityProviderDiscoveryUrl from "./identityProviderDiscoveryUrl"; +import IdentityProviderTemplateModel from "./identityProviderTemplateModel"; +import enterpriseImage from "../../../../../ui/ui-assets/src/lib/images/enterprise.svg"; + +/** + * @param templateId - template id of the identity provider + + * @returns - local image for the relevant identity provider + */ +export function getImageForTheIdentityProvider(templateId: string): string { + if (templateId === OIDC_IDP || templateId === SAML_IDP) { + return enterpriseImage; + } + + return EMPTY_STRING; +} + +/** + * + * @returns callBackUrl of the idp + */ +export function getCallbackUrl(orgId: string): string { + return `${getOrgUrl(orgId)}/commonauth`; +} + +/** + * + * @returns callBackUrl of the idp + */ +export function getIdPCallbackUrl(orgId: string): string { + return `${getBaseUrl(orgId)}/${orgId}/commonauth`; +} + +/** + * + * @param model - template of the idp as a JSON + * @param templateId - identity provider template id + * @param formValues - values get from the form inputs + * @param orgId - organization id + * + * @returns - idp readay to sent to the IS + */ +export function setIdpTemplate(model: IdentityProviderTemplateModel, templateId: string, + formValues: Record, orgId: string, + identityProviderDiscoveryUrl?: IdentityProviderDiscoveryUrl): IdentityProviderTemplateModel { + + const name: string = formValues["application_name"].toString(); + + model.name = name; + + switch (templateId) { + case OIDC_IDP: { + const clientId: string = formValues["client_id"].toString(); + const clientSecret: string = formValues["client_secret"].toString(); + + model = enterpriseOIDCIdpTemplate(model, clientId, clientSecret, formValues, orgId, + identityProviderDiscoveryUrl); + + break; + } + + case SAML_IDP: + model = enterpriseSAMLIdpTemplate(model, formValues); + + break; + default: + break; + } + + model.federatedAuthenticators.authenticators[0].isEnabled = true; + + return model; + +} + +/** + * + * @param model - template of the idp as a JSON + * @param clientId - client id text entered by the user for the identity provider + * @param clientSecret - client secret text entered by the user for the identity provider + * @param formValues - values get from the form inputs + * @param orgId - organization id + * + * @returns create enterprise IDP template + */ +function enterpriseOIDCIdpTemplate(model: IdentityProviderTemplateModel, clientId: string, clientSecret: string, + formValues: Record, orgId: string, identityProviderDiscoveryUrl?: IdentityProviderDiscoveryUrl) + : IdentityProviderTemplateModel { + + let authorizationEndpointUrl: string; + let tokenEndpointUrl: string; + let logoutUrl: string; + let jwksUri: string; + + if (identityProviderDiscoveryUrl) { + authorizationEndpointUrl = identityProviderDiscoveryUrl.authorization_endpoint; + tokenEndpointUrl = identityProviderDiscoveryUrl.token_endpoint; + logoutUrl = identityProviderDiscoveryUrl.end_session_endpoint; + jwksUri = identityProviderDiscoveryUrl.jwks_uri; + } else { + authorizationEndpointUrl = formValues["authorization_endpoint"].toString(); + tokenEndpointUrl = formValues["token_endpoint"].toString(); + + if (formValues["end_session_endpoint"]) { + logoutUrl = formValues["end_session_endpoint"].toString(); + } + + if (formValues["jwks_uri"]) { + jwksUri = formValues["jwks_uri"].toString(); + } + } + + model.image = "https://localhost:9443/console/libs/themes/default/assets/images/" + + "identity-providers/enterprise-idp-illustration.svg"; + + model.federatedAuthenticators.authenticators[0].properties = [ + { + "key": "ClientId", + "value": clientId + }, + { + "key": "ClientSecret", + "value": clientSecret + }, + { + "key": "OAuth2AuthzEPUrl", + "value": authorizationEndpointUrl + }, + { + "key": "OAuth2TokenEPUrl", + "value": tokenEndpointUrl + }, + { + "key": "OIDCLogoutEPUrl", + "value": logoutUrl + }, + { + "key": "callbackUrl", + "value": getIdPCallbackUrl(orgId) + }, + { + "key": "Scopes", + "value": "email openid profile groups" + } + ]; + + model.certificate.jwksUri = jwksUri; + + return model; +} + +function enterpriseSAMLIdpTemplate( + model: IdentityProviderTemplateModel, + formValues: Record +): IdentityProviderTemplateModel { + + // errors = fieldValidate("entity_id", values.entity_id, errors); + // errors = fieldValidate("meta_data_saml", values.meta_data_saml, errors); + // errors = fieldValidate("sso_url", values.authorization_endpoint, errors); + // errors = fieldValidate("entity_id", values.token_endpoint, errors); + + model.image = "https://localhost:9443/console/libs/themes/default/assets/images/" + + "identity-providers/enterprise-idp-illustration.svg"; + + if (formValues["meta_data_saml"]) { + model.federatedAuthenticators.authenticators[0].properties = [ + { + "key": "SPEntityId", + "value": formValues["sp_entity_id"] + }, + { + "key": "meta_data_saml", + "value": formValues["meta_data_saml"] + }, + { + "key": "SelectMode", + "value": "Metadata File Configuration" + }, + { + "key": "IsUserIdInClaims", + "value": "false" + }, + { + "key": "IsSLORequestAccepted", + "value": "false" + } + ]; + } + + if (formValues["sso_url"]) { + model.federatedAuthenticators.authenticators[0].properties = [ + { + "key": "IdPEntityId", + "value": formValues["idp_entity_id"] + }, + { + "key": "NameIDType", + "value": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" + }, + { + "key": "RequestMethod", + "value": "post" + }, + { + "key": "SPEntityId", + "value": formValues["sp_entity_id"] + }, + { + "key": "SSOUrl", + "value": formValues["sso_url"] + }, + { + "key": "SelectMode", + "value": "Manual Configuration" + }, + { + "key": "IsUserIdInClaims", + "value": "false" + }, + { + "key": "IsSLORequestAccepted", + "value": "false" + }, + { + "key": "SignatureAlgorithm", + "value": "RSA with SHA256" + }, + { + "key": "DigestAlgorithm", + "value": "SHA256" + } + ]; + } + + return model; +} + +export default { getCallbackUrl, getImageForTheIdentityProvider, setIdpTemplate }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/role.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/role.ts new file mode 100644 index 000000000..ffab5a0ed --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/role.ts @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallParam, ControllerCallReturn, ControllerDecodeReturn } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import RoleGroups from "./roleGroups"; +import RoleUsers from "./roleUsers"; + +interface Meta { + location: string, + resourceType?: string +} + +export interface Role extends ControllerCallParam, ControllerCallReturn, ControllerDecodeReturn + , Record { + displayName: string, + meta?: Meta, + schemas?: string[], + id?: string, + users?: RoleUsers[], + groups?: RoleGroups[], + permissions?: string[], + audience?: { + display: string, + type: string, + value: string + } +} + +export default Role; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleGroups.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleGroups.ts new file mode 100644 index 000000000..1d4ba6c3e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleGroups.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface RoleGroups { + $ref?: string, + value: string +} + +export default RoleGroups; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleList.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleList.ts new file mode 100644 index 000000000..d4a030dd8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleList.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallParam, ControllerCallReturn } from + "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import Role from "./role"; + +export interface RoleList extends ControllerCallParam, ControllerCallReturn + , Record { + Resources: Role[], + itemsPerPage: number, + totalResults: number +} + +export default RoleList; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleUsers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleUsers.ts new file mode 100644 index 000000000..e51dc30c8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/src/lib/role/roleUsers.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface RoleUsers { + $ref?: string, + value: string +} + +export default RoleUsers; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.json new file mode 100644 index 000000000..4b2c95b3e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": false, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-common-models-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/jest.config.ts new file mode 100644 index 000000000..41b14f525 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "business-admin-app-data-access-data-access-controller", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/business-admin-app/data-access/data-access-controller" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/index.ts new file mode 100644 index 000000000..dfe1175c1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/index.ts @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable max-len */ + +export * from "./lib/controller/user/controllerViewUser/controllerDecodeViewUsers"; +export * from "./lib/controller/user/controllerAddUser/controllerDecodeAddUser"; +export * from "./lib/controller/user/controllerEditUser/controllerDecodeEditUser"; +export * from "./lib/controller/application/controllerListAllApplications/controllerDecodeListAllApplications"; +export * from "./lib/controller/application/controllerListCurrentApplication/controllerDecodeListCurrentApplication"; +export * from "./lib/controller/application/controllerGetApplication/controllerDecodeGetApplication"; +export * from +"./lib/controller/application/controllerPatchApplicationAuthSteps/controllerDecodePatchApplicationAuthSteps"; +export * from "./lib/controller/role/controllerGetRole/controllerDecodeGetRole"; +export * from "./lib/controller/role/controllerListAllRoles/controllerDecodeListAllRoles"; +export * from "./lib/controller/role/controllerUserRole/controllerDecodeUserRole"; +export * from "./lib/controller/role/controllerCreateRole/controllerDecodeCreateRole"; +export * from "./lib/controller/role/controllerPatchRole/controllerDecodePatchRole"; +export * from "./lib/controller/role/controllerEditRolesToAddOrRemoveUser/controllerDecodeEditRolesToAddOrRemoveUser"; +export * from +"./lib/controller/identityProvider/controllerListAllIdentityProviders/controllerDecodeListAllIdentityProviders"; +export * from +"./lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetDetailedIdentityProvider"; +export * from +"./lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetLocalClaims"; +export * from +"./lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetIdentityProviderGroupMapping"; +export * from +"./lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpGroups"; +export * from +"./lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpClaims"; +export * from +"./lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerDecodeGetFederatedAuthenticators"; +export * from +"./lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerDecodePatchGeneralSettingsIdp"; +export * from +"./lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerDecodeDeleteIdentityProvider"; +export * from +"./lib/controller/identityProvider/controllerCreateIdentityProvider/controllerDecodeCreateIdentityProvider"; +export * from +"./lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerDecodeUpdateFederatedAuthenticators"; +export * from "./lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerDecodeGetDiscoveryUrl"; +export * from +"./lib/controller/controllerSwitchOrg/controllerDecodeSwitchOrg"; +export * from "./lib/controller/group/controllerViewGroup/controllerDecodeViewGroups"; +export * from "./lib/controller/group/controllerAddGroup/controllerCallDecodeAddGroup"; +export * from "./lib/controller/group/controllerViewUsersInGroup/controllerDecodeViewUsersInGroup"; +export * from "./lib/controller/group/controllerPatchGroupName/controllerDecodePatchGroupName"; +export * from "./lib/controller/group/controllerPatchGroupMembers/controllerDecodePatchGroupMembers"; +export * from "./lib/controller/group/controllerDeleteGroup/controllerDecodeDeleteGroup"; +export * from "./lib/controller/user/controllerDeleteUser/controllerDecodeDeleteUser"; +export * from "./lib/controller/branding/controllerDecodeGetBrandingPreference"; +export * from "./lib/controller/branding/controllerDecodeUpdateBrandingPreference"; +export * from "./lib/controller/branding/controllerDecodeRevertBrandingPreference"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerGetApplication/controllerCallGetApplication.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerGetApplication/controllerCallGetApplication.ts new file mode 100644 index 000000000..e4319744c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerGetApplication/controllerCallGetApplication.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Application } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/applications/` to get the applicaion details + * + * @param session - Session object + * @param id - application id + * + * @returns applicaiton details, if the call failed `null` + */ +export async function controllerCallGetApplication(session: Session, id: string) + : Promise { + + const data = ( + await commonControllerCall(`/api/settings/application/getApplication/${id}`, session, id) as + Application | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerGetApplication/controllerDecodeGetApplication.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerGetApplication/controllerDecodeGetApplication.ts new file mode 100644 index 000000000..65b01d895 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerGetApplication/controllerDecodeGetApplication.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Application } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetApplication } from "./controllerCallGetApplication"; + +/** + * + * @param session - session object + * @param id - application id + * + * @returns get application given the id. If failed `null` + */ +export async function controllerDecodeGetApplication(session: Session, id: string): Promise { + + const res = ( + await commonControllerDecode(() => controllerCallGetApplication(session, id), null) as Application | null); + + return res; + +} + +export default controllerDecodeGetApplication; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListAllApplications/controllerCallListAllApplications.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListAllApplications/controllerCallListAllApplications.ts new file mode 100644 index 000000000..cddd5f885 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListAllApplications/controllerCallListAllApplications.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ApplicationList } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/applications` to all the applicaions + * + * @param session - session object + * + * @returns all applicaitons, if the call failed `null` + */ +export async function controllerCallListAllApplications(session: Session): Promise { + + const data = (await commonControllerCall("/api/settings/application/listAllApplications", session) as + ApplicationList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListAllApplications/controllerDecodeListAllApplications.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListAllApplications/controllerDecodeListAllApplications.ts new file mode 100644 index 000000000..015588076 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListAllApplications/controllerDecodeListAllApplications.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ApplicationList } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallListAllApplications } from "./controllerCallListAllApplications"; + +/** + * + * @param session - session object + * + * @returns get all the applications + */ +export async function controllerDecodeListAllApplications(session: Session): Promise { + + const res = (await commonControllerDecode(() => controllerCallListAllApplications(session), null) as + ApplicationList | null); + + return res; + +} + +export default controllerDecodeListAllApplications; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListCurrentApplication/controllerCallListCurrentApplication.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListCurrentApplication/controllerCallListCurrentApplication.ts new file mode 100644 index 000000000..c3281318f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListCurrentApplication/controllerCallListCurrentApplication.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ApplicationList } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/applications?filter=name+eq+` + * to get the initial applicaion details + * + * @param session - Session object + * + * @returns application initial details, if call failed `null` + */ +export async function controllerCallListCurrentApplication(session: Session): Promise { + + const applicationName = getConfig().BusinessAdminAppConfig.ManagementAPIConfig.SharedApplicationName; + + const data = + (await commonControllerCall(`/api/settings/application/listCurrentApplication?appName=${applicationName}`, + session) as ApplicationList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListCurrentApplication/controllerDecodeListCurrentApplication.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListCurrentApplication/controllerDecodeListCurrentApplication.ts new file mode 100644 index 000000000..781041126 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerListCurrentApplication/controllerDecodeListCurrentApplication.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ApplicationList } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallListCurrentApplication } from "./controllerCallListCurrentApplication"; + +/** + * + * @param session - session object + * + * @returns get the deatils of the current logged in application of the business app, + * filtered using the `BusinessAppConfig.ManagementAPIConfig.SharedApplicationName` in the config.json + */ +export async function controllerDecodeListCurrentApplication(session: Session): Promise { + + const res = (await commonControllerDecode(() => controllerCallListCurrentApplication(session), null) as + ApplicationList | null); + + return res; + +} + +export default controllerDecodeListCurrentApplication; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerPatchApplicationAuthSteps/controllerCallPatchApplicationAuthSteps.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerPatchApplicationAuthSteps/controllerCallPatchApplicationAuthSteps.ts new file mode 100644 index 000000000..5b4944b48 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerPatchApplicationAuthSteps/controllerCallPatchApplicationAuthSteps.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AuthenticationSequenceModel } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call `getManagementAPIServerBaseUrl()/o//scim2/Users/` get the user details + * + * @param session - session object + * + * @returns all applications details, if not possible returns `null` + */ +export async function controllerCallPatchApplicationAuthSteps(session: Session, applicationId: string, + model: AuthenticationSequenceModel) { + + const data = await commonControllerCall(`/api/settings/application/patchApplicationAuthSteps/${applicationId}` + , session, model); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerPatchApplicationAuthSteps/controllerDecodePatchApplicationAuthSteps.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerPatchApplicationAuthSteps/controllerDecodePatchApplicationAuthSteps.ts new file mode 100644 index 000000000..e8232dd7e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/application/controllerPatchApplicationAuthSteps/controllerDecodePatchApplicationAuthSteps.ts @@ -0,0 +1,239 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Application, AuthenticationSequence, AuthenticationSequenceModel, AuthenticationSequenceStepOption, + IdentityProvider +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { + BASIC_ID, EMAIL_OTP_AUTHENTICATOR, + OIDC_AUTHENTICATOR_ID, OIDC_IDP, SAML_AUTHENTICATOR_ID, + SAML_IDP, SMS_OTP_AUTHENTICATOR, TOTP_OTP_AUTHENTICATOR +} from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { controllerCallPatchApplicationAuthSteps } from "./controllerCallPatchApplicationAuthSteps"; + +/** + * + * @param template - identity provider object template + * + * @returns get authentication sequence + */ +function getAuthenticationSequenceModel(template: Application): AuthenticationSequence { + const authenticationSequenceModel = template.authenticationSequence; + + delete authenticationSequenceModel.requestPathAuthenticators; + authenticationSequenceModel.type = "USER_DEFINED"; + + return authenticationSequenceModel; +} +/** + * + * @param templateId - OIDC_AUTHENTICATOR_ID, SAML_IDP + * + * @returns get authenticator id for the given template id + */ +function getAuthenticatorId(templateId: string): string | null { + switch (templateId) { + case OIDC_IDP: + return OIDC_AUTHENTICATOR_ID; + case SAML_IDP: + return SAML_AUTHENTICATOR_ID; + case EMAIL_OTP_AUTHENTICATOR: + return EMAIL_OTP_AUTHENTICATOR; + case SMS_OTP_AUTHENTICATOR: + return SMS_OTP_AUTHENTICATOR; + case TOTP_OTP_AUTHENTICATOR: + return TOTP_OTP_AUTHENTICATOR; + default: + return null; + } +} + +/** + * + * @param idpTempleteId - identity provider template id + * @param idpName - identity provider name + * + * @returns get authenticator body + */ +function getAuthenticatorBody(idpTempleteId: string, idpName: string): AuthenticationSequenceStepOption { + + return { + "authenticator": (getAuthenticatorId(idpTempleteId) as string), + "idp": idpName + }; +} + +/** + * + * @param template - identity provider object template + * @param idpTempleteId - identity provider template id + * @param idpName - identity provider name + * @param method - PatchApplicationAuthMethod + * + * @returns add or remove idp from the login sequence + */ +function addRemoveAuthSequence(template: Application, idpTempleteId: string, idpName: string, method: boolean) + : AuthenticationSequence { + + const authenticationSequenceModel = getAuthenticationSequenceModel(template); + + if (method) { + const options = authenticationSequenceModel.steps[0].options; + const idpOptions = getAuthenticatorBody(idpTempleteId, idpName); + + if (idpOptions) { + options.push(idpOptions); + } + + return authenticationSequenceModel; + } else { + + let basicCheck = false; + + for (let j = authenticationSequenceModel.steps.length - 1; j >= 0; j--) { + const step = authenticationSequenceModel.steps[j]; + + for (let i = 0; i < step.options.length; i++) { + if (step.options[i].idp === idpName) { + step.options.splice(i, 1); + i--; + if (step.options.length === 0) { + authenticationSequenceModel.steps.splice(j, 1); + } + + } else if (step.options[i].authenticator === "BasicAuthenticator") { + basicCheck = true; + } + } + } + + if (!basicCheck) { + try { + authenticationSequenceModel.steps[0].options.push(getAuthenticatorBody(BASIC_ID, "LOCAL")); + } catch (e) { + authenticationSequenceModel.steps.push({ + "id": 1, + "options": [ (getAuthenticatorBody(BASIC_ID, "LOCAL")) ] + }); + } + } + + return authenticationSequenceModel; + } +} + +function addRemoveAuthSequenceWithAuthenticator( + template: Application, + authenticator: string, + idpName: string, + method: boolean +) : AuthenticationSequence { + + const authenticationSequenceModel = getAuthenticationSequenceModel(template); + + if (method) { + if (authenticationSequenceModel.steps.length === 1) { + authenticationSequenceModel.steps.push({ + id: 2, + options: [] + }); + } + const options = authenticationSequenceModel.steps[1].options; + const idpOptions = getAuthenticatorBody(authenticator, idpName); + + if (idpOptions) { + options.push(idpOptions); + } + + return authenticationSequenceModel; + } else { + + for (let j = authenticationSequenceModel.steps.length - 1; j >= 0; j--) { + const step = authenticationSequenceModel.steps[j]; + + for (let i = 0; i < step.options.length; i++) { + if (step.options[i].authenticator === authenticator) { + step.options.splice(i, 1); + i--; + if (step.options.length === 0) { + authenticationSequenceModel.steps.splice(j, 1); + } + + } + } + } + + return authenticationSequenceModel; + } +} + +/** + * + * @param session - session object + * @param template - identity provider object template + * @param idpDetails - identity provider details + * @param method - PatchApplicationAuthMethod + * + * @returns decode patch applicaiton authentication steps API calls. + */ +export async function controllerDecodePatchApplicationAuthSteps( + session: Session, template: Application, idpDetails: IdentityProvider, method: boolean): Promise { + + const applicationId = template.id; + const idpName = idpDetails.name; + const idpTempleteId = idpDetails.templateId; + + const authenticationSequenceModel: AuthenticationSequenceModel = { + "authenticationSequence": addRemoveAuthSequence(template, idpTempleteId, idpName, method) + }; + + const res = await commonControllerDecode( + () => controllerCallPatchApplicationAuthSteps(session, applicationId, authenticationSequenceModel), null); + + if (res) { + return true; + } + + return null; +} + +export async function controllerDecodePatchApplicationAuthStepsWithAuthenticator( + session: Session, template: Application, authenticator: string, method: boolean): Promise { + + const applicationId = template.id; + const idpName = "LOCAL"; + const idpTempleteId = authenticator; + + const authenticationSequenceModel: AuthenticationSequenceModel = { + "authenticationSequence": addRemoveAuthSequenceWithAuthenticator(template, idpTempleteId, idpName, method) + }; + + const res = await commonControllerDecode( + () => controllerCallPatchApplicationAuthSteps(session, applicationId, authenticationSequenceModel), null); + + if (res) { + return true; + } + + return null; +} + +export default controllerDecodePatchApplicationAuthSteps; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallGetBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallGetBrandingPreference.ts new file mode 100644 index 000000000..089ea5a6e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallGetBrandingPreference.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + BrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + + +export async function controllerCallGetBrandingPreference(session: Session): Promise { + + const data = + (await commonControllerCall( + "/api/settings/branding/getBrandingPreference", + session + ) as BrandingPreference | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallRevertBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallRevertBrandingPreference.ts new file mode 100644 index 000000000..5c68df83f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallRevertBrandingPreference.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + + +export async function controllerCallRevertBrandingPreference( + session: Session +) { + const data = + (await commonControllerCall( + "/api/settings/branding/revertBrandingPreference", + session + )); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallUpdateBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallUpdateBrandingPreference.ts new file mode 100644 index 000000000..11653487b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerCallUpdateBrandingPreference.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + BrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + + +export async function controllerCallUpdateBrandingPreference( + session: Session, + brandingPreference: BrandingPreference +): Promise { + const data = + (await commonControllerCall( + "/api/settings/branding/updateBrandingPreference", + session, brandingPreference + ) as BrandingPreference | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeGetBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeGetBrandingPreference.ts new file mode 100644 index 000000000..43c8781a2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeGetBrandingPreference.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + BrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetBrandingPreference } from "./controllerCallGetBrandingPreference"; + +/** + * + * @param session - session object + * + * @returns get the deatils of the current logged in application of the business app, + * filtered using the `BusinessAppConfig.ManagementAPIConfig.SharedApplicationName` in the config.json + */ +export async function controllerDecodeGetBrandingPrefrence(session: Session): Promise { + + const res = (await commonControllerDecode(() => controllerCallGetBrandingPreference(session), null) as + BrandingPreference | null); + + return res; + +} + +export default controllerDecodeGetBrandingPrefrence; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeRevertBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeRevertBrandingPreference.ts new file mode 100644 index 000000000..8016ff5eb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeRevertBrandingPreference.ts @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallRevertBrandingPreference } from "./controllerCallRevertBrandingPreference"; + +/** + * + * @param session - session object + * + * @returns get the deatils of the current logged in application of the business app, + * filtered using the `BusinessAppConfig.ManagementAPIConfig.SharedApplicationName` in the config.json + */ +export async function controllerDecodeRevertBrandingPreference( + session: Session +): Promise { + + const res = (await commonControllerDecode(() => controllerCallRevertBrandingPreference( + session), null)); + + if(res){ + return true; + } + + return null; + +} + +export default controllerDecodeRevertBrandingPreference; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeUpdateBrandingPreference.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeUpdateBrandingPreference.ts new file mode 100644 index 000000000..6bb39647b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/branding/controllerDecodeUpdateBrandingPreference.ts @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + BrandingPreference +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallUpdateBrandingPreference } from "./controllerCallUpdateBrandingPreference"; + +/** + * + * @param session - session object + * + * @returns get the deatils of the current logged in application of the business app, + * filtered using the `BusinessAppConfig.ManagementAPIConfig.SharedApplicationName` in the config.json + */ +export async function controllerDecodeUpdateBrandingPrefrence( + session: Session, + brandingPreference: BrandingPreference +): Promise { + + const res = (await commonControllerDecode(() => controllerCallUpdateBrandingPreference( + session, brandingPreference), null) as BrandingPreference | null); + + return res; + +} + +export default controllerDecodeUpdateBrandingPrefrence; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/controllerSwitchOrg/controllerCallSwitchOrg.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/controllerSwitchOrg/controllerCallSwitchOrg.ts new file mode 100644 index 000000000..037e3c772 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/controllerSwitchOrg/controllerCallSwitchOrg.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +import { getHostedUrl } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { OrgSession } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +/** + * call the switch organization API endpoint + * + * @param subOrgId - sub organization id + * @param accessToken - access token + */ +export async function controllerCallSwitchOrg(subOrgId: string, accessToken: string): Promise { + const data = (await commonControllerCall(`${getHostedUrl()}/api/settings/switchOrg`, + null, + { + accessToken: accessToken, + subOrgId: subOrgId + }, + true + ) as OrgSession | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/controllerSwitchOrg/controllerDecodeSwitchOrg.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/controllerSwitchOrg/controllerDecodeSwitchOrg.ts new file mode 100644 index 000000000..23b67343a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/controllerSwitchOrg/controllerDecodeSwitchOrg.ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { OrgSession } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { JWT } from "next-auth/jwt"; +import { controllerCallSwitchOrg } from "./controllerCallSwitchOrg"; + +function getOrgId(token: JWT): string { + + if(token.user) { + if (token.user.user_organization) { + + return token.user.user_organization; + } else { + + return token.user.org_id; + } + } else { + + return ""; + } + +} + +/** + * + * @param token - token object get from the inital login call + * + * @returns - organization id of the logged in organization + */ +export async function controllerDecodeSwitchOrg(token: JWT): Promise { + + const subOrgId: string = getOrgId(token); + const accessToken: string = (token.accessToken as string); + + const res = + (await commonControllerDecode(() => controllerCallSwitchOrg(subOrgId, accessToken), null) as OrgSession | null); + + return res; + +} + +export default controllerDecodeSwitchOrg; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerAddGroup/controllerCallAddGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerAddGroup/controllerCallAddGroup.ts new file mode 100644 index 000000000..59a1850b2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerAddGroup/controllerCallAddGroup.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { AddedGroup, SendGroup } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call POST `getManagementAPIServerBaseUrl()/o//scim2/Users` create the user + * + * @param session - session object + * @param group - `SendGroup` + * + * @returns created group details, if not created returns `null` + */ +export async function controllerCallAddGroup(session: Session, group: SendGroup): Promise { + + const data = (await commonControllerCall("/api/settings/group/addGroup", session, group) as AddedGroup | null); + + return data; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerAddGroup/controllerCallDecodeAddGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerAddGroup/controllerCallDecodeAddGroup.ts new file mode 100644 index 000000000..9941b57cd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerAddGroup/controllerCallDecodeAddGroup.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { AddedGroup, SendGroup } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallAddGroup } from "./controllerCallAddGroup"; + +/** + * + * @param session - session object + * @param group - group details to be sent + * + * @returns - details of the created group + */ +export async function controllerDecodeAddGroup( + session: Session, + group: SendGroup +): Promise { + + const res = ( + await commonControllerDecode(() => controllerCallAddGroup(session, group), false) as AddedGroup | boolean); + + return res; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerDeleteGroup/controllerCallDeleteGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerDeleteGroup/controllerCallDeleteGroup.ts new file mode 100644 index 000000000..972ad6133 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerDeleteGroup/controllerCallDeleteGroup.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * + * @param session - session object + * @param groupId - group id + * + * @returns delete success, if the call failed `null` + */ +export async function controllerCallDeleteGroup(session: Session, groupId: string) { + + const data = await commonControllerCall(`/api/settings/group/deleteGroup?groupId=${groupId}`, session); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerDeleteGroup/controllerDecodeDeleteGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerDeleteGroup/controllerDecodeDeleteGroup.ts new file mode 100644 index 000000000..1a8899589 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerDeleteGroup/controllerDecodeDeleteGroup.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallDeleteGroup } from "./controllerCallDeleteGroup"; + +/** + * + * @param session - session object + * @param id - group id + * + * @returns - whether the group is deleted or not + */ +export async function controllerDecodeDeleteGroup(session: Session, id: string): Promise { + + const res = await commonControllerDecode(() => controllerCallDeleteGroup(session, id), null); + + if(res){ + return true; + } + + return null; + +} + +export default controllerDecodeDeleteGroup; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupMembers/controllerCallPatchGroupMembers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupMembers/controllerCallPatchGroupMembers.ts new file mode 100644 index 000000000..ba8dd54dc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupMembers/controllerCallPatchGroupMembers.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { SendEditGroupMembers, UpdatedGroup } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call PATCH `roleUri` + * + * @param session - Session object + * @param groupId - id of the group + * @param patchBody - body of the role that need to be patched + * + * @returns patched role, if the call failed `null` + */ +export async function +controllerCallPatchGroupMembers(session: Session, groupId: string, patchBody: SendEditGroupMembers) + : Promise { + + const data = + (await commonControllerCall(`/api/settings/group/patchGroupMembers?groupId=${groupId}`, session, patchBody) as + UpdatedGroup | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupMembers/controllerDecodePatchGroupMembers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupMembers/controllerDecodePatchGroupMembers.ts new file mode 100644 index 000000000..057058a2f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupMembers/controllerDecodePatchGroupMembers.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Group, SendEditGroupMembers, sendMemberList } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { PatchMethod } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { controllerCallPatchGroupMembers } from "./controllerCallPatchGroupMembers"; + +export async function controllerDecodePatchGroupMembers( + session: Session, groupId: string, patchMethod: PatchMethod, value: sendMemberList) + : Promise { + + const editGroupMembers: SendEditGroupMembers = { + "Operations": [ + { + "op": "replace", + "value": value + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ] + }; + + const res = ( + await commonControllerDecode(() => + controllerCallPatchGroupMembers(session, groupId, editGroupMembers), null) as Group | null); + + return res; +} + +export default controllerDecodePatchGroupMembers; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupName/controllerCallPatchGroupName.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupName/controllerCallPatchGroupName.ts new file mode 100644 index 000000000..8132ead04 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupName/controllerCallPatchGroupName.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Group, SendEditGroupName } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call PATCH `roleUri` + * + * @param session - Session object + * @param roleUri - uri of the role + * @param patchBody - body of the role that need to be patched + * + * @returns patched role, if the call failed `null` + */ +export async function controllerCallPatchGroupName(session: Session, groupId: string, patchBody: SendEditGroupName) + : Promise { + + const data = + (await commonControllerCall(`/api/settings/group/patchGroupName?groupId=${groupId}`, session, patchBody) as + Group | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupName/controllerDecodePatchGroupName.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupName/controllerDecodePatchGroupName.ts new file mode 100644 index 000000000..8e23a1c4b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerPatchGroupName/controllerDecodePatchGroupName.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Group, SendEditGroupName } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { PatchMethod } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { controllerCallPatchGroupName } from "./controllerCallPatchGroupName"; + +export async function controllerDecodePatchGroupName( + session: Session, groupId: string, patchMethod: PatchMethod, path: string, value: string) + : Promise { + + const editGroupName: SendEditGroupName = { + "Operations": [ + { + "op": "replace", + "path": path, + "value": value + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ] + }; + + const res = ( + await commonControllerDecode(() => + controllerCallPatchGroupName(session, groupId, editGroupName), null) as Group | null); + + return res; +} + +export default controllerDecodePatchGroupName; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewGroup/controllerCallViewGroups.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewGroup/controllerCallViewGroups.ts new file mode 100644 index 000000000..33760b43f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewGroup/controllerCallViewGroups.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { GroupList } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//scim2/Groups` to view all the groups + * + * @param session - session object + * + * @returns - list all groups + */ +export async function controllerCallViewGroups(session: Session): Promise { + + const data = (await commonControllerCall("/api/settings/group/viewGroups", session) as GroupList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewGroup/controllerDecodeViewGroups.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewGroup/controllerDecodeViewGroups.ts new file mode 100644 index 000000000..51a17cf8a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewGroup/controllerDecodeViewGroups.ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Group, GroupList, InternalGroup, decodeGroup } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallViewGroups } from "./controllerCallViewGroups"; + +/** + * + * @param session - session object + + * @returns details of all groups + */ +export async function controllerDecodeViewGroups(session: Session): Promise { + + const groupsData = ( + await commonControllerDecode(() => controllerCallViewGroups(session), null) as GroupList | null); + + if (groupsData) { + const groupsReturn: InternalGroup[] = []; + + if(groupsData.Resources){ + groupsData.Resources.map((group: Group) => { + const groupDetails = decodeGroup(group); + + if (groupDetails) { + groupsReturn.push(groupDetails); + } + + return null; + }); + } + + return groupsReturn; + + } + + return null; + +} + +export default controllerDecodeViewGroups; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewUsersInGroup/controllerCallViewUsersInGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewUsersInGroup/controllerCallViewUsersInGroup.ts new file mode 100644 index 000000000..bafcb4283 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewUsersInGroup/controllerCallViewUsersInGroup.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { UserList } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//scim2/Groups` to view all the groups + * + * @param session - session object + * + * @returns - list all groups + */ +export async function controllerCallViewUsersInGroup(session: Session, group: string): Promise { + + const data = (await commonControllerCall(`/api/settings/group/viewUsersInGroup?group=${group}`, + session ) as UserList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewUsersInGroup/controllerDecodeViewUsersInGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewUsersInGroup/controllerDecodeViewUsersInGroup.ts new file mode 100644 index 000000000..2b4dfe8fa --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/group/controllerViewUsersInGroup/controllerDecodeViewUsersInGroup.ts @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { InternalUser, User, UserList, decodeUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallViewUsersInGroup } from "./controllerCallViewUsersInGroup"; + +/** + * + * @param session - session object + + * @returns details of all users + */ +export async function controllerDecodeViewUsersInGroup +(session: Session, group: string): Promise { + + const usersData = ( + await commonControllerDecode(() => controllerCallViewUsersInGroup(session, group), null) as UserList | null); + + if (usersData) { + const usersReturn: InternalUser[] = []; + + if(usersData.Resources){ + usersData.Resources.map((user: User) => { + const userDetails = decodeUser(user); + + if (userDetails) { + usersReturn.push(userDetails); + } + + return null; + }); + } + + return usersReturn; + + } + + return null; + +} + +export default controllerDecodeViewUsersInGroup; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerCreateIdentityProvider/controllerCallCreateIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerCreateIdentityProvider/controllerCallCreateIdentityProvider.ts new file mode 100644 index 000000000..0e5395b35 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerCreateIdentityProvider/controllerCallCreateIdentityProvider.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider, IdentityProviderTemplateModel } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call POST `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers` + * to create an identity provider + * + * @param session - Session object + * @param model - body of the identity provider that will be created + * + * @returns created identity provider, if the call failed `null` + */ +export async function controllerCallCreateIdentityProvider(session: Session, + model: IdentityProviderTemplateModel): Promise { + + const data = (await commonControllerCall("/api/settings/identityProvider/createIdentityProvider", session, + model) as IdentityProvider | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerCreateIdentityProvider/controllerDecodeCreateIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerCreateIdentityProvider/controllerDecodeCreateIdentityProvider.ts new file mode 100644 index 000000000..f156a1c74 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerCreateIdentityProvider/controllerDecodeCreateIdentityProvider.ts @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProvider, IdentityProviderConfigureType, IdentityProviderDiscoveryUrl, IdentityProviderTemplate, + IdentityProviderTemplateModel, setIdpTemplate +} from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { OIDC_IDP, SAML_IDP } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { controllerCallCreateIdentityProvider } from "./controllerCallCreateIdentityProvider"; +import controllerDecodeGetDiscoveryUrl from "../controllerGetDiscoveryUrl/controllerDecodeGetDiscoveryUrl"; + +/** + * get the identity provider details from the discovery url + * + * @param discoveryUrl - discovery url + */ +async function getIdentityProviderFromDiscoveryUrl(session: Session, discoveryUrl: string) + : Promise { + const identityProviderDiscoveryUrl = await controllerDecodeGetDiscoveryUrl(session, discoveryUrl); + + return identityProviderDiscoveryUrl; +} + +/** + * + * @param session - session object + * @param template - template + * @param formValues - values of the form that user filled + * + * @returns - whether the identity provider is created or not + */ +export async function controllerDecodeCreateIdentityProvider(session: Session, template: IdentityProviderTemplate, + formValues: Record, configureType?: IdentityProviderConfigureType) + : Promise { + + let model: IdentityProviderTemplateModel = JSON.parse(JSON.stringify(template.idp)); + + if (template.id === SAML_IDP) { + model = setIdpTemplate(model, (template.templateId as string), formValues, (session.orgId as string)); + } + + if (template.id === OIDC_IDP && configureType) { + switch (configureType) { + case IdentityProviderConfigureType.AUTO: { + const identityProviderDiscoveryUrl: IdentityProviderDiscoveryUrl | null + = await getIdentityProviderFromDiscoveryUrl(session, formValues["discovery_url"].toString()); + + if (identityProviderDiscoveryUrl) { + model = setIdpTemplate(model, (template.templateId as string), formValues, (session.orgId as string) + , identityProviderDiscoveryUrl); + } + + break; + } + + case IdentityProviderConfigureType.MANUAL: { + + model = setIdpTemplate(model, (template.templateId as string), formValues, (session.orgId as string)); + + break; + } + } + } + + console.log("model", model); + + const res = (await commonControllerDecode(() => controllerCallCreateIdentityProvider(session, model), + null) as IdentityProvider | null); + + return res; + +} + +export default controllerDecodeCreateIdentityProvider; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerCallDeleteIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerCallDeleteIdentityProvider.ts new file mode 100644 index 000000000..a0f4d4b55 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerCallDeleteIdentityProvider.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call DELETE `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers/` + * to delete an identity provider + * + * @param session - session object + * @param idpId - identity provider id + * + * @returns delete success, if the call failed `null` + */ +export async function controllerCallDeleteIdentityProvider(session: Session, id: string) { + + const data = await commonControllerCall(`/api/settings/identityProvider/deleteIdentityProvider/${id}`, session); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerDecodeDeleteIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerDecodeDeleteIdentityProvider.ts new file mode 100644 index 000000000..f1515285f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerDeleteIdentityProvider/controllerDecodeDeleteIdentityProvider.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallDeleteIdentityProvider } from "./controllerCallDeleteIdentityProvider"; + +/** + * + * @param session - session object + * @param id - identity provider id + * + * @returns - whether the identity provider is deleted or not + */ +export async function controllerDecodeDeleteIdentityProvider(session: Session, id: string): Promise { + + const res = await commonControllerDecode(() => controllerCallDeleteIdentityProvider(session, id), null); + + if(res){ + return true; + } + + return null; + +} + +export default controllerDecodeDeleteIdentityProvider; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetDetailedIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetDetailedIdentityProvider.ts new file mode 100644 index 000000000..03667a396 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetDetailedIdentityProvider.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers/` + * to get detail of an identity provider + * + * @param session - session + * @param id - identity provider id + * + * @returns details of the identity provdider, if the call failed `null` + */ +export async function controllerCallGetDetailedIdentityProvider(session: Session, id: string) + : Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/getDetailedIdentityProvider/${id}` + , session) as IdentityProvider | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetIdentityProviderGroupMappings.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetIdentityProviderGroupMappings.ts new file mode 100644 index 000000000..0d18af3c5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetIdentityProviderGroupMappings.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProviderGroupMappings +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +export async function controllerCallGetIdentityProviderGroupMappings(session: Session, id: string) + : Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/getIdentityProviderGroupMappings/${id}` + , session) as IdentityProviderGroupMappings | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetLocalClaims.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetLocalClaims.ts new file mode 100644 index 000000000..c1ac86315 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerCallGetLocalClaims.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + LocalClaim +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +export async function controllerCallGetLocalClaims(session: Session) + : Promise { + + const data = (await commonControllerCall("/api/settings/identityProvider/getLocalClaims" + , session) as LocalClaim[] | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetDetailedIdentityProvider.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetDetailedIdentityProvider.ts new file mode 100644 index 000000000..73311bff3 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetDetailedIdentityProvider.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetDetailedIdentityProvider } from "./controllerCallGetDetailedIdentityProvider"; + +/** + * + * @param session - session object + * @param id - identity provider id + * + * @returns - details of the identity provider + */ +export async function controllerDecodeGetDetailedIdentityProvider(session: Session, id: string) + : Promise { + + const res = (await commonControllerDecode(() => controllerCallGetDetailedIdentityProvider(session, id), + null) as IdentityProvider | null); + + return res; + +} + +export default controllerDecodeGetDetailedIdentityProvider; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetIdentityProviderGroupMapping.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetIdentityProviderGroupMapping.ts new file mode 100644 index 000000000..385bb8de3 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetIdentityProviderGroupMapping.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProviderGroupMappings +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetIdentityProviderGroupMappings } from "./controllerCallGetIdentityProviderGroupMappings"; + +/** + * + * @param session - session object + * @param id - identity provider id + * + * @returns - details of the identity provider + */ +export async function controllerDecodeGetIdentityProviderGroupMappings(session: Session, id: string) + : Promise { + + const res = (await commonControllerDecode(() => controllerCallGetIdentityProviderGroupMappings(session, id), + null) as IdentityProviderGroupMappings | null); + + return res; + +} + +export default controllerDecodeGetIdentityProviderGroupMappings; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetLocalClaims.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetLocalClaims.ts new file mode 100644 index 000000000..0d1ba15fe --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDetailedIdentityProvider/controllerDecodeGetLocalClaims.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + LocalClaim +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetLocalClaims } from "./controllerCallGetLocalClaims"; + +export async function controllerDecodeGetLocalClaims(session: Session) + : Promise { + + const res = (await commonControllerDecode(() => controllerCallGetLocalClaims(session), + null) as LocalClaim[] | null); + + return res; + +} + +export default controllerDecodeGetLocalClaims; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerCallGetDiscoveryUrl.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerCallGetDiscoveryUrl.ts new file mode 100644 index 000000000..14a77464c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerCallGetDiscoveryUrl.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderDiscoveryUrl } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers/` + * to get detail of an identity provider + * + * @param session - session + * @param id - identity provider id + * + * @returns details of the identity provdider, if the call failed `null` + */ +export async function controllerCallGetDiscoveryUrl(session: Session, discoveryUrl: string) + : Promise { + + const data = (await commonControllerCall("/api/settings/identityProvider/getDiscoveryUrl", + session, discoveryUrl) as IdentityProviderDiscoveryUrl | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerDecodeGetDiscoveryUrl.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerDecodeGetDiscoveryUrl.ts new file mode 100644 index 000000000..2191ced8f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetDiscoveryUrl/controllerDecodeGetDiscoveryUrl.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderDiscoveryUrl } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetDiscoveryUrl } from "./controllerCallGetDiscoveryUrl"; + +/** + * + * @param session - session object + * @param id - identity provider id + * + * @returns - details of the identity provider + */ +export async function controllerDecodeGetDiscoveryUrl(session: Session, discoveryUrl: string) + : Promise { + + const res = (await commonControllerDecode(() => controllerCallGetDiscoveryUrl(session, discoveryUrl), + null) as IdentityProviderDiscoveryUrl | null); + + return res; +} + +export default controllerDecodeGetDiscoveryUrl; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerCallGetFederatedAuthenticators.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerCallGetFederatedAuthenticators.ts new file mode 100644 index 000000000..06ddd35d6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerCallGetFederatedAuthenticators.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderFederatedAuthenticator } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers//federated-authenticators/` + * to get detail of a federated authenticator of an identity provider + * + * @param session - session object + * @param idpid - identity provider id + * @param id - federated authenticator id + * + * @returns details of the federated authenticator, if the call failed `null` + */ +export async function controllerCallGetFederatedAuthenticators(session: Session, idpId: string, id: string) + : Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/getFederatedAuthenticators/${id}`, + session, idpId) as IdentityProviderFederatedAuthenticator | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerDecodeGetFederatedAuthenticators.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerDecodeGetFederatedAuthenticators.ts new file mode 100644 index 000000000..716916faf --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerGetFederatedAuthenticators/controllerDecodeGetFederatedAuthenticators.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderFederatedAuthenticator } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetFederatedAuthenticators } from "./controllerCallGetFederatedAuthenticators"; + +/** + * + * @param session - session object + * @param id - federated authenticator id + * @param idpId - identity provider id + * + * @returns - get the federated authenticators + */ +export async function controllerDecodeGetFederatedAuthenticators(session: Session, id: string, idpId: string) + : Promise { + + const res = (await commonControllerDecode(() => controllerCallGetFederatedAuthenticators(session, id, idpId), + null) as IdentityProviderFederatedAuthenticator | null); + + return res; + +} + +export default controllerDecodeGetFederatedAuthenticators; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerListAllIdentityProviders/controllerCallListAllIdentityProviders.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerListAllIdentityProviders/controllerCallListAllIdentityProviders.ts new file mode 100644 index 000000000..1064348be --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerListAllIdentityProviders/controllerCallListAllIdentityProviders.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderList } + from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers` + * to get list all the identity providers + * + * @param session - Session object + * + * @returns details of the identity provdider, if the call failed `null` + */ +export async function controllerCallListAllIdentityProviders(session: Session): Promise { + + const data = (await commonControllerCall("/api/settings/identityProvider/listAllIdentityProviders", + session) as IdentityProviderList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerListAllIdentityProviders/controllerDecodeListAllIdentityProviders.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerListAllIdentityProviders/controllerDecodeListAllIdentityProviders.ts new file mode 100644 index 000000000..d6b121242 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerListAllIdentityProviders/controllerDecodeListAllIdentityProviders.ts @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider, IdentityProviderList } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallListAllIdentityProviders } from "./controllerCallListAllIdentityProviders"; + +/** + * + * @param session - session object + * + * @returns - details of all the identity providers + */ +export async function controllerDecodeListAllIdentityProviders(session: Session): Promise { + + const res = (await commonControllerDecode(() => controllerCallListAllIdentityProviders(session), + null) as IdentityProviderList | null); + + if (res) { + if (res.identityProviders) { + return res.identityProviders; + } else { + return []; + } + } + + return null; +} + +export default controllerDecodeListAllIdentityProviders; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerCallPatchIdpClaims.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerCallPatchIdpClaims.ts new file mode 100644 index 000000000..09314ada9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerCallPatchIdpClaims.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProviderGroupMappings, +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +export async function controllerCallPatchIdpClaims(session: Session, idpId: string, + body: IdentityProviderGroupMappings): Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/patchIdpClaims/${idpId}`, + session, body) as IdentityProviderGroupMappings | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerCallPatchIdpGroups.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerCallPatchIdpGroups.ts new file mode 100644 index 000000000..43f02d63b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerCallPatchIdpGroups.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider, IdpGroup } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { PatchOperation } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * patch general settings of an identity provider + * + * call PUT `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers//` + * + * @param session - session object + * @param idpId - identity provider id + * @param body - identity provider body that need to patch + * + * @returns details of the idp, if the call failed `null` + */ +export async function controllerCallPatchIdpGroups(session: Session, idpId: string, + body: IdpGroup[]): Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/patchIdpGroups/${idpId}`, + session, body) as IdpGroup[] | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpClaims.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpClaims.ts new file mode 100644 index 000000000..ef7c59102 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpClaims.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + IdentityProviderGroupMappings +} from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallPatchIdpClaims } from "./controllerCallPatchIdpClaims"; + +export async function controllerDecodePatchIdpClaims( + session: Session, + idpId: string, + idpGroupsMappings: IdentityProviderGroupMappings +): Promise { + + const res = (await commonControllerDecode(() => controllerCallPatchIdpClaims(session, idpId, idpGroupsMappings), + null) as IdentityProviderGroupMappings | null); + + return res; +} + +export default controllerDecodePatchIdpClaims; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpGroups.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpGroups.ts new file mode 100644 index 000000000..41786a1de --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatcgIdpGroupMappings/controllerDecodePatchIdpGroups.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdpGroup } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallPatchIdpGroups } from "./controllerCallPatchIdpGroups"; + +export async function controllerDecodePatchIdpGroups( + session: Session, + idpId: string, + idpGroups: IdpGroup[] +): Promise { + + const res = (await commonControllerDecode(() => controllerCallPatchIdpGroups(session, idpId, idpGroups), + null) as IdpGroup[] | null); + + return res; +} + +export default controllerDecodePatchIdpGroups; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerCallPatchGeneralSettingsIdp.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerCallPatchGeneralSettingsIdp.ts new file mode 100644 index 000000000..5243ea199 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerCallPatchGeneralSettingsIdp.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { PatchOperation } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * patch general settings of an identity provider + * + * call PUT `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers//` + * + * @param session - session object + * @param idpId - identity provider id + * @param body - identity provider body that need to patch + * + * @returns details of the idp, if the call failed `null` + */ +export async function controllerCallPatchGeneralSettingsIdp(session: Session, idpId: string, + body: PatchOperation[]): Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/patchGeneralSettingsIdp/${idpId}`, + session, body) as IdentityProvider | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerDecodePatchGeneralSettingsIdp.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerDecodePatchGeneralSettingsIdp.ts new file mode 100644 index 000000000..c135bc25d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerPatchGeneralSettingsIdp/controllerDecodePatchGeneralSettingsIdp.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProvider } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { PatchOperation } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallPatchGeneralSettingsIdp } from "./controllerCallPatchGeneralSettingsIdp"; + +/** + * + * @param session - session object + * @param name - name of the identity provider + * @param description - description of the identity provider + * @param idpId - identity provider id + * + * @returns - patch the general settings in the identity provider + */ +export async function controllerDecodePatchGeneralSettingsIdp(session: Session, name: string, description: string, + idpId: string): Promise { + + const body: PatchOperation[] = [ + { "operation": "REPLACE", "path": "/description", "value": description }, + { "operation": "REPLACE", "path": "/isPrimary", "value": false }, + { "operation": "REPLACE", "path": "/name", "value": name } + ]; + + const res = (await commonControllerDecode(() => controllerCallPatchGeneralSettingsIdp(session, idpId, body), + null) as IdentityProvider | null); + + return res; +} + +export default controllerDecodePatchGeneralSettingsIdp; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerCallUpdateFederatedAuthenticators.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerCallUpdateFederatedAuthenticators.ts new file mode 100644 index 000000000..55973559c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerCallUpdateFederatedAuthenticators.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderFederatedAuthenticator } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * update federated authenticators of an identity provider + * + * call PATCH `getManagementAPIServerBaseUrl()/o//api/server/v1/identity-providers/` + * + * @param session - session object + * @param idpid - identity provider id + * @param body - identity provider body that need to update + * + * @returns update federated authenticators + */ +export async function controllerCallUpdateFederatedAuthenticators(session: Session, idpId: string, + body: (string | IdentityProviderFederatedAuthenticator | undefined)[]) + : Promise { + + const data = (await commonControllerCall(`/api/settings/identityProvider/updateFederatedAuthenticators/${idpId}`, + session, body) as IdentityProviderFederatedAuthenticator | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerDecodeUpdateFederatedAuthenticators.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerDecodeUpdateFederatedAuthenticators.ts new file mode 100644 index 000000000..072614da2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/identityProvider/controllerUpdateFederatedAuthenticators/controllerDecodeUpdateFederatedAuthenticators.ts @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { IdentityProviderFederatedAuthenticator } from + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallUpdateFederatedAuthenticators } from "./controllerCallUpdateFederatedAuthenticators"; + +function refactorFederatedAuthenticatorsForUpdate(federatedAuthenticators: IdentityProviderFederatedAuthenticator) { + delete federatedAuthenticators.authenticatorId; + delete federatedAuthenticators.tags; + + return federatedAuthenticators; +} + +function updateProperties(federatedAuthenticators: IdentityProviderFederatedAuthenticator, keyProperty: string, + valueProperty: string) { + federatedAuthenticators.properties.filter((property) => property.key === keyProperty)[0].value = valueProperty; + + return federatedAuthenticators; +} + +/** + * + * @param session - session object + + * @returns logged in users object. If failed `null` + */ +export async function controllerDecodeUpdateFederatedAuthenticators( + session: Session, idpId: string, federatedAuthenticators: IdentityProviderFederatedAuthenticator, + changedValues: Record): Promise { + + const federatedAuthenticatorId = federatedAuthenticators.authenticatorId; + + federatedAuthenticators = refactorFederatedAuthenticatorsForUpdate(federatedAuthenticators); + Object.keys(changedValues).filter((key) => { + federatedAuthenticators = updateProperties(federatedAuthenticators, key, changedValues[key]); + + return null; + }); + + const body = [ federatedAuthenticatorId, federatedAuthenticators ]; + + const res = (await commonControllerDecode(() => controllerCallUpdateFederatedAuthenticators(session, idpId, body), + null) as IdentityProviderFederatedAuthenticator | null); + + return res; + +} + +export default controllerDecodeUpdateFederatedAuthenticators; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerCreateRole/controllerCallCreateRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerCreateRole/controllerCallCreateRole.ts new file mode 100644 index 000000000..44a745b0e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerCreateRole/controllerCallCreateRole.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call POST `getManagementAPIServerBaseUrl()/api/server/v1/organizations/${orgId}/roles` create the role + * + * @param session - session object + * @param role - role object + * + * @returns created role details, if not created returns `null` + */ +export async function controllerCallCreateRole(session: Session, role: Role) : Promise { + + const data = ( await commonControllerCall("/api/settings/role/createRole", session, role) as Role | null ); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerCreateRole/controllerDecodeCreateRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerCreateRole/controllerDecodeCreateRole.ts new file mode 100644 index 000000000..689abf6fc --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerCreateRole/controllerDecodeCreateRole.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role, RoleUsers } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallCreateRole } from "./controllerCallCreateRole"; + + +function getUsersList(users: string[]): RoleUsers[] { + + return users.map((user) => { return { "value": user }; }); +} + +function getRoleBody(displayName: string, permissions: string[], users: string[]): Role { + return { + "displayName": displayName, + "groups": [], + "permissions": permissions, + "users": getUsersList(users) + }; +} + +/** + * + * @param session - session object + * @param displayName - role name + * @param permissions - role permissions + * @param users - users assigned to the role + * + * @returns `res` (if user added successfully) or `false` (if user addition was not completed) + */ +export async function controllerDecodeCreateRole(session: Session, displayName: string, permissions: string[] + , users: string[]): Promise { + + const role: Role = getRoleBody(displayName, permissions, users); + + const res = (await commonControllerDecode(() => controllerCallCreateRole(session, role), null) as Role | null); + + return res; +} + +export default controllerDecodeCreateRole; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerEditRolesToAddOrRemoveUser/controllerDecodeEditRolesToAddOrRemoveUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerEditRolesToAddOrRemoveUser/controllerDecodeEditRolesToAddOrRemoveUser.ts new file mode 100644 index 000000000..900220be7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerEditRolesToAddOrRemoveUser/controllerDecodeEditRolesToAddOrRemoveUser.ts @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { PatchMethod } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { controllerDecodePatchRole } from "../controllerPatchRole/controllerDecodePatchRole"; + +function getRolesThatNeedToAddUser(initRoleList: string[], roleList: string[]): string[] { + return roleList.filter(roleUri => !initRoleList.includes(roleUri)); +} + +function getRolesThatNeedToRemoveUser(initRoleList: string[], roleList: string[]): string[] { + return initRoleList.filter(roleUri => !roleList.includes(roleUri)); +} + +async function patchRoleDetails(session: Session, userId: string, rolesUriList: string[], patchMethod: PatchMethod) + : Promise { + + for (const uri in rolesUriList) { + const role: Role | null = await controllerDecodePatchRole(session, uri, patchMethod, "users", [ userId ]); + + if (!role) { + + return false; + } + } + + return true; +} + +async function getRoleDetailsForAdd(session: Session, userId: string, initRoleList: string[], roleList: string[]) + : Promise { + + const rolesUriList: string[] = getRolesThatNeedToAddUser(initRoleList, roleList); + + return await patchRoleDetails(session, userId, rolesUriList, PatchMethod.ADD); +} + +async function getRoleDetailsForRemove(session: Session, userId: string, initRoleList: string[] + , roleList: string[]): Promise { + + const rolesUriList: string[] = getRolesThatNeedToRemoveUser(initRoleList, roleList); + + return await patchRoleDetails(session, userId, rolesUriList, PatchMethod.REMOVE); +} + +/** + * + * @param session - session + * @param userId - id of the user + * @param initRoleList - inital list of roles assigned for the user + * @param roleList - current list of roles assigned for the user + * + * @returns - `true` if the operation is successfull, else `false` + */ +// todo: need to fix controllerDecodeEditRolesToAddOrRemoveUser +export async function controllerDecodeEditRolesToAddOrRemoveUser( + session: Session, userId: string, initRoleList: string[], roleList: string[]): Promise { + + try { + return getRoleDetailsForAdd(session, userId, initRoleList, roleList) + .then( + (res: boolean) => { + if (res) { + getRoleDetailsForRemove(session, userId, initRoleList, roleList) + .then((res: boolean) => res).catch(() => false); + } + + return false; + } + ).catch(() => false); + + } catch (err) { + + return false; + } + +} + +export default controllerDecodeEditRolesToAddOrRemoveUser; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerGetRole/controllerCallGetRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerGetRole/controllerCallGetRole.ts new file mode 100644 index 000000000..786adb79e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerGetRole/controllerCallGetRole.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `roleUri` + * + * @param session - session object + * @param roleUri - uri of the role + * + * @returns - role details, if the call failed `null` + */ +export async function controllerCallGetRole(session: Session, roleId: string): Promise { + + const data = (await commonControllerCall( + `/api/settings/role/getRole?roleId=${roleId}&orgId=${session.orgId}`, + session + ) as Role | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerGetRole/controllerDecodeGetRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerGetRole/controllerDecodeGetRole.ts new file mode 100644 index 000000000..7c2c0d5b1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerGetRole/controllerDecodeGetRole.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallGetRole } from "./controllerCallGetRole"; + +/** + * + * @param session - session objet + * @param roleUri - uri of the role + * + * @returns - details of the role + */ +export async function controllerDecodeGetRole(session: Session, roleId: string): Promise { + + const res = (await commonControllerDecode(() => controllerCallGetRole(session, roleId), null) as Role | null); + + return res; + +} + +export default controllerDecodeGetRole; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerListAllRoles/controllerCallListAllRoles.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerListAllRoles/controllerCallListAllRoles.ts new file mode 100644 index 000000000..63ff28d97 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerListAllRoles/controllerCallListAllRoles.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { RoleList } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/organizations//roles` + * to list all the roles + * + * @param session - session object + * + * @returns - all the roles, if the call failed `null` + */ +export async function controllerCallListAllRoles(session: Session) : Promise { + + const data = (await commonControllerCall("/api/settings/role/listAllRoles", session) as RoleList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerListAllRoles/controllerDecodeListAllRoles.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerListAllRoles/controllerDecodeListAllRoles.ts new file mode 100644 index 000000000..6872abf0a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerListAllRoles/controllerDecodeListAllRoles.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role, RoleList } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallListAllRoles } from "./controllerCallListAllRoles"; + +/** + * + * @param session - session object + * + * @returns - list all the roles + */ +export async function controllerDecodeListAllRoles(session: Session): Promise { + + const res = ( + await commonControllerDecode(() => controllerCallListAllRoles(session), null) as RoleList | null); + + if (res) { + return res.Resources; + } + + return null; + +} + +export default controllerDecodeListAllRoles; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerPatchRole/controllerCallPatchRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerPatchRole/controllerCallPatchRole.ts new file mode 100644 index 000000000..42e41feee --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerPatchRole/controllerCallPatchRole.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { PatchBody } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call PATCH `roleUri` + * + * @param session - Session object + * @param roleUri - uri of the role + * @param patchBody - body of the role that need to be patched + * + * @returns patched role, if the call failed `null` + */ +export async function controllerCallPatchRole(session: Session, roleId: string, patchBody: PatchBody) + : Promise { + + const data = (await commonControllerCall(`/api/settings/role/patchRole?roleId=${roleId}`, session, patchBody) as + Role | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerPatchRole/controllerDecodePatchRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerPatchRole/controllerDecodePatchRole.ts new file mode 100644 index 000000000..7c93dc89d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerPatchRole/controllerDecodePatchRole.ts @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { PatchBody } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { PatchMethod } from "@pet-management-webapp/shared/util/util-common"; +import { Session } from "next-auth"; +import { controllerCallPatchRole } from "./controllerCallPatchRole"; + +export function getAddReplaceBody(patchMethod: PatchMethod, path: string, values: string[] | string): PatchBody { + + const valuesList = Array.isArray(values) + ? values.map((val) => { return { "value": val }; }) + : [ { "value": values } ]; + + const patchBody: any = { + "Operations": [ + { + "op": patchMethod, + "value": {} + } + ] + }; + + patchBody["Operations"][0]["value"][path] = valuesList; + + return patchBody as PatchBody; +} + +export function getRemoveBody(patchMethod: PatchMethod, path: string, value: string[] | string): PatchBody { + return { + "Operations": [ + { + "op": patchMethod, + "path": `${path}[value eq ${value}]` + } + ] + }; +} + +export function getPatchBody(patchMethod: PatchMethod, path: string, value: string[] | string) { + switch (patchMethod) { + case PatchMethod.ADD: + + return getAddReplaceBody(patchMethod, path, value); + + case PatchMethod.REPLACE: + + return getAddReplaceBody(patchMethod, path, value); + case PatchMethod.REMOVE: + + return getRemoveBody(patchMethod, path, value); + default: + + return; + } +} + + +/** + * + * @param session - session object + * @param roleUri - uri of the role + * @param patchMethod - `PatchMethod.ADD`, `PatchMethod.REPLACE` or `PatchMethod.REMOVE` + * @param path - path + * @param value - edited value + * + * @returns - whehter the patch was successful or not + */ +export async function controllerDecodePatchRole( + session: Session, roleId: string, patchMethod: PatchMethod, path: string, value: string[] | string) + : Promise { + + const patchBody: PatchBody = (getPatchBody(patchMethod, path, value) as PatchBody); + console.log(patchBody); + + const res = ( + await commonControllerDecode(() => controllerCallPatchRole(session, roleId, patchBody), null) as Role | null); + + return res; +} + +export default controllerDecodePatchRole; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerUserRole/controllerCallUserRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerUserRole/controllerCallUserRole.ts new file mode 100644 index 000000000..36ebfa62f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerUserRole/controllerCallUserRole.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//api/server/v1/organizations//users//roles` + * to list all the roles of a user + * + * @param session - session object + * @param id - user id + * + * @returns roles of a user, if the call failed `null` + */ +export async function controllerCallUserRole(session: Session, id: string): Promise { + + const data = (await commonControllerCall(`/api/settings/role/userRoles/${id}`, session) as Role[] | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerUserRole/controllerDecodeUserRole.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerUserRole/controllerDecodeUserRole.ts new file mode 100644 index 000000000..258c03487 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/role/controllerUserRole/controllerDecodeUserRole.ts @@ -0,0 +1,39 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Role } from "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util"; +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallUserRole } from "./controllerCallUserRole"; + +/** + * + * @param session - session object + * @param id - id of the user + * + * @returns - details of the roles of the user + */ +export async function controllerDecodeUserRole(session: Session, id: string): Promise { + + const res = (await commonControllerDecode(() => controllerCallUserRole(session, id), null) as Role[] | null); + + return res; + +} + +export default controllerDecodeUserRole; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerAddUser/controllerCallAddUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerAddUser/controllerCallAddUser.ts new file mode 100644 index 000000000..b27e169e9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerAddUser/controllerCallAddUser.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { SendUser, User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call POST `getManagementAPIServerBaseUrl()/o//scim2/Users` create the user + * + * @param session - session object + * @param user - `SendUser` + * + * @returns created user details, if not created returns `null` + */ +export async function controllerCallAddUser(session: Session, user: SendUser): Promise { + + const data = (await commonControllerCall("/api/settings/user/addUser", session, user) as User | null); + + return data; + +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerAddUser/controllerDecodeAddUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerAddUser/controllerDecodeAddUser.ts new file mode 100644 index 000000000..bc5bc4774 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerAddUser/controllerDecodeAddUser.ts @@ -0,0 +1,115 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { SendUser, User, setUsername } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallAddUser } from "./controllerCallAddUser"; + +export enum InviteConst { + INVITE = "pwd-method-invite", + PWD = "pwd-method-pwd" +} + +function inviteAddUserBody(firstName: string, familyName: string, email: string): SendUser { + return { + "emails": [ + { + "primary": true, + "value": email + } + ], + "name": { + "familyName": familyName, + "givenName": firstName + }, + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": { + "askPassword": true + }, + "userName": setUsername(email) + }; +} + +function pwdAddUserBody(firstName: string, familyName: string, email: string, password: string) + : SendUser { + return { + "emails": [ + { + "primary": true, + "value": email + } + ], + "name": { + "familyName": familyName, + "givenName": firstName + }, + "password": password, + "schemas": [], + "userName": setUsername(email) + }; +} + +function getAddUserBody( + inviteConst: InviteConst, + firstName: string, + familyName: string, + email: string, + password: string): SendUser | undefined { + switch (inviteConst) { + case InviteConst.INVITE: + return inviteAddUserBody(firstName, familyName, email); + + case InviteConst.PWD: + return pwdAddUserBody(firstName, familyName, email, password); + + default: + + return; + } +} + +/** + * + * @param session - session object + * @param inviteConst - `InviteConst.INVITE` or `InviteConst.PWD` + * @param firstName - first name + * @param familyName - last name + * @param email - email + * @param password - password + * + * @returns - details of the created user + */ +export async function controllerDecodeAddUser( + session: Session, + inviteConst: InviteConst, + firstName: string, + familyName: string, + email: string, + password: string): Promise { + + const addUserEncode: SendUser = + (getAddUserBody(inviteConst, firstName, familyName, email, password) as SendUser); + + const res = ( + await commonControllerDecode(() => controllerCallAddUser(session, addUserEncode), false) as User | boolean); + + return res; + +} + +export default { InviteConst, controllerDecodeAddUser }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerDeleteUser/controllerCallDeleteUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerDeleteUser/controllerCallDeleteUser.ts new file mode 100644 index 000000000..ea9faac03 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerDeleteUser/controllerCallDeleteUser.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; + +/** + * + * @param session - session object + * @param userId - user id + * + * @returns delete success, if the call failed `null` + */ +export async function controllerCallDeleteUser(session: Session, userId: string) { + + const data = await commonControllerCall(`/api/settings/user/deleteUser?userId=${userId}`, session); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerDeleteUser/controllerDecodeDeleteUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerDeleteUser/controllerDecodeDeleteUser.ts new file mode 100644 index 000000000..3dea23010 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerDeleteUser/controllerDecodeDeleteUser.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { Session } from "next-auth"; +import { controllerCallDeleteUser } from "./controllerCallDeleteUser"; + +/** + * + * @param session - session object + * @param userId - user id + * + * @returns - whether the group is deleted or not + */ +export async function controllerDecodeDeleteUser(session: Session, userId: string): Promise { + + const res = await commonControllerDecode(() => controllerCallDeleteUser(session, userId), null); + + if(res){ + return true; + } + + return null; + +} + +export default controllerDecodeDeleteUser; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerEditUser/controllerCallEditUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerEditUser/controllerCallEditUser.ts new file mode 100644 index 000000000..bd2e4cb26 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerEditUser/controllerCallEditUser.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { SendEditUser, User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call PATCH `getManagementAPIServerBaseUrl()/o//scim2/Users/` to edit the user + * + * @param session - session object + * @param id - id of the user + * @param user - `SendEditUser` + * + * @returns edited user details, if not edited returns `null` + */ +export async function controllerCallEditUser(session: Session, id:string, user: SendEditUser): Promise{ + + const data = ( await commonControllerCall(`/api/settings/user/editUser/${id}`, session, user) as User | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerEditUser/controllerDecodeEditUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerEditUser/controllerDecodeEditUser.ts new file mode 100644 index 000000000..7cd10d319 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerEditUser/controllerDecodeEditUser.ts @@ -0,0 +1,71 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { SendEditUser, User, setUsername } + from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallEditUser } from "./controllerCallEditUser"; + +/** + * + * @param session - session object + * @param id - id of the user + * @param firstName - edited first name + * @param familyName - edited last name + * @param email - edited email + * @param username - edited username + * + * @returns - whether the edit of the user is successful or not + */ +export async function controllerDecodeEditUser( + session: Session, id: string, firstName: string, familyName: string, email: string) + : Promise { + + const editUserEncode: SendEditUser = { + "Operations": [ + { + "op": "replace", + "value": { + "emails": [ + { + "primary": true, + "value": email + } + ], + "name": { + "familyName": familyName, + "givenName": firstName + }, + "userName": setUsername(email) + } + } + ], + "schemas": [ + "urn:ietf:params:scim:api:messages:2.0:PatchOp" + ] + }; + + const usersData = ( + await commonControllerDecode(() => controllerCallEditUser(session, id, editUserEncode), false) as User | null); + + return usersData; + +} + +export default controllerDecodeEditUser; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerViewUser/controllerCallViewUsers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerViewUser/controllerCallViewUsers.ts new file mode 100644 index 000000000..35d141127 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerViewUser/controllerCallViewUsers.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerCall } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { UserList } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; + +/** + * call GET `getManagementAPIServerBaseUrl()/o//scim2/Users` to view all the users + * + * @param session - session object + * + * @returns - list all users + */ +export async function controllerCallViewUsers(session: Session): Promise { + + const data = (await commonControllerCall("/api/settings/user/viewUsers", session) as UserList | null); + + return data; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerViewUser/controllerDecodeViewUsers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerViewUser/controllerDecodeViewUsers.ts new file mode 100644 index 000000000..ae1dfb055 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/lib/controller/user/controllerViewUser/controllerDecodeViewUsers.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { commonControllerDecode } from "@pet-management-webapp/shared/data-access/data-access-common-api-util"; +import { InternalUser, User, UserList, decodeUser } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { controllerCallViewUsers } from "./controllerCallViewUsers"; + +/** + * + * @param session - session object + + * @returns details of all users + */ +export async function controllerDecodeViewUsers(session: Session): Promise { + + const usersData = ( + await commonControllerDecode(() => controllerCallViewUsers(session), null) as UserList | null); + + if (usersData) { + const usersReturn: InternalUser[] = []; + + if(usersData.Resources){ + usersData.Resources.map((user: User) => { + const userDetails = decodeUser(user); + + if (userDetails) { + usersReturn.push(userDetails); + } + + return null; + }); + } + + return usersReturn; + + } + + return null; + +} + +export default controllerDecodeViewUsers; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/types/next-auth.d.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/types/next-auth.d.ts new file mode 100644 index 000000000..e0022fd90 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/src/types/next-auth.d.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Profile } from "next-auth"; +import "next-auth/jwt"; + +declare module "next-auth" { + interface Session { + error: boolean, + expires: boolean, + accessToken?: string, + idToken?: JWT, + scope?: string, + refreshToken?: string, + userId?: string, + user?: User | null, + orgId?: string, + orgName?: string, + orginalIdToken?: string, + } +} + +declare module "next-auth/jwt" { + interface JWT { + idToken?: string, + accessToken?: string, + scope?: string, + user?: Profile + } +} + +declare module "next-auth" { + interface Profile { + email?: string, + sub?: string, + family_name?: string, + given_name?: string, + username?: string, + user_organization?: string, + org_name?: string, + org_id: string + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/data-access/data-access-controller/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNav.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNav.json new file mode 100644 index 000000000..395f843a6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNav.json @@ -0,0 +1,70 @@ +{ + "items": [ + { + "title": "Get Started", + "eventKey": "1", + "icon": "SettingHorizontalIcon", + "type": "menu" + }, + { + "title": "Settings", + "eventKey": "2", + "icon": "GearCircleIcon", + "type": "menu", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_user_mgt_list", + "internal_org_user_mgt_create", + "internal_org_user_mgt_update", + "internal_org_role_mgt_view", + "internal_org_role_mgt_create", + "internal_org_role_mgt_update", + "internal_org_idp_view", + "internal_org_idp_create", + "internal_org_idp_update", + "internal_org_idp_delete", + "internal_org_application_mgt_view", + "internal_org_application_mgt_update" + ], + "items": [ + { + "title": "Manage Users", + "eventKey": "2-1", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_user_mgt_list", + "internal_org_user_mgt_create", + "internal_org_user_mgt_update" + ] + }, + { + "title": "Role Management", + "eventKey": "2-2", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_user_mgt_list", + "internal_org_role_mgt_view", + "internal_org_role_mgt_create", + "internal_org_role_mgt_update" + ] + }, + { + "title": "Identity Providers", + "eventKey": "2-3", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_idp_view", + "internal_org_idp_create", + "internal_org_idp_update", + "internal_org_idp_delete", + "internal_org_application_mgt_view", + "internal_org_application_mgt_update" + ] + } + ] + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForAdmin.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForAdmin.json new file mode 100644 index 000000000..21da446c0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForAdmin.json @@ -0,0 +1,208 @@ +{ + "items": [ + { + "title": "Dashboard", + "eventKey": "10", + "icon": "DashboardIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "list_doctors", + "view_org_info", + "update_org_info" + ] + }, + { + "title": "Dashboard", + "eventKey": "9", + "icon": "DashboardIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "view_profile", + "list_bookings", + "list_pets" + ] + }, + { + "title": "Dashboard", + "eventKey": "11", + "icon": "DashboardIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "create_pet", + "list_bookings" + ] + }, + { + "title": "Manage Doctors", + "eventKey": "3", + "icon": "ProfileIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "create_doctor" + ] + }, + { + "title": "Profile", + "eventKey": "4", + "icon": "ProfileIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "view_profile", + "view_doctor", + "update_doctor" + ] + }, + { + "title": "Manage Users", + "eventKey": "2-1", + "icon": "AdminIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_user_mgt_view", + "internal_org_user_mgt_list", + "internal_org_user_mgt_update", + "internal_org_user_mgt_delete", + "internal_org_user_mgt_create" + ] + }, + { + "title": "Manage Roles", + "eventKey": "2-2", + "icon": "ManageDoctorIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_role_mgt_view", + "internal_org_role_mgt_update" + ] + }, + { + "title": "Manage Groups", + "eventKey": "2-3", + "icon": "ManageGroups", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_group_mgt_view", + "internal_org_group_mgt_list", + "internal_org_group_mgt_update", + "internal_org_group_mgt_delete", + "internal_org_group_mgt_create" + ] + }, + { + "title": "Personalization", + "eventKey": "12", + "icon": "BrandingIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_branding_preference_update" + ] + }, + { + "title": "Security", + "eventKey": "2", + "icon": "GearCircleIcon", + "type": "menu", + "hideBasedOnScope": true, + "items": [ + { + "title": "SSO", + "eventKey": "2-4", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_idp_view", + "internal_org_idp_create", + "internal_org_idp_update", + "internal_org_idp_delete", + "internal_org_application_mgt_view", + "internal_org_application_mgt_update" + ] + }, + { + "title": "2-Step Verification", + "eventKey": "13", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "internal_org_application_mgt_view", + "internal_org_application_mgt_update" + ] + } + ] + }, + { + "title": "Bookings", + "eventKey": "5", + "icon": "BookingsIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "view_profile", + "list_bookings" + ] + }, + { + "title": "Pets", + "eventKey": "6", + "icon": "PetsIcon", + "type": "item", + "hideBasedOnScope": true, + "scopes": [ + "create_pet", + "view_pet", + "list_pets" + ] + }, + { + "title": "Channelling", + "eventKey": "7", + "icon": "ChannellingIcon", + "type": "menu", + "hideBasedOnScope": true, + "items": [ + { + "title": "Channel a Doctor", + "eventKey": "7-1", + "type": "item", + "icon": "ManageUserIcon", + "scopes": [ + "create_pet", + "list_pets", + "list_doctors", + "view_doctor", + "view_pet", + "create_bookings" + ] + }, + { + "title": "Available Bookings", + "eventKey": "7-2", + "type": "item", + "scopes": [ + "create_pet", + "list_bookings" + ] + } + ] + }, + { + "title": "Settings", + "eventKey": "8", + "icon": "GearCircleIcon", + "type": "menu", + "hideBasedOnScope": true, + "scopes": [ + "create_pet" + ] + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForDoctor.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForDoctor.json new file mode 100644 index 000000000..9eef4025f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForDoctor.json @@ -0,0 +1,22 @@ +{ + "items": [ + { + "title": "Dashboard", + "eventKey": "9", + "icon": "DashboardIcon", + "type": "menu" + }, + { + "title": "Profile", + "eventKey": "4", + "icon": "ProfileIcon", + "type": "menu" + }, + { + "title": "Bookings", + "eventKey": "5", + "icon": "BookingsIcon", + "type": "menu" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForPetOwner.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForPetOwner.json new file mode 100644 index 000000000..390f5e298 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/data/sideNavDataForPetOwner.json @@ -0,0 +1,69 @@ +{ + "items": [ + { + "title": "Dashboard", + "eventKey": "11", + "icon": "DashboardIcon", + "type": "menu" + }, + { + "title": "Pets", + "eventKey": "6", + "icon": "PetsIcon", + "type": "menu" + }, + { + "title": "Channelling", + "eventKey": "7", + "icon": "ChannellingIcon", + "type": "menu", + "hideBasedOnScope": false, + "scopes": [ + "internal_user_mgt_list", + "internal_user_mgt_create", + "internal_user_mgt_update", + "internal_role_mgt_view", + "internal_role_mgt_create", + "internal_role_mgt_update", + "internal_idp_view", + "internal_idp_create", + "internal_idp_update", + "internal_idp_delete", + "internal_application_mgt_view", + "internal_application_mgt_update" + ], + "items": [ + { + "title": "Channel a Doctor", + "eventKey": "7-1", + "type": "item", + "icon": "ManageUserIcon", + "hideBasedOnScope": false, + "scopes": [ + "internal_user_mgt_list", + "internal_user_mgt_create", + "internal_user_mgt_update" + ] + }, + { + "title": "Available Bookings", + "eventKey": "7-2", + "type": "item", + "hideBasedOnScope": false, + "scopes": [ + "internal_user_mgt_list", + "internal_role_mgt_view", + "internal_role_mgt_create", + "internal_role_mgt_update" + ] + } + ] + }, + { + "title": "Settings", + "eventKey": "8", + "icon": "GearCircleIcon", + "type": "menu" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome.jpeg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome.jpeg new file mode 100644 index 000000000..8ac7ea28b Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome.jpeg differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome1.jpeg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome1.jpeg new file mode 100644 index 000000000..55e368b33 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome1.jpeg differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome2.jpeg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome2.jpeg new file mode 100644 index 000000000..a294b0205 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome2.jpeg differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome_.jpeg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome_.jpeg new file mode 100644 index 000000000..7a4364f27 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/businessAdminHome_.jpeg differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/email-solid.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/email-solid.svg new file mode 100644 index 000000000..837b44c00 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/email-solid.svg @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/enterprise.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/enterprise.svg new file mode 100644 index 000000000..84e6607e9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/enterprise.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png new file mode 100644 index 000000000..6a2a211ef Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/female-doc-thumbnail.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/getStarted.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/getStarted.svg new file mode 100644 index 000000000..7f65afcdd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/getStarted.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/getStartedWelcome.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/getStartedWelcome.svg new file mode 100644 index 000000000..8de1010c9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/getStartedWelcome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/google.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/google.svg new file mode 100644 index 000000000..c13713a47 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/google.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo-easy.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo-easy.png new file mode 100644 index 000000000..118c1d097 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo-easy.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo-easyMeet.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo-easyMeet.png new file mode 100644 index 000000000..118c1d097 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo-easyMeet.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo.png new file mode 100644 index 000000000..56702a331 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/logo.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png new file mode 100644 index 000000000..c7753dd8a Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/male-doc-thumbnail.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/pet_care_logo.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/pet_care_logo.png new file mode 100644 index 000000000..5397369c2 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/pet_care_logo.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/profile.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/profile.svg new file mode 100644 index 000000000..4fc94a6b0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/profile.svg @@ -0,0 +1 @@ +profile pic \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/sms-otp.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/sms-otp.svg new file mode 100644 index 000000000..e51b1928b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/sms-otp.svg @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png new file mode 100644 index 000000000..c99d2bd71 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/thumbnail.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/totp.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/totp.svg new file mode 100644 index 000000000..1e6a81621 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-assets/src/lib/images/totp.svg @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/README.md b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/README.md new file mode 100644 index 000000000..3510157a4 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/README.md @@ -0,0 +1,7 @@ +# business-admin-app-ui-ui-components + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test business-admin-app-ui-ui-components` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/jest.config.ts new file mode 100644 index 000000000..7ec287090 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "business-admin-app-ui-ui-components", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/business-admin-app/ui/ui-components" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/index.ts new file mode 100644 index 000000000..837329213 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/index.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/components/logoComponent/logoComponent"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/components/logoComponent/logoComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/components/logoComponent/logoComponent.module.css new file mode 100644 index 000000000..e2775f384 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/components/logoComponent/logoComponent.module.css @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.nameTag { + position: relative; + font-size: 16px; +} + +.logoDiv { + display: flex; + align-items: center; + justify-content: center; + position: relative; + height: auto; + flex-direction: column; +} + +.logoDiv hr { + margin: 12px; + align-self: stretch; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/components/logoComponent/logoComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/components/logoComponent/logoComponent.tsx new file mode 100644 index 000000000..ae5fa80ac --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/components/logoComponent/logoComponent.tsx @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { SharedLogoComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import logoImage from "../../../../../ui-assets/src/lib/images/pet_care_logo.png"; +import { LogoComponentProps } from "../../models/logoComponent/logoComponent"; + +/** + * + * @param prop - name (org name), imageSize `small` | `medium` | `large` | `x-large`, white + * + * @returns Business app logo image + */ +export function LogoComponent(prop: LogoComponentProps) { + + const { name, imageSize, white } = prop; + + return ( + + ); +} + +export default LogoComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/models/logoComponent/logoComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/models/logoComponent/logoComponent.ts new file mode 100644 index 000000000..59767ecbd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/src/lib/models/logoComponent/logoComponent.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { StaticImageData } from "next/image"; + +export interface LogoComponentProps { + name?: string, + imageSize: "small" | "medium" | "large" | "x-large", + white?: boolean +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/ui/ui-components/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/jest.config.ts new file mode 100644 index 000000000..dcfaa36a6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "business-admin-app-util-util-application-config-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/business-admin-app/util/util-application-config-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/index.ts new file mode 100644 index 000000000..35dd8671d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/index.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/applicationConfigUtil"; +export * from "./lib/appConfigGeneratorUtil"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/lib/appConfigGeneratorUtil.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/lib/appConfigGeneratorUtil.ts new file mode 100644 index 000000000..de6f2e1e2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/lib/appConfigGeneratorUtil.ts @@ -0,0 +1,105 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import getNextConfig from "next/config"; +import config from "../../../../../../config.json"; + +interface ConfigObject { + CommonConfig: { + AuthorizationConfig: { + BaseUrl: string; + BaseOrganizationUrl: string; + ClientId: string; + }; + ApplicationConfig: { + SampleOrganization: { + id: string; + name: string; + }[]; + }; + }; + BusinessAdminAppConfig: { + ApplicationConfig: { + HostedUrl?: string; + APIScopes?: string[]; + Branding: { + name?: string; + tag?: string; + }; + }; + resourceServerURLs: { + channellingService?: string; + petManagementService?: string; + personalizationService?: string; + }; + ManagementAPIConfig: { + SharedApplicationName: string, + UserStore: string + }; + }; +} + + +/** + * + * get config + */ +export function getConfig(): ConfigObject { + + const { publicRuntimeConfig } = getNextConfig(); + + const configObj = { + CommonConfig: { + ApplicationConfig: { + SampleOrganization: config.CommonConfig.ApplicationConfig.SampleOrganization + }, + AuthorizationConfig: { + BaseOrganizationUrl: publicRuntimeConfig.baseOrgUrl, + BaseUrl: publicRuntimeConfig.baseUrl, + ClientId: publicRuntimeConfig.clientId + } + }, + // eslint-disable-next-line sort-keys + BusinessAdminAppConfig: { + + // eslint-disable-next-line sort-keys + ApplicationConfig: { + HostedUrl: publicRuntimeConfig.hostedUrl, + // eslint-disable-next-line sort-keys + APIScopes: config.BusinessAdminAppConfig.ApplicationConfig.APIScopes, + Branding: { + name: config.BusinessAdminAppConfig.ApplicationConfig.Branding.name, + tag: config.BusinessAdminAppConfig.ApplicationConfig.Branding.tag + } + }, + ManagementAPIConfig: { + SharedApplicationName: publicRuntimeConfig.sharedAppName, + UserStore: config.BusinessAdminAppConfig.ManagementAPIConfig.UserStore + }, + resourceServerURLs: { + channellingService: publicRuntimeConfig.channellingServiceUrl, + personalizationService: publicRuntimeConfig.personalizationServiceUrl, + petManagementService: publicRuntimeConfig.petManagementServiceUrl + } + } + }; + + return configObj; +} + +export default { getConfig }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/lib/applicationConfigUtil.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/lib/applicationConfigUtil.ts new file mode 100644 index 000000000..193e64ff7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/src/lib/applicationConfigUtil.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; + +/** + * + * get hosted url + * value of `config.ApplicationConfig.HostedUrl` + */ +export function getHostedUrl() : string { + const hostedUrl = getConfig().BusinessAdminAppConfig.ApplicationConfig.HostedUrl; + + if (hostedUrl !== undefined) { + return hostedUrl; + } + + return ""; +} + +export default { getHostedUrl }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-application-config-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/README.md b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/README.md new file mode 100644 index 000000000..6ed326e18 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/README.md @@ -0,0 +1,7 @@ +# business-admin-app-util-util-authorization-config-util + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test business-admin-app-util-util-authorization-config-util` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/jest.config.ts new file mode 100644 index 000000000..f44c4ced5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "business-admin-app-util-util-authorization-config-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/business-admin-app/util/util-authorization-config-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/src/index.ts new file mode 100644 index 000000000..35b4761e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/src/index.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/authorizationConfigUtil"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/src/lib/authorizationConfigUtil.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/src/lib/authorizationConfigUtil.ts new file mode 100644 index 000000000..6d43070c6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/src/lib/authorizationConfigUtil.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getHostedUrl } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { orgSignout } from "@pet-management-webapp/shared/util/util-authorization-config-util"; +import { Session } from "next-auth"; + +/** +* signout of the logged in organization +* +* @param session - session object +*/ +async function signout(session: Session): Promise { + + await orgSignout(session, getHostedUrl()); +} + +export { signout }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/business-admin-app/util/util-authorization-config-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/jest.config.ts new file mode 100644 index 000000000..3f0509d2c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-data-access-data-access-common-api-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/shared/data-access/data-access-common-api-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/index.ts new file mode 100644 index 000000000..281ae84a0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/index.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/apiUtil/api/apiErrors"; +export * from "./lib/apiUtil/api/apiRequestOptions"; +export * from "./lib/apiUtil/api/requestMethod"; +export * from "./lib/apiUtil/controllerCall/commonControllerCall"; +export * from "./lib/apiUtil/controllerCall/controllerCallApiRequestOptions"; +export * from "./lib/apiUtil/controllerDecode/commonControllerDecode"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiErrors.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiErrors.ts new file mode 100644 index 000000000..aaa040606 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiErrors.ts @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { NextApiResponse } from "next"; + +interface Error404Interface { + error: boolean, + msg: string +} + +function error404(res: NextApiResponse, msg: Error404Interface | string) { + + return res.status(404).json(msg); +} + +export function notPostError(res: NextApiResponse) { + + return error404(res, "Cannot request data directyly."); +} + +export function dataNotRecievedError(res: NextApiResponse) { + + return error404(res, { + error: true, + msg: "Error occured when requesting data." + }); +} + +export default { dataNotRecievedError, notPostError }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiRequestOptions.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiRequestOptions.ts new file mode 100644 index 000000000..4f14cfa26 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/apiRequestOptions.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Session } from "next-auth"; +import RequestMethod from "./requestMethod"; + +/** + * + * @param session - session object + * + * @returns header object that can used for IS API calls + */ +export function apiRequestOptions(session: Session, hostedUrl: string): RequestInit { + const headers = { + "accept": "application/json", + "access-control-allow-origin": hostedUrl, + "authorization": "Bearer " + session.accessToken + }; + + return { headers }; +} + +function apiRequestOptionsWithDataHeader(session: Session, hostedUrl: string): HeadersInit { + const headers = { + ...apiRequestOptions(session, hostedUrl).headers, + "content-type": "application/json" + }; + + return headers; +} + +export function apiRequestOptionsWithBody(session: Session, method: RequestMethod, body: BodyInit, hostedUrl: string) + : RequestInit { + const request = { + body: JSON.stringify(body), + headers: apiRequestOptionsWithDataHeader(session, hostedUrl), + method: method + }; + + return request; +} + +export default { apiRequestOptions, apiRequestOptionsWithBody }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/requestMethod.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/requestMethod.ts new file mode 100644 index 000000000..9f0c1eba4 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/api/requestMethod.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export enum RequestMethod { + DELETE = "DELETE", + PATCH = "PATCH", + POST = "POST", + PUT = "PUT" +} + +export default RequestMethod; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerCall/commonControllerCall.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerCall/commonControllerCall.ts new file mode 100644 index 000000000..ec0094f90 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerCall/commonControllerCall.ts @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ControllerCallReturn, OrgSessionControllerCallParam +} from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import { + getControllerCallApiRequestOptions, getControllerCallApiRequestOptionsForSwitchCallWithParam +} from "./controllerCallApiRequestOptions"; + +/** + * call POST `getManagementAPIServerBaseUrl()/o//scim2/Users` create the user + * + * @param session - session object + * @param param - data object that need to be sent to server + * + * @returns created user details, if not created returns `null` + */ +export async function commonControllerCall(api: string, session: Session | null, param?: any + , switchCall = false): Promise { + try { + + let header: RequestInit; + + if (switchCall) { + if (param) { + const orgSessionControllerCallParam: OrgSessionControllerCallParam + = param as OrgSessionControllerCallParam; + + header = getControllerCallApiRequestOptionsForSwitchCallWithParam( + orgSessionControllerCallParam.subOrgId, orgSessionControllerCallParam.accessToken); + } else { + throw Error; + } + } else { + + header = getControllerCallApiRequestOptions(session, param); + } + + const res = await fetch(api, header); + const data = await res.json(); + + return data; + } catch (err) { + + return null; + } +} + +export default commonControllerCall; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerCall/controllerCallApiRequestOptions.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerCall/controllerCallApiRequestOptions.ts new file mode 100644 index 000000000..5f0742ecd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerCall/controllerCallApiRequestOptions.ts @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallParam } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Session } from "next-auth"; +import RequestMethod from "../api/requestMethod"; + +function getControllerCallApiBody(session: Session | null, param?: ControllerCallParam) { + const body = { + orgId: session ? session.orgId : null, + param: param ? param : null, + session: session + }; + + return body; +} + +function getControllerCallApiRequestOptions(session: Session | null, param?: ControllerCallParam): RequestInit { + const request = { + body: JSON.stringify(getControllerCallApiBody(session, param)), + method: RequestMethod.POST + }; + + return request; +} + +function getControllerCallApiRequestBodyForSwitchCall(subOrgId: string, param: string) { + const body = { + param: param, + subOrgId: subOrgId + }; + + return body; +} + +function getControllerCallApiRequestOptionsForSwitchCallWithParam(subOrgId: string, param: string): RequestInit { + const request = { + body: JSON.stringify(getControllerCallApiRequestBodyForSwitchCall(subOrgId, param)), + method: RequestMethod.POST + }; + + return request; +} + +export { + getControllerCallApiRequestOptions, getControllerCallApiRequestOptionsForSwitchCallWithParam +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerDecode/commonControllerDecode.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerDecode/commonControllerDecode.ts new file mode 100644 index 000000000..e57f74bfb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/lib/apiUtil/controllerDecode/commonControllerDecode.ts @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallReturn, ControllerDecodeReturn } from + "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export async function commonControllerDecode( + callFunction: () => Promise, + errorReturnValue: boolean | null): Promise { + + try { + const res: ControllerCallReturn | ControllerCallReturn[] | null = await callFunction(); + + if (!res) { + + return errorReturnValue; + } + + if ("error" in res || "traceId" in res) { + + return errorReturnValue; + } + + return res; + } catch (err) { + + return errorReturnValue; + } +} + +export default commonControllerDecode; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/types/next-auth.d.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/types/next-auth.d.ts new file mode 100644 index 000000000..bcee2940e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/src/types/next-auth.d.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import "next-auth"; +import { JWT } from "next-auth/jwt"; + +declare module "next-auth" { + interface Session { + error: boolean, + expires: boolean, + accessToken?: string, + adminAccessToken?: string, + idToken?: JWT, + scope?: string, + refreshToken?: string, + userId?: string, + user?: User | null, + orgId?: string, + orgName?: string, + orginalIdToken?: string, + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-api-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/jest.config.ts new file mode 100644 index 000000000..5e646cda1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-util-data-access-common-models-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/shared/util/data-access-common-models-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/index.ts new file mode 100644 index 000000000..a925f8dfb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/index.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/model/user/user"; +export * from "./lib/model/user/internalUser"; +export * from "./lib/model/user/sendUser"; +export * from "./lib/model/user/sendEditUser"; +export * from "./lib/model/user/userUtils"; +export * from "./lib/model/user/userList"; +export * from "./lib/model/group/group"; +export * from "./lib/model/group/meta"; +export * from "./lib/model/group/internalGroup"; +export * from "./lib/model/group/groupUtils"; +export * from "./lib/model/group/groupList"; +export * from "./lib/model/group/sendGroup"; +export * from "./lib/model/group/addedGroup"; +export * from "./lib/model/group/sendEditGroupName"; +export * from "./lib/model/group/sendEditGroupMembers"; +export * from "./lib/model/group/updatedGroup"; +export * from "./lib/model/sideNav/sideNavList"; +export * from "./lib/model/sideNav/sideNavItem"; +export * from "./lib/model/controllerParam/controllerCallParam"; +export * from "./lib/model/controllerReturn/controllerCallReturn"; +export * from "./lib/model/controllerReturn/controllerDecodeReturn"; +export * from "./lib/model/patchBody/patchBody"; +export * from "./lib/model/patchBody/patchOperation"; +export * from "./lib/model/orgSession/orgSession"; +export * from "./lib/model/orgSession/orgSessionControllerParam"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerParam/controllerCallParam.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerParam/controllerCallParam.ts new file mode 100644 index 000000000..68cdf1f77 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerParam/controllerCallParam.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ControllerCallParam { + key? : string +} + +export default ControllerCallParam; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerReturn/controllerCallReturn.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerReturn/controllerCallReturn.ts new file mode 100644 index 000000000..62dddd088 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerReturn/controllerCallReturn.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export class ControllerCallReturn { + error?: string; + traceId?: string; + msg?: string; +} + +export default ControllerCallReturn; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerReturn/controllerDecodeReturn.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerReturn/controllerDecodeReturn.ts new file mode 100644 index 000000000..cbe45deac --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/controllerReturn/controllerDecodeReturn.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallReturn from "./controllerCallReturn"; + +export type ControllerDecodeReturn = ControllerCallReturn + +export default ControllerDecodeReturn; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/addedGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/addedGroup.ts new file mode 100644 index 000000000..d496240d1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/addedGroup.ts @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; +import ControllerDecodeReturn from "../controllerReturn/controllerDecodeReturn"; + +interface Meta { + created: string; + location: string; + lastModified: string; + resourceType: string; +} + +interface Member { + display: string; + value: string; +} + +export interface AddedGroup extends ControllerCallReturn, ControllerDecodeReturn { + displayName: string; + meta: Meta; + schemas: string[]; + members: Member[]; + id: string; +} + +export default AddedGroup; + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/group.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/group.ts new file mode 100644 index 000000000..344177008 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/group.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Meta from "./meta"; +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; + +export interface Group extends ControllerCallReturn { + displayName: string; + meta: Meta; + id: string; +} + +export default Group; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/groupList.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/groupList.ts new file mode 100644 index 000000000..a1da3da91 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/groupList.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Group from "./group"; +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; + +export interface GroupList extends ControllerCallReturn { + totalResults: number; + startIndex: number; + itemsPerPage: number; + schemas: string[]; + Resources: Group[]; +} + +export default GroupList; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/groupUtils.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/groupUtils.ts new file mode 100644 index 000000000..88e19510b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/groupUtils.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Group from "./group"; +import InternalGroup from "./internalGroup"; + + +/** + * + * @param group - (group object return from the IS) + * + * @returns group object that can be view in front end side + */ +export function decodeGroup(group: Group): InternalGroup { + + const displayName = group.displayName?.split("/")?.[1] || "-"; + const userstore = group.displayName?.split("/")?.[0] || "-"; + + + return { + "displayName": displayName, + "id": group.id ? group.id : "-", + "userStore": userstore + }; +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/internalGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/internalGroup.ts new file mode 100644 index 000000000..ee394040e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/internalGroup.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; +import ControllerDecodeReturn from "../controllerReturn/controllerDecodeReturn"; + +export interface InternalGroup extends ControllerCallReturn, ControllerDecodeReturn { + displayName: string, + userStore: string, + id: string +} + +export default InternalGroup; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/meta.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/meta.ts new file mode 100644 index 000000000..914cfde9f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/meta.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface Meta { + created: string; + location: string; + lastModified: string; +} + +export default Meta; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendEditGroupMembers.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendEditGroupMembers.ts new file mode 100644 index 000000000..a5a471b40 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendEditGroupMembers.ts @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Member } from "./sendGroup"; +import ControllerCallParam from "../controllerParam/controllerCallParam"; + +interface Operation { + op: string, + value : sendMemberList, +} + +export interface sendMemberList { + members: Member[] +} + +export interface SendEditGroupMembers extends ControllerCallParam { + Operations: [Operation], + schemas: [string] +} + +export default SendEditGroupMembers; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendEditGroupName.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendEditGroupName.ts new file mode 100644 index 000000000..d5de5d4a7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendEditGroupName.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallParam from "../controllerParam/controllerCallParam"; + +interface Operation { + op: string, + path: string, + value : string +} + +export interface SendEditGroupName extends ControllerCallParam { + Operations: [Operation], + schemas: [string] +} + +export default SendEditGroupName; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendGroup.ts new file mode 100644 index 000000000..7d0ebf007 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/sendGroup.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallParam from "../controllerParam/controllerCallParam"; + +export interface Member { + display: string; + value: string; +} + +export interface SendGroup extends ControllerCallParam{ + displayName: string; + members: Member[]; + schemas: string[]; +} + +export default SendGroup; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/updatedGroup.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/updatedGroup.ts new file mode 100644 index 000000000..96dea13fb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/group/updatedGroup.ts @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; + +interface Meta { + created: string; + location: string; + lastModified: string; + } + + interface Member { + display: string; + value: string; + $ref: string; + } + +export interface UpdatedGroup extends ControllerCallReturn{ + displayName: string; + meta: Meta; + schemas: string[]; + members: Member[]; + id: string; + } + + +export default UpdatedGroup; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/orgSession/orgSession.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/orgSession/orgSession.ts new file mode 100644 index 000000000..711fcb69c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/orgSession/orgSession.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { JWT } from "next-auth/jwt"; +import { ControllerCallReturn } from "../controllerReturn/controllerCallReturn"; +import { ControllerDecodeReturn } from "../controllerReturn/controllerDecodeReturn"; + +export interface OrgSession extends ControllerCallReturn, ControllerDecodeReturn { + access_token?: string + scope?: string, + id_token?: JWT, + refresh_token?: string, + token_type?: string, + expires_in: number +} + +export default OrgSession; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/orgSession/orgSessionControllerParam.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/orgSession/orgSessionControllerParam.ts new file mode 100644 index 000000000..120c8b29f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/orgSession/orgSessionControllerParam.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ControllerCallParam } from "../controllerParam/controllerCallParam"; + +export interface OrgSessionControllerCallParam extends ControllerCallParam { + accessToken: string, + subOrgId: string +} + +export default OrgSessionControllerCallParam; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/patchBody/patchBody.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/patchBody/patchBody.ts new file mode 100644 index 000000000..30cf97272 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/patchBody/patchBody.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import PatchOperation from "./patchOperation"; + +export interface PatchBody { + Operations: PatchOperation[], + schemas?: string[] +} + +export default PatchBody; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/patchBody/patchOperation.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/patchBody/patchOperation.ts new file mode 100644 index 000000000..9f3eee308 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/patchBody/patchOperation.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface PatchOperation { + operation?: string, + op?: string, + path?: string, + value?: { + users?: UserValue [] + } | any +} + +interface UserValue { + value: string +} + +export default PatchOperation; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/sideNav/sideNavItem.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/sideNav/sideNavItem.ts new file mode 100644 index 000000000..e59fb4c34 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/sideNav/sideNavItem.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface SideNavItem { + title: string, + eventKey: string, + icon?: string, + type: string, + hideBasedOnScope?: boolean, + items?: SideNavItem[], + scopes? : string[], + new? : boolean +} + +export default SideNavItem; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/sideNav/sideNavList.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/sideNav/sideNavList.ts new file mode 100644 index 000000000..f221c06c2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/sideNav/sideNavList.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import SideNavItem from "./sideNavItem"; + +export interface SideNavList { + items: SideNavItem[], +} + +export default SideNavList; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/internalUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/internalUser.ts new file mode 100644 index 000000000..4887685eb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/internalUser.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; +import ControllerDecodeReturn from "../controllerReturn/controllerDecodeReturn"; + +export interface InternalUser extends ControllerCallReturn, ControllerDecodeReturn { + email: string | undefined, + familyName: string, + firstName: string, + id: string, + username: string +} + +export default InternalUser; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/sendEditUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/sendEditUser.ts new file mode 100644 index 000000000..e91bf851a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/sendEditUser.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Email } from "./sendUser"; +import { Name } from "./user"; +import ControllerCallParam from "../controllerParam/controllerCallParam"; + +interface Operation { + op: string, + value : { + emails : [Email], + name : Name, + userName : string, + } +} + +export interface SendEditUser extends ControllerCallParam { + Operations: [Operation], + schemas: [string] +} + +export default SendEditUser; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/sendUser.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/sendUser.ts new file mode 100644 index 000000000..15e359180 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/sendUser.ts @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Name } from "./user"; +import ControllerCallParam from "../controllerParam/controllerCallParam"; + +export interface Email { + primary: boolean, + value: string +} + +interface UrnSchema { + askPassword : boolean +} + +export interface SendUser extends ControllerCallParam{ + emails: [Email], + name : Name, + "urn:scim:wso2:schema"? : UrnSchema, + "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"? : UrnSchema, + userName : string, + schemas? : [], + password? : string +} + +export default SendUser; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/user.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/user.ts new file mode 100644 index 000000000..277b02e28 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/user.ts @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; +import ControllerDecodeReturn from "../controllerReturn/controllerDecodeReturn"; + +export type Name = { + givenName: string, + familyName: string +} + +export interface User extends ControllerCallReturn, ControllerDecodeReturn { + id: string | undefined, + name: Name, + emails: string[] | undefined, + userName: string | undefined, + [key: string]: unknown +} + +export default User; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/userList.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/userList.ts new file mode 100644 index 000000000..dec25bfea --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/userList.ts @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import User from "./user"; +import ControllerCallReturn from "../controllerReturn/controllerCallReturn"; + +export interface UserList extends ControllerCallReturn { + Resources?: User[] + itemsPerPage: number, + schemas: string[], + startIndex:number, + totalResults: number +} + +export default UserList; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/userUtils.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/userUtils.ts new file mode 100644 index 000000000..5e048aead --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/src/lib/model/user/userUtils.ts @@ -0,0 +1,82 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import InternalUser from "./internalUser"; +import User from "./user"; + +/** + * + * @param user - (user object return from the IS) + * + * @returns user object that can be view in front end side + */ +export function decodeUser(user: User): InternalUser { + + return { + "email": user.emails ? user.emails[0] : "-", + "familyName": user.name ? (user.name.familyName ? user.name.familyName : "-") : "-", + "firstName": user.name ? (user.name.givenName ? user.name.givenName : "-") : "-", + "id": user.id ? user.id : "-", + "username": user.userName ? getUsername(user.userName) : "-" + }; +} + +/** + * + * @param email - email + * + * @returns set email. + */ +export function setEmail(email: string) { + const regex = /^DEFAULT\//g; + + email = email.replace(regex, ""); + + return email; +} + +/** + * + * @param userName - user name + * + * @returns set username. + */ +export function setUsername(userName: string) { + + const userStore = getConfig().BusinessAdminAppConfig.ManagementAPIConfig.UserStore; + + if(userStore.trim()===""){ + return userName; + } else { + return `${userStore}/${userName}`; + } +} + +/** + * + * @param userName - user name + * + * @returns get username. If the IS is Asgardeo DEFAULT/ is removed from the username else returns the original username + */ +export function getUsername(userName: string) { + + return userName; +} + +export default { decodeUser, setUsername, setEmail }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/data-access/data-access-common-models-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/404.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/404.svg new file mode 100644 index 000000000..55def28c0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/500.svg b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/500.svg new file mode 100644 index 000000000..eb5f54273 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/500.svg @@ -0,0 +1 @@ +server down \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/logo.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/logo.png new file mode 100644 index 000000000..56702a331 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/logo.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/pet_care_logo.png b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/pet_care_logo.png new file mode 100644 index 000000000..5397369c2 Binary files /dev/null and b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-assets/src/lib/images/pet_care_logo.png differ diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/index.ts new file mode 100644 index 000000000..90b8b1a1c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/index.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/components/customHtmlHeading/customHtmlHeading"; +export * from "./lib/components/formField/formField"; +export * from "./lib/components/formButtonToolbar/formButtonToolbar"; +export * from "./lib/components/modelHeaderComponent/modelHeaderComponent"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/customHtmlHeading/customHtmlHeading.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/customHtmlHeading/customHtmlHeading.tsx new file mode 100644 index 000000000..a302b7897 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/customHtmlHeading/customHtmlHeading.tsx @@ -0,0 +1,64 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CustomHtmlHeadingProps } from "../../models/customHtmlHeading/customHtmlHeadingProps"; + +/** + * + * @param props `CustomHtmlHeadingProps` + * + * @returns Custom Html Heading + */ +export function CustomHtmlHeading(props: CustomHtmlHeadingProps) { + + const { content, headingType, fontWeight } = props; + + const style: Record = { + "fontWeight" : fontWeight + }; + + switch (headingType) { + case "h1": + return

{ content }

; + + case "h2": + return

{ content }

; + + case "h3": + return

{ content }

; + + case "h4": + return

{ content }

; + + case "h5": + return
{ content }
; + + case "h6": + return
{ content }
; + + default: + return; + } +} + +CustomHtmlHeading.defaultProps = { + fontWeight: "bold" +}; + + +export default CustomHtmlHeading; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formButtonToolbar/formButtonToolbar.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formButtonToolbar/formButtonToolbar.module.css new file mode 100644 index 000000000..1185ab39d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formButtonToolbar/formButtonToolbar.module.css @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.addUserButton{ + width: 25%; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formButtonToolbar/formButtonToolbar.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formButtonToolbar/formButtonToolbar.tsx new file mode 100644 index 000000000..843771083 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formButtonToolbar/formButtonToolbar.tsx @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Button, ButtonToolbar } from "rsuite"; +import FormSuite from "rsuite/Form"; +import styles from "./formButtonToolbar.module.css"; +import { FormButtonToolbarProps } from "../../models/formButtonToolbar/formButtonToolbarProps"; + +/** + * + * @param props `FormButtonToolbarProps` + * + * @returns Button toolbar for the forms + */ +export function FormButtonToolbar(props: FormButtonToolbarProps) { + + const { submitButtonText, cancelButtonText, needCancel, onCancel, submitButtonDisabled } = props; + + return ( + + + + + + { + needCancel + ? () + : null + } + + + + + ); +} + +FormButtonToolbar.defaultProps = { + submitButtonText: "Submit", + cancelButtonText: "Cancel", + needCancel: true +}; + + +export default FormButtonToolbar; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formField/formField.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formField/formField.tsx new file mode 100644 index 000000000..2d9d3609d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/formField/formField.tsx @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { HelperTextComponent } from "@pet-management-webapp/shared/ui/ui-components"; +import React from "react"; +import { Field } from "react-final-form"; +import FormSuite from "rsuite/Form"; +import { FormFieldProps } from "../../models/formField/formFieldProps"; + +export function FormField(props: FormFieldProps) { + + const { name, label, helperText, needErrorMessage, children, subscription } = props; + + return ( + ( + + { label } + + { React.cloneElement(children, { ...input }) } + + { + helperText + ? + : null + } + + { + needErrorMessage && meta.error && meta.touched && ( + { meta.error } + ) + } + + + ) } + subscription={ subscription } + /> + ); +} + +export default FormField; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/modelHeaderComponent/modelHeaderComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/modelHeaderComponent/modelHeaderComponent.module.css new file mode 100644 index 000000000..1185ab39d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/modelHeaderComponent/modelHeaderComponent.module.css @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.addUserButton{ + width: 25%; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/modelHeaderComponent/modelHeaderComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/modelHeaderComponent/modelHeaderComponent.tsx new file mode 100644 index 000000000..731aace74 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/components/modelHeaderComponent/modelHeaderComponent.tsx @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Modal } from "rsuite"; +import { ModelHeaderComponentProps } from "../../models/modelHeaderComponent/modelHeaderComponentProps"; + +/** + * Always use this as a child of `` + * + * @param props `ModelHeaderComponentProps` + * + * @returns header component for the `Model` + */ +export function ModelHeaderComponent(props: ModelHeaderComponentProps) { + + const { title, subTitle } = props; + + return ( + <> +

{ title }

+ { subTitle + ?

{ subTitle }

+ : null + } + + + ); +} + +export default ModelHeaderComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/customHtmlHeading/customHtmlHeadingProps.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/customHtmlHeading/customHtmlHeadingProps.ts new file mode 100644 index 000000000..08ec451c5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/customHtmlHeading/customHtmlHeadingProps.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface CustomHtmlHeadingProps { + content : string, + headingType : string, + fontWeight : string +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/formButtonToolbar/formButtonToolbarProps.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/formButtonToolbar/formButtonToolbarProps.ts new file mode 100644 index 000000000..b8471b13d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/formButtonToolbar/formButtonToolbarProps.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface FormButtonToolbarProps { + submitButtonText? : string, + cancelButtonText? : string, + needCancel: boolean, + onCancel?: ()=>void, + submitButtonDisabled: boolean, +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/formField/formFieldProps.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/formField/formFieldProps.ts new file mode 100644 index 000000000..340540053 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/formField/formFieldProps.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface FormFieldProps { + name: string, + label: string, + children: JSX.Element, + helperText?: string, + needErrorMessage?: boolean, + subscription?: any +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/modelHeaderComponent/modelHeaderComponentProps.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/modelHeaderComponent/modelHeaderComponentProps.ts new file mode 100644 index 000000000..fe566f823 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/src/lib/models/modelHeaderComponent/modelHeaderComponentProps.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface ModelHeaderComponentProps { + title : string, + subTitle? : string +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-basic-components/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/jest.config.ts new file mode 100644 index 000000000..ee57ad5b6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-ui-components", + preset: "../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../coverage/libs/shared/ui/ui-components" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/index.ts new file mode 100644 index 000000000..31343fb31 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/index.ts @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/components/sharedLogoComponent/sharedLogoComponent"; +export * from "./lib/components/dialogComponent/dialogComponent"; +export * from "./lib/components/accordianItemHeaderComponent/accordianItemHeaderComponent"; +export * from "./lib/components/emptySettingsComponent/emptySettingsComponent"; +export * from "./lib/components/jsonDisplayComponent/jsonDisplayComponent"; +export * from "./lib/components/settingsTitleComponent/settingsTitleComponent"; +export * from "./lib/components/helperTextComponent/helperTextComponent"; +export * from "./lib/components/custom404Component/custom404Component"; +export * from "./lib/components/custom500Component/custom500Component"; +export * from "./lib/components/signoutComponent/signoutComponent"; +export * from "./lib/components/homeComponent/homeComponent"; +export * from "./lib/components/footerComponent/footerComponent"; +export * from "./lib/components/indexHomeComponent/indexHomeComponent"; +export * from "./lib/components/signinRedirectComponent/signinRedirectComponent"; +export * from "./lib/components/moveOrganizationComponent/moveOrganizationComponent"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/accordianItemHeaderComponent/accordianItemHeaderComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/accordianItemHeaderComponent/accordianItemHeaderComponent.tsx new file mode 100644 index 000000000..bfad4e2a2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/accordianItemHeaderComponent/accordianItemHeaderComponent.tsx @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Image from "next/image"; +import { Avatar, Stack } from "rsuite"; +import { TypeAttributes } from "rsuite/esm/@types/common"; +import { AccordianItemHeaderComponentProps } from + "../../models/accordianItemHeaderComponent/accordianItemHeaderComponent"; + +/** + * + * @param prop - `title`, `description`, `imageUrl` + * + * @returns header componet for items in an accordian + */ +export function AccordianItemHeaderComponent(prop: AccordianItemHeaderComponentProps) { + + const { title, description, imageSrc, avatarSize = "lg" } = prop; + + return ( + + + + { imageSrc + ?(idp image) + : null + } + + +
{ title }
+

{ description ? description : "" }

+
+
+ +
+ ); +} + +export default AccordianItemHeaderComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom404Component/custom404Component.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom404Component/custom404Component.module.css new file mode 100644 index 000000000..a38d46316 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom404Component/custom404Component.module.css @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + .errorMainContent { + height: 100vh; + display: flex; + align-items: center; + justify-content: center; +} + +.p { + text-align: center; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom404Component/custom404Component.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom404Component/custom404Component.tsx new file mode 100644 index 000000000..9293eb8ff --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom404Component/custom404Component.tsx @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Image from "next/image"; +import { useRouter } from "next/router"; +import React from "react"; +import { Button, Stack } from "rsuite"; +import styles from "./custom404Component.module.css"; +import errorImage from "../../../../../ui-assets/src/lib/images/404.svg"; + +export function Custom404Component() { + const router = useRouter(); + const goBack = () => router.back(); + + return ( + + + 404 image + + + +

The page your searching seems to be missing. +
+ You can go back, or contact our Customer Service team if you need any help +

+ + + +
+ +
+ ); +} + + +export default Custom404Component; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom500Component/custom500Component.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom500Component/custom500Component.module.css new file mode 100644 index 000000000..a38d46316 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom500Component/custom500Component.module.css @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + .errorMainContent { + height: 100vh; + display: flex; + align-items: center; + justify-content: center; +} + +.p { + text-align: center; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom500Component/custom500Component.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom500Component/custom500Component.tsx new file mode 100644 index 000000000..a8c316098 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/custom500Component/custom500Component.tsx @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Image from "next/image"; +import React from "react"; +import { Button, Stack } from "rsuite"; +import styles from "./custom500Component.module.css"; +import errorImage from "../../../../../ui-assets/src/lib/images/500.svg"; +import { Custom500ComponentProps } from "../../models/custom500Component/custom500Component"; + +export function Custom500Component(prop : Custom500ComponentProps) { + + const { goBack } = prop; + + return ( + + + 404 image + + + +

It looks like you have been inactive for a long time. +
+ When you click on Go back, we will try to recover the session if it exists. +
+ If you don't have an active session, you will be redirected to the login page. +

+ +
+ +
+ ); +} + + +export default Custom500Component; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/dialogComponent/dialogComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/dialogComponent/dialogComponent.tsx new file mode 100644 index 000000000..75c005c97 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/dialogComponent/dialogComponent.tsx @@ -0,0 +1,112 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Notification, Toaster } from "rsuite"; +import { DialogComponentProps } from "../../models/dialogComponent/dialogComponent"; + +/** + * + * @param prop - type (error, info, success ), header - title text, body - body text + * + * @returns A side dialog to show notifications + */ +function DialogComponent(prop: DialogComponentProps) { + + const { type, header, body } = prop; + + return ( + + { body } + + ); +} + +/** + * + * @param toaster - `useToaster()` get the toaster + * @param type - `error`, `info`, `success` or `warning` + * @param header - header text + * @param body - body text + * + * @returns - A notification dialog baed on the `type` + */ +async function showDialog(toaster: Toaster, + type: "error" | "info" | "success" | "warning", + header: string, + body?: string) { + const toasteKey = toaster.push(, { + placement: "bottomStart" + }); + + if (toasteKey) { + const key: string = toasteKey.toString(); + + setTimeout(() => toaster.remove(key), 2500); + } +} + +/** + * + * @param toaster - `useToaster()` get the toaster + * @param header - header text + * @param body - body text + * + * @returns - A error type notification dialog + */ +export function errorTypeDialog(toaster: Toaster, header: string, body?: string) { + showDialog(toaster, "error", header, body); +} + +/** + * + * @param toaster - `useToaster()` get the toaster + * @param header - header text + * @param body - body text + * + * @returns - A information type notification dialog + */ +export function infoTypeDialog(toaster: Toaster, header: string, body?: string) { + showDialog(toaster, "info", header, body); +} + +/** + * + * @param toaster - `useToaster()` get the toaster + * @param header - header text + * @param body - body text + * + * @returns - A success type notification dialog + */ +export function successTypeDialog(toaster: Toaster, header: string, body?: string) { + showDialog(toaster, "success", header, body); +} + +/** + * + * @param toaster - `useToaster()` get the toaster + * @param header - header text + * @param body - body text + * + * @returns - A warning type notification dialog + */ +export function warningTypeDialog(toaster: Toaster, header: string, body?: string) { + showDialog(toaster, "warning", header, body); +} + +export default { errorTypeDialog, infoTypeDialog, successTypeDialog, warningTypeDialog }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/emptySettingsComponent/emptySettingsComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/emptySettingsComponent/emptySettingsComponent.tsx new file mode 100644 index 000000000..9e1a3ded0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/emptySettingsComponent/emptySettingsComponent.tsx @@ -0,0 +1,62 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Button, FlexboxGrid, Stack } from "rsuite"; +import { EmptySettingsComponentProps } from "../../models/emptySettingsComponent/emptySettingsComponent"; + +/** + * + * @param prop - onAddIdentityProviderClick (function to open add idp modal) + * + * @returns The componet to show when there is no idp's. + */ +export function EmptySettingsComponent(prop: EmptySettingsComponentProps) { + + const { bodyString, buttonString, icon, onAddButtonClick } = prop; + + return ( + + + { icon } +

+ { bodyString } +

+ { + onAddButtonClick + ? () + : null + } + +
+
+ ); + +} + + +export default EmptySettingsComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/footerComponent/footerComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/footerComponent/footerComponent.module.css new file mode 100644 index 000000000..85c0f715d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/footerComponent/footerComponent.module.css @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.footer { + padding: 2rem 0; + border-top: 1px solid #eaeaea; + justify-content: center; + align-items: center; + width: 100%; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/footerComponent/footerComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/footerComponent/footerComponent.tsx new file mode 100644 index 000000000..e91f46c11 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/footerComponent/footerComponent.tsx @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styles from "./footerComponent.module.css"; + +export function FooterComponent() { + return ( + + ); +} + + +export default FooterComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/helperTextComponent/helperTextComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/helperTextComponent/helperTextComponent.module.css new file mode 100644 index 000000000..f2b3d8ad3 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/helperTextComponent/helperTextComponent.module.css @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.stack { + margin-top: 1px; +} + +.icon { + margin-left: 1px; + margin-right: 5px +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/helperTextComponent/helperTextComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/helperTextComponent/helperTextComponent.tsx new file mode 100644 index 000000000..2b6006f6d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/helperTextComponent/helperTextComponent.tsx @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import InfoOutlineIcon from "@rsuite/icons/InfoOutline"; +import { Form, Stack } from "rsuite"; +import styles from "./helperTextComponent.module.css"; +import { HelperTextComponentProps } from "../../models/helperTextComponent/helperTextComponent"; + +export function HelperTextComponent(prop: HelperTextComponentProps) { + const { text } = prop; + + return ( + + + { text } + + ); +} + +export default HelperTextComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponent.module.css new file mode 100644 index 000000000..f493d6ea1 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponent.module.css @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.mainDiv { + display: flex; + flex-direction: row; + width: 100vw; + overflow-x: hidden; + background-color: rgb(228, 228, 228); +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponent.tsx new file mode 100644 index 000000000..ad43d2e68 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponent.tsx @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import styles from "./homeComponent.module.css"; +import { HomeComponentProps } from "../../models/homeComponent/homeComponent"; +import MainPanelComponent from "../mainPanelComponent/mainPanelComponent"; +import SidenavComponent from "../sidenavComponent/sidenavComponent"; + +export function HomeComponent(prop: HomeComponentProps) { + + const { scope, sideNavData, activeKeySideNav, activeKeySideNavSelect, setSignOutModalOpen, children, logoComponent } + = prop; + + return ( +
+ + + + + { children } + + +
+ ); +} + +export default HomeComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForAdmin.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForAdmin.tsx new file mode 100644 index 000000000..4dcc5c26f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForAdmin.tsx @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import styles from "./homeComponent.module.css"; +import { HomeComponentProps } from "../../models/homeComponent/homeComponent"; +import MainPanelComponent from "../mainPanelComponent/mainPanelComponent"; +import SidenavComponent from "../sidenavComponent/sidenavComponent"; + +export function HomeComponentForAdmin(prop: HomeComponentProps) { + + const { scope, sideNavData, activeKeySideNav, activeKeySideNavSelect, setSignOutModalOpen, children, logoComponent } + = prop; + + return ( +
+ + + + { children } + +
+ ); +} + +export default HomeComponentForAdmin; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForDoctor.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForDoctor.tsx new file mode 100644 index 000000000..8797604f6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForDoctor.tsx @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import styles from "./homeComponent.module.css"; +import { HomeComponentProps } from "../../models/homeComponent/homeComponent"; +import MainPanelComponent from "../mainPanelComponent/mainPanelComponent"; +import SidenavComponent from "../sidenavComponent/sidenavComponent"; + +export function HomeComponentForDoctor(prop: HomeComponentProps) { + + const { scope, sideNavData, activeKeySideNav, activeKeySideNavSelect, setSignOutModalOpen, children, logoComponent } + = prop; + + return ( +
+ + + + { children } + +
+ ); +} + +export default HomeComponentForDoctor; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForPetOwner.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForPetOwner.tsx new file mode 100644 index 000000000..5cea4a046 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/homeComponent/homeComponentForPetOwner.tsx @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import styles from "./homeComponent.module.css"; +import { HomeComponentProps } from "../../models/homeComponent/homeComponent"; +import MainPanelComponent from "../mainPanelComponent/mainPanelComponent"; +import SidenavComponent from "../sidenavComponent/sidenavComponent"; + +export function HomeComponentForPetOwner(prop: HomeComponentProps) { + + const { scope, sideNavData, activeKeySideNav, activeKeySideNavSelect, setSignOutModalOpen, children, logoComponent } + = prop; + + return ( +
+ + + + { children } + +
+ ); +} + +export default HomeComponentForPetOwner; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/indexHomeComponent/indexHomeComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/indexHomeComponent/indexHomeComponent.module.css new file mode 100644 index 000000000..ce088a564 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/indexHomeComponent/indexHomeComponent.module.css @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.main { + min-height: 100vh; + flex: 1; + display: flex; +} + +.homeImageDiv { + width: 65vw; + height: 100vh; + opacity: 0.8; + display: flex; + overflow: hidden; + flex-wrap: nowrap; +} + +.homeImage { + width: 100%; + height: 100%; + object-fit: cover; + object-position: right; + } + +.signInDiv { + background-color: #0071f309; + width: 25vw; + padding: 2rem 2rem; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + flex-wrap: wrap; + flex: 1; +} + +.signInDiv hr { + margin: 40px; + align-self: stretch; +} + +.signInDivButton { + width: 50%; + height: 50px; + font-size: 18px; +} + +.buttonTag { + position: relative; + margin-bottom: 16px; + font-size: 14px; +} + +.loader { + display: flex; + align-items: center; + justify-content: center; + height: 100vh; + width: 100vw; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/indexHomeComponent/indexHomeComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/indexHomeComponent/indexHomeComponent.tsx new file mode 100644 index 000000000..a62210b99 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/indexHomeComponent/indexHomeComponent.tsx @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Image from "next/image"; +import { useState } from "react"; +import { ThreeDots } from "react-loader-spinner"; +import { Button } from "rsuite"; +import styles from "./indexHomeComponent.module.css"; +import { IndexHomeComponentProps } from "../../models/indexHomeComponent/indexHomeComponent"; + +/** + * First page component + * + * @param prop - image, tagText, signinOnClick + */ +export function IndexHomeComponent(prop: IndexHomeComponentProps) { + + const { logoComponent, image, tagText, signinOnClick } = prop; + const [ isLoading, setIsLoading ] = useState(true); + + return ( +
+ + { isLoading && ( +
+
+ +
+
) } + +
+ +
+ home image setIsLoading(false) }/> +
+
+ { logoComponent } + +
+ +

{ tagText }

+ + +
+ +
+ +
+ ); +} + +export default IndexHomeComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/jsonDisplayComponent/jsonDisplayComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/jsonDisplayComponent/jsonDisplayComponent.module.css new file mode 100644 index 000000000..ec7b31de2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/jsonDisplayComponent/jsonDisplayComponent.module.css @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.jsonDisplay { + max-width: 50vw; +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/jsonDisplayComponent/jsonDisplayComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/jsonDisplayComponent/jsonDisplayComponent.tsx new file mode 100644 index 000000000..51aac8d9f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/jsonDisplayComponent/jsonDisplayComponent.tsx @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import styles from "./jsonDisplayComponent.module.css"; +import { JsonDisplayComponentProps } from "../../models/jsonDisplayComponent/jsonDisplayComponent"; + +export function JsonDisplayComponent(prop: JsonDisplayComponentProps) { + const { jsonObject } = prop; + + return ( +
 { JSON.stringify(jsonObject, null, 2) }
+ ); +} + + +export default JsonDisplayComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/mainPanelComponent/mainPanelComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/mainPanelComponent/mainPanelComponent.module.css new file mode 100644 index 000000000..5d1b8e716 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/mainPanelComponent/mainPanelComponent.module.css @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.mainPanelDiv { + height: 100vh; + width: 100%; + padding: 3rem 5rem; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/mainPanelComponent/mainPanelComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/mainPanelComponent/mainPanelComponent.tsx new file mode 100644 index 000000000..be743fe5d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/mainPanelComponent/mainPanelComponent.tsx @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import styles from "./mainPanelComponent.module.css"; +import { MainPanelComponentProps } from "../../models/mainPanelComponent/mainPanelComponent"; + +export function MainPanelComponent(prop: MainPanelComponentProps) { + + const { children } = prop; + + return ( +
+ { children } +
+ ); +} + +export default MainPanelComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/moveOrganizationComponent/moveOrganizationComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/moveOrganizationComponent/moveOrganizationComponent.module.css new file mode 100644 index 000000000..8317dac08 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/moveOrganizationComponent/moveOrganizationComponent.module.css @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the License); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.moveOrgDiv { + align-items: center; + background-color: black; + color: whitesmoke; + display: flex; + height: 100vh; + justify-content: center +} + +.pFont{ + font-size: 2em +} + +.getStartedSectionComponentGetStartedTextDiv { + height: 80vh +} + +.getStartedSectionComponentGetStartedTextPanel{ + height: 100%; + display: flex; + justify-content: center; + align-items: center; + padding: 10px; +} + +.h2Wording { + color: #4F40EE; +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/moveOrganizationComponent/moveOrganizationComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/moveOrganizationComponent/moveOrganizationComponent.tsx new file mode 100644 index 000000000..90c531f2b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/moveOrganizationComponent/moveOrganizationComponent.tsx @@ -0,0 +1,47 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Loader, Panel, Stack } from "rsuite"; +import styles from "./moveOrganizationComponent.module.css"; + +/* eslint-disable-next-line */ +export interface MoveOrganizationComponentProps { + orgName: string +} + +export function MoveOrganizationComponent(prop: MoveOrganizationComponentProps) { + + const { orgName } = prop; + + return ( +
+ + + + + + + + + + +
+ ); +} + +export default MoveOrganizationComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/settingsTitleComponent/settingsTitleComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/settingsTitleComponent/settingsTitleComponent.tsx new file mode 100644 index 000000000..7a6b8f57d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/settingsTitleComponent/settingsTitleComponent.tsx @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Stack } from "rsuite"; +import { SettingsTitleComponentProps } from "../../models/settingsTitleComponent/settingsTitleComponent"; + +export function SettingsTitleComponent(prop: SettingsTitleComponentProps) { + const { title, subtitle, children } = prop; + + return ( + + +

{ title }

+

{ subtitle }

+
+ { children } +
+ + ); +} + +export default SettingsTitleComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sharedLogoComponent/sharedLogoComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sharedLogoComponent/sharedLogoComponent.module.css new file mode 100644 index 000000000..e2775f384 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sharedLogoComponent/sharedLogoComponent.module.css @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.nameTag { + position: relative; + font-size: 16px; +} + +.logoDiv { + display: flex; + align-items: center; + justify-content: center; + position: relative; + height: auto; + flex-direction: column; +} + +.logoDiv hr { + margin: 12px; + align-self: stretch; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sharedLogoComponent/sharedLogoComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sharedLogoComponent/sharedLogoComponent.tsx new file mode 100644 index 000000000..539dccbb7 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sharedLogoComponent/sharedLogoComponent.tsx @@ -0,0 +1,107 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import Image from "next/image"; +import styles from "./sharedLogoComponent.module.css"; +import { SharedLogoComponentProps, SharedLogoImageStyle, SharedLogoProps } from + "../../models/sharedLogoComponent/sharedLogoComponent"; + +/** + * + * @param prop - name (org name), imageSize `small` | `medium` | `large` | `x-large` + * + * @returns + */ +export function SharedLogoComponent(prop: SharedLogoComponentProps) { + + const { image, tagLine, name, imageSize, white } = prop; + + return ( +
+ +

{ tagLine }

+ { + name + ? ( + <> +
+
{ name }
+
+ + ) + : null + } +
+ ); +} + +/** + * + * @param prop - imageSize `small` | `medium` | `large` | `x-large` + * + * @returns Logo component + */ +function Logo(prop: SharedLogoProps) { + + const { image, imageSize, white } = prop; + + const getImageStyle = (size: string, white?: boolean) => { + + const imageStyle: SharedLogoImageStyle = { + "height": "auto" + }; + + switch (size) { + case "small": + imageStyle["width"] = "15vw"; + + break; + case "medium": + imageStyle["width"] = "350px"; + + break; + case "large": + imageStyle["width"] = "600px"; + + break; + case "x-large": + imageStyle["width"] = "600px"; + + break; + default: + break; + } + + + if (white) { + imageStyle["filter"] = "grayscale(100%) drop-shadow(0px 0px 0px white)"; + } + + return imageStyle; + }; + + return ( + 404 image + ); +} + +export default SharedLogoComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sidenavComponent/sidenavComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sidenavComponent/sidenavComponent.module.css new file mode 100644 index 000000000..d9d586d68 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sidenavComponent/sidenavComponent.module.css @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.sideNavDiv { + width: 20%; +} + +.sideNav { + height: 100%; + width: 18%; + position: fixed; +} + +.logoComponentDiv { + margin-bottom: 25px; + margin-top: 35px; +} + +.nextButtonDiv { + display: flex; + align-items: flex-end; + justify-content: center; + height: 100%; + padding-bottom: 2rem; +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sidenavComponent/sidenavComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sidenavComponent/sidenavComponent.tsx new file mode 100644 index 000000000..91f59a478 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/sidenavComponent/sidenavComponent.tsx @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SideNavItem, SideNavList } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { getIconFromString, hideBasedOnScopes } from "@pet-management-webapp/shared/util/util-front-end-util"; +import { Button, Nav, Sidenav, Stack, Tag } from "rsuite"; +import "rsuite/dist/rsuite.min.css"; +import styles from "./sidenavComponent.module.css"; +import { SidenavComponentProps } from "../../models/sidenavComponent/sidenavComponent"; + +export function SidenavComponent(prop: SidenavComponentProps) { + const { scope, sideNavData, activeKeySideNav, activeKeySideNavSelect, setSignOutModalOpen, logoComponent } = prop; + + const signOutOnClick = () => setSignOutModalOpen(true); + + const sideNavConfigList: SideNavList = sideNavData; + + return ( +
+ + +
+ { logoComponent } +
+
+ + + +
+ +
+
+
+ ); +} + +export default SidenavComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signinRedirectComponent/signinRedirectComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signinRedirectComponent/signinRedirectComponent.module.css new file mode 100644 index 000000000..2a825c376 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signinRedirectComponent/signinRedirectComponent.module.css @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.signinOuter { + display: flex; + align-items: center; + justify-content: center; + height: 100vh; + width: 100vw; + background-color: #0071f303; +} + +.signinInner { + height: 30vw; + width: 35vw; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + padding: 10px 0; + gap: 60px; + background-image: radial-gradient(rgba(198, 196, 196, 0.276), rgba(0,0,0,0), rgba(0,0,0,0)); +} \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signinRedirectComponent/signinRedirectComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signinRedirectComponent/signinRedirectComponent.tsx new file mode 100644 index 000000000..c7d9713da --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signinRedirectComponent/signinRedirectComponent.tsx @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import { Loader } from "rsuite"; +import styles from "./signinRedirectComponent.module.css"; +import { SigninRedirectComponentProps } from "../../models/signinRedirectComponent/signinRedirectComponent"; + +/** + * Sign in redirect component + * + * @param prop - loaderContent + */ +export function SigninRedirectComponent(prop: SigninRedirectComponentProps) { + + const { logoComponent, loaderContent } = prop; + + return ( +
+
+ {/* { logoComponent } */} + +
+
+ ); +} + +export default SigninRedirectComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signoutComponent/signoutComponent.module.css b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signoutComponent/signoutComponent.module.css new file mode 100644 index 000000000..d0246c74b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signoutComponent/signoutComponent.module.css @@ -0,0 +1,7 @@ +/* + * Replace this with your own classes + * + * e.g. + * .container { + * } +*/ \ No newline at end of file diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signoutComponent/signoutComponent.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signoutComponent/signoutComponent.tsx new file mode 100644 index 000000000..56929b39e --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/components/signoutComponent/signoutComponent.tsx @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE } from "@pet-management-webapp/shared/util/util-front-end-util"; +import React, { useState } from "react"; +import { Button, ButtonToolbar, Loader, Modal, Stack } from "rsuite"; +import { SignOutComponentProps } from "../../models/signoutComponent/signoutComponent"; + +export function SignOutComponent(prop: SignOutComponentProps) { + const { open, onClose, signOutCallback } = prop; + + const [ loadingDisplay, setLoadingDisplay ] = useState(LOADING_DISPLAY_NONE); + + const signOut = async () => { + + setLoadingDisplay(LOADING_DISPLAY_BLOCK); + + signOutCallback(); + }; + + return ( + + + + You are about to logout +
+
+
+ + +

Are you sure you want to logout, from your account ?

+ + + + + + + +
+
+ +
+ +
+
+ ); +} + +export default SignOutComponent; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/accordianItemHeaderComponent/accordianItemHeaderComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/accordianItemHeaderComponent/accordianItemHeaderComponent.ts new file mode 100644 index 000000000..1184eaf7b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/accordianItemHeaderComponent/accordianItemHeaderComponent.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface AccordianItemHeaderComponentProps { + title : string, + description : string, + imageSrc? : string, + avatarSize? : string +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/custom500Component/custom500Component.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/custom500Component/custom500Component.ts new file mode 100644 index 000000000..5631ee553 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/custom500Component/custom500Component.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { MouseEventHandler } from "react"; + +export interface Custom500ComponentProps { + goBack : MouseEventHandler + } + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/dialogComponent/dialogComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/dialogComponent/dialogComponent.ts new file mode 100644 index 000000000..ee1d5fd92 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/dialogComponent/dialogComponent.ts @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface DialogComponentProps { + type : "error" | "info" | "success" | "warning", + header : string, + body? : string +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/emptySettingsComponent/emptySettingsComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/emptySettingsComponent/emptySettingsComponent.ts new file mode 100644 index 000000000..12551e01b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/emptySettingsComponent/emptySettingsComponent.ts @@ -0,0 +1,26 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { MouseEventHandler, ReactNode } from "react"; + +export interface EmptySettingsComponentProps { + bodyString : string, + buttonString : string, + icon : ReactNode + onAddButtonClick? : MouseEventHandler +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/helperTextComponent/helperTextComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/helperTextComponent/helperTextComponent.ts new file mode 100644 index 000000000..2e7f0e33f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/helperTextComponent/helperTextComponent.ts @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +export interface HelperTextComponentProps { + text : string +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/homeComponent/homeComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/homeComponent/homeComponent.ts new file mode 100644 index 000000000..0973cf727 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/homeComponent/homeComponent.ts @@ -0,0 +1,29 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SideNavList } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export interface HomeComponentProps { + scope : string, + sideNavData : SideNavList, + activeKeySideNav : string, + activeKeySideNavSelect : (event:string | undefined)=>void, + setSignOutModalOpen : React.Dispatch>, + children : JSX.Element, + logoComponent : JSX.Element +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/indexHomeComponent/indexHomeComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/indexHomeComponent/indexHomeComponent.ts new file mode 100644 index 000000000..5d728ceb6 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/indexHomeComponent/indexHomeComponent.ts @@ -0,0 +1,27 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { StaticImageData } from "next/image"; +import { MouseEventHandler } from "react"; + +export interface IndexHomeComponentProps { + logoComponent : JSX.Element, + image : StaticImageData + tagText : string + signinOnClick : MouseEventHandler +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/jsonDisplayComponent/jsonDisplayComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/jsonDisplayComponent/jsonDisplayComponent.ts new file mode 100644 index 000000000..e085d8229 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/jsonDisplayComponent/jsonDisplayComponent.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface JsonDisplayComponentProps { + jsonObject: Record +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/mainPanelComponent/mainPanelComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/mainPanelComponent/mainPanelComponent.ts new file mode 100644 index 000000000..d6eb6ef9b --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/mainPanelComponent/mainPanelComponent.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface MainPanelComponentProps { + children? : JSX.Element +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/settingsTitleComponent/settingsTitleComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/settingsTitleComponent/settingsTitleComponent.ts new file mode 100644 index 000000000..fe767764d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/settingsTitleComponent/settingsTitleComponent.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface SettingsTitleComponentProps { + title : string, + subtitle : string, + children? : JSX.Element +} + diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/sharedLogoComponent/sharedLogoComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/sharedLogoComponent/sharedLogoComponent.ts new file mode 100644 index 000000000..8b5c40646 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/sharedLogoComponent/sharedLogoComponent.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { StaticImageData } from "next/image"; + +export interface SharedLogoComponentProps { + image : StaticImageData, + tagLine? : string, + name? : string, + imageSize : "small" | "medium" | "large" | "x-large", + white? : boolean +} + +export interface SharedLogoProps { + image : StaticImageData, + imageSize: "small" | "medium" | "large" | "x-large", + white?: boolean +} + +export interface SharedLogoImageStyle { + height : string, + width? : string, + filter? : string, + [key: string]: unknown; +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/sidenavComponent/sidenavComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/sidenavComponent/sidenavComponent.ts new file mode 100644 index 000000000..fb1f00684 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/sidenavComponent/sidenavComponent.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SideNavList } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; + +export interface SidenavComponentProps { + scope : string, + sideNavData : SideNavList, + activeKeySideNav : string, + activeKeySideNavSelect : (event:string | undefined)=>void, + setSignOutModalOpen : React.Dispatch>, + logoComponent : JSX.Element +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/signinRedirectComponent/signinRedirectComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/signinRedirectComponent/signinRedirectComponent.ts new file mode 100644 index 000000000..cf23d050f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/signinRedirectComponent/signinRedirectComponent.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export interface SigninRedirectComponentProps { + logoComponent : JSX.Element, + loaderContent: string +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/signoutComponent/signoutComponent.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/signoutComponent/signoutComponent.ts new file mode 100644 index 000000000..82098a454 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/src/lib/models/signoutComponent/signoutComponent.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SyntheticEvent } from "react"; + +export interface SignOutComponentProps { + open : boolean, + onClose : (event: SyntheticEvent) => void, + signOutCallback : () => void +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.lib.json new file mode 100644 index 000000000..37dbba798 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.spec.json new file mode 100644 index 000000000..0be00e268 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/ui/ui-components/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/jest.config.ts new file mode 100644 index 000000000..02d475634 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-util-util-authorization-config-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/shared/util/util-authorization-config-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/src/index.ts new file mode 100644 index 000000000..a29ad984c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/src/index.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/applicationConfigUtil"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/src/lib/applicationConfigUtil.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/src/lib/applicationConfigUtil.ts new file mode 100644 index 000000000..856487bab --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/src/lib/applicationConfigUtil.ts @@ -0,0 +1,96 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; + +/** + * check if the user is an administrator of the logged in identity server + * + * @param scopes - scopes of the logged in user + * + * @returns `true` if the user is an administrator, else `false` + */ +export function checkAdmin(scopes: string[]): boolean { + const adminScopes = [ "email", "internal_login", "internal_org_user_mgt_create", "internal_org_user_mgt_delete", + "internal_org_user_mgt_list", "internal_org_user_mgt_update", "internal_org_user_mgt_view", "openid", + "profile" ]; + + for (let i = 0; i < adminScopes.length; i++) { + if (!scopes.includes(adminScopes[i])) { + + return false; + } + } + + return true; +} + +/** + * + * @param orgId - organization id + * + * @returns organization url + */ +export function getOrgUrl(orgId: string): string { + + return `${getConfig().CommonConfig.AuthorizationConfig.BaseOrganizationUrl}/o`; +} + +export function getBaseUrl(orgId: string): string { + + return `${getConfig().CommonConfig.AuthorizationConfig.BaseUrl}/o`; +} + +/** + * URL extracted from the `config.AuthorizationConfig.BaseOrganizationUrl` + * + * @returns get managemnt API server base URL + */ + +export function getManagementAPIServerBaseUrl() { + + // todo: implementation will change after changes are done to the IS. + const baseOrganizationUrl = getConfig().CommonConfig.AuthorizationConfig.BaseOrganizationUrl; + // eslint-disable-next-line + if(baseOrganizationUrl) { + const matches = baseOrganizationUrl.match(/^(http|https)?\:\/\/([^\/?#]+)/i); + const domain = matches && matches[0]; + + return domain; + } + + return null; +} + +/** + * Tenant domain extracted from the `config.AuthorizationConfig.BaseOrganizationUrl` + * + * @returns tenatn domain. + */ +export function getTenantDomain() { + + const baseOrganizationUrl = getConfig().CommonConfig.AuthorizationConfig.BaseOrganizationUrl; + const url = baseOrganizationUrl.split("/"); + const path = url[url.length - 1]; + + return path; +} + +export default { + checkAdmin, getOrgUrl, getManagementAPIServerBaseUrl, getTenantDomain +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-application-config-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/jest.config.ts new file mode 100644 index 000000000..02d475634 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-util-util-authorization-config-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/shared/util/util-authorization-config-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/index.ts new file mode 100644 index 000000000..35b4761e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/index.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/authorizationConfigUtil"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/lib/authorizationConfigUtil.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/lib/authorizationConfigUtil.ts new file mode 100644 index 000000000..99c6eac33 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/lib/authorizationConfigUtil.ts @@ -0,0 +1,178 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getConfig } from "@pet-management-webapp/business-admin-app/util/util-application-config-util"; +import { User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { getManagementAPIServerBaseUrl, getTenantDomain } + from "@pet-management-webapp/shared/util/util-application-config-util"; +import { Profile, Session } from "next-auth"; +import { JWT } from "next-auth/jwt"; +import { signIn, signOut } from "next-auth/react"; +import RedirectReturnType from "../model/authorizationConfigModal"; + +/** +* +* @param path - path string that need to be redirected +* +* @returns redirect locally to a path +*/ +function redirect(path: string): RedirectReturnType { + return { + redirect: { + destination: path, + permanent: false + } + }; +} + +/** +* +* @param adminApp - `true` : business admin app, `false` : business app +* @param orgId - `orgId` - (directs to the organization login), `null` - (enter the organization to login) +*/ +function orgSignin(adminApp: boolean, orgId?: string): void { + + if (adminApp) { + if (orgId) { + signIn("wso2isAdmin", undefined, { orgId: orgId }); + } else { + signIn("wso2isAdmin"); + } + } else { + if (orgId) { + signIn("wso2is", { orgId: orgId }); + } else { + signIn("wso2is"); + } + } +} + +/** +* signout of the logged in organization +* +* @param session - session object +*/ +async function orgSignout(session: Session, hostedUrl: string): Promise { + + // todo: implementation should change after the backend changes are completed + + if (session) { + signOut() + .then( + () => window.location.assign( + getManagementAPIServerBaseUrl() + "/t/" + getTenantDomain() + + "/oidc/logout?client_id=" + getConfig().CommonConfig.AuthorizationConfig.ClientId + + "&post_logout_redirect_uri=" + hostedUrl + "&state=sign_out_success" + ) + ); + } else { + await signOut({ callbackUrl: "/" }); + } +} + +/** +* +* @param token - token object returned from the login function +* +* @returns - parse JWT token and return a JSON +*/ +function parseJwt(token: JWT) { + + const buffestString: Buffer = Buffer.from(token.toString().split(".")[1], "base64"); + + return JSON.parse(buffestString.toString()); +} + +/** +* +* @param token - token object returned from the login function +* +* @returns logged in user id. +*/ +function getLoggedUserId(token: JWT): string { + + return parseJwt(token)["sub"]; +} + +/** +* +* @param token - token object returned from the login function +* +* @returns get organization id. If `org_id` is null in token check `config.json` for the org id +*/ +function getOrgId(token: JWT): string { + + if (parseJwt(token)["org_id"]) { + + return parseJwt(token)["org_id"]; + } + + return getConfig().CommonConfig.ApplicationConfig.SampleOrganization[0].id; +} + +/** +* +* @param token - token object returned from the login function +* +* @returns get organization name. If `org_name` is null in token check `config.json` for the org name +*/ +function getOrgName(token: JWT): string { + + if (parseJwt(token)["org_name"]) { + + return parseJwt(token)["org_name"]; + } + + return getConfig().CommonConfig.ApplicationConfig.SampleOrganization[0].name; +} + +/** +* +* @param profile - profile +* +* @returns `User` get logged user from profile +*/ +function getLoggedUserFromProfile(profile: Profile): User | null { + + try { + + if (!profile.family_name || !profile.given_name || !profile.email ) { + + return null; + } + + const user: User = { + emails: [ profile.email ], + id: profile.sub, + name: { + familyName: profile.family_name ? profile.family_name : "-", + givenName: profile.given_name ? profile.given_name : "-" + }, + userName: profile.username? profile.username: "-" + }; + + return user; + } catch (err) { + + return null; + } +} + +export { + redirect, orgSignin, orgSignout, getLoggedUserId, getLoggedUserFromProfile, getOrgId, getOrgName +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/model/authorizationConfigModal.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/model/authorizationConfigModal.ts new file mode 100644 index 000000000..354b3e0bb --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/model/authorizationConfigModal.ts @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export default interface RedirectReturnType { + redirect: { + destination: string, + permanent: boolean + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/types/next-auth.d.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/types/next-auth.d.ts new file mode 100644 index 000000000..0e4c571c9 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/src/types/next-auth.d.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { User } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import { Profile } from "next-auth"; + +declare module "next-auth" { + interface Session { + error: boolean, + expires: boolean, + accessToken?: string, + user?: User | null, + orgId?: string, + orginalIdToken?: string, + } +} + +declare module "next-auth/jwt" { + interface JWT { + idToken?: string, + accessToken?: string, + scope?: string, + user?: Profile + } +} + +declare module "next-auth" { + interface Profile { + email?: string, + sub?: string, + family_name?: string, + given_name?: string, + username?: string, + user_organization?: string, + org_name?: string + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-authorization-config-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/jest.config.ts new file mode 100644 index 000000000..1e1f08af5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-util-common", + preset: "../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../coverage/libs/shared/util/util-common" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/index.ts new file mode 100644 index 000000000..dbde3f320 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/index.ts @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/common"; +export * from "./lib/consoleLogTypes"; +export * from "./model/copyTextToClipboardCallback"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/lib/common.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/lib/common.ts new file mode 100644 index 000000000..5b1827328 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/lib/common.ts @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CopyTextToClipboardCallback } from "../model/copyTextToClipboardCallback"; + +/** + * + * @param str - string that need to be checked + * + * @returns `true` if `str` is empty, else `false` + */ +export function stringIsEmpty(str: string): boolean { + + return str === ""; +} + +/** + * + * @returns current date + */ +export function getCurrentDate(): string { + const today: Date = new Date(); + const dd: string = String(today.getDate()).padStart(2, "0"); + const mm: string = String(today.getMonth() + 1).padStart(2, "0"); + const yyyy: string = today.getFullYear().toString(); + + const todayString: string = mm + "/" + dd + "/" + yyyy; + + return todayString; +} + +/** + * @returns true if JSON is empty else false + */ +export function checkIfJSONisEmpty(obj: Record): boolean { + if (!obj) { + + return true; + } + + return sizeOfJson(obj) === 0; +} + +/** + * @returns the size of JSON object + */ +export function sizeOfJson(obj: Record): number { + return Object.keys(obj).length; +} + +/** + * Copy the pased `text` to the clipboard and shows a notification + * + * @param text - text that need to be copied to the clipboard + * @param toaster - toaster object + */ +export function copyTheTextToClipboard(text: string, callback: CopyTextToClipboardCallback): void { + navigator.clipboard.writeText(text); + callback(); +} + +/** + * + * @returns random generatored rgb colour + */ +export function random_rgba(): string { + const o = Math.round, r = Math.random, s = 255; + + return "rgba(" + o(r() * s) + "," + o(r() * s) + "," + o(r() * s) + "," + r().toFixed(1) + ")"; +} + +/** + * operations that we can do on PATCH methods + */ +export enum PatchMethod { + ADD = "ADD", + REMOVE = "REMOVE", + REPLACE = "REPLACE" +} + +export const BASIC_ID = "basic-idp"; +export const EMPTY_STRING = ""; +export const OIDC_IDP = "enterprise-oidc-idp"; +export const SAML_IDP = "enterprise-saml-idp"; + +export const GOOGLE_AUTHENTICATOR_ID = "GoogleOIDCAuthenticator"; +export const OIDC_AUTHENTICATOR_ID = "OpenIDConnectAuthenticator"; +export const SAML_AUTHENTICATOR_ID = "SAMLSSOAuthenticator"; +export const BASIC_AUTHENTICATOR_ID = "BasicAuthenticator"; + +export const EMAIL = "email"; +export const EMAIL_OTP_AUTHENTICATOR = "email-otp-authenticator"; +export const SMS = "sms"; +export const SMS_OTP_AUTHENTICATOR = "sms-otp-authenticator"; +export const TOTP = "totp"; +export const TOTP_OTP_AUTHENTICATOR = "totp"; + +export default { + BASIC_AUTHENTICATOR_ID, BASIC_ID, EMPTY_STRING, + GOOGLE_AUTHENTICATOR_ID, PatchMethod, checkIfJSONisEmpty, copyTheTextToClipboard, getCurrentDate, + random_rgba, sizeOfJson, stringIsEmpty +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/lib/consoleLogTypes.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/lib/consoleLogTypes.ts new file mode 100644 index 000000000..505657988 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/lib/consoleLogTypes.ts @@ -0,0 +1,37 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + + +export function consoleLogInfo(title: string, message: string) { + // eslint-disable-next-line + console.log(`\n INFO : ${title} : ${JSON.stringify(message, null, "\t")}`); +} + +export function consoleLogDebug(title : string, message : string) { + // eslint-disable-next-line + console.log(`\n DEBUG : ${title} : ${JSON.stringify(message, null, "\t")}`); +} + +export function consoleLogError(title: string, message: string) { + // eslint-disable-next-line + console.log(`\n ERROR : ${title} : ${JSON.stringify(message, null, "\t")}`); +} + +export default { + consoleLogDebug, consoleLogError, consoleLogInfo +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/model/copyTextToClipboardCallback.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/model/copyTextToClipboardCallback.ts new file mode 100644 index 000000000..94eb0e24d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/src/model/copyTextToClipboardCallback.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export type CopyTextToClipboardCallback = () => void; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.lib.json new file mode 100644 index 000000000..37dbba798 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.spec.json new file mode 100644 index 000000000..0be00e268 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-common/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/.babelrc b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/.babelrc new file mode 100644 index 000000000..9f6abe49d --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "@nrwl/next/babel" + ], + "plugins": [] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/.eslintrc.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/.eslintrc.json new file mode 100644 index 000000000..d474f19e5 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/.eslintrc.json @@ -0,0 +1,34 @@ +{ + "extends": [ + "plugin:@nrwl/nx/react", + "../../../../.eslintrc.json" + ], + "ignorePatterns": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "*.ts", + "*.tsx", + "*.js", + "*.jsx" + ], + "rules": {} + }, + { + "files": [ + "*.ts", + "*.tsx" + ], + "rules": {} + }, + { + "files": [ + "*.js", + "*.jsx" + ], + "rules": {} + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/jest.config.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/jest.config.ts new file mode 100644 index 000000000..1178053a2 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/jest.config.ts @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* eslint-disable */ +export default { + displayName: "shared-util-util-front-end-util", + preset: "../../../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": ["@swc/jest", { jsc: { transform: { react: { runtime: "automatic" } } } }] + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"], + coverageDirectory: "../../../../coverage/libs/shared/util/util-front-end-util" +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/index.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/index.ts new file mode 100644 index 000000000..793c40c6f --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/index.ts @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export * from "./lib/formUtil/formUtil"; +export * from "./lib/frontendUtil"; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/lib/formUtil/formUtil.ts b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/lib/formUtil/formUtil.ts new file mode 100644 index 000000000..f3c62e8d8 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/lib/formUtil/formUtil.ts @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2022, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * + * @param templateId - application details template id + * + * @returns template related to the template id. + */ +export function fieldValidate(key: string, field: unknown, errors: Record): Record { + + if (!field) { + errors[key] = "This field cannot be empty"; + } + + return errors; +} + +export default { fieldValidate }; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/lib/frontendUtil.tsx b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/lib/frontendUtil.tsx new file mode 100644 index 000000000..86ae41ba0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/src/lib/frontendUtil.tsx @@ -0,0 +1,161 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { SideNavItem } from "@pet-management-webapp/shared/data-access/data-access-common-models-util"; +import AdminIcon from "@rsuite/icons/Admin"; +import CalendarIcon from "@rsuite/icons/Calendar"; +import EditIcon from "@rsuite/icons/Edit"; +import GridIcon from "@rsuite/icons/Grid"; +import DashboardIcon from "@rsuite/icons/legacy/Dashboard"; +import GearCircleIcon from "@rsuite/icons/legacy/GearCircle"; +import MemberIcon from "@rsuite/icons/Member"; +import PageIcon from "@rsuite/icons/Page"; +import PeopleBranchIcon from "@rsuite/icons/PeopleBranch"; +import PeoplesCostomizeIcon from "@rsuite/icons/PeoplesCostomize"; +import PhoneIcon from "@rsuite/icons/Phone"; +import SettingHorizontalIcon from "@rsuite/icons/SettingHorizontal"; +import ShieldIcon from "@rsuite/icons/Shield"; +import SpeakerIcon from "@rsuite/icons/Speaker"; +import TagLockIcon from "@rsuite/icons/TagLock"; +import PeoplesIcon from '@rsuite/icons/Peoples'; + +export const LOADING_DISPLAY_NONE = { + display: "none" +}; +export const LOADING_DISPLAY_BLOCK = { + display: "block" +}; + +/** + * + * @param scopes - scopes of the user + * @param itemScopes - scopes that required for this section + * + * @returns `true` if user has the necessary scopes, else `false` + */ +function hideBasesdOnScopesSideNavItems(scopes: string[], itemScopes: string[]): boolean { + return itemScopes.every(scope => scopes.includes(scope)); +} + +/** + * hide content based on the user's realated privilages + * + * @param scopes - scopes related for the user + * + * @returns `LOADING_DISPLAY_BLOCK` if admin, else `LOADING_DISPLAY_NONE` + */ +export function hideBasedOnScopes(scopes: string, sideNavType: string, sideNavItems?: SideNavItem[], + itemScopes?: string[]): Record { + + const scopesList: string[] = scopes.split(/\s+/); + + switch (sideNavType) { + case "item": + if (hideBasesdOnScopesSideNavItems(scopesList, itemScopes as string[])) { + + return LOADING_DISPLAY_BLOCK; + } else { + + return LOADING_DISPLAY_NONE; + } + + case "menu": { + let check: Record = LOADING_DISPLAY_NONE; + + if (sideNavItems) { + for (let i = 0; i < sideNavItems.length; i++) { + if (hideBasesdOnScopesSideNavItems(scopesList, sideNavItems[i].scopes as string[])) { + check = LOADING_DISPLAY_BLOCK; + + break; + } + } + + } + + return check; + + } + + default: + return LOADING_DISPLAY_NONE; + } +} + +export function getIconFromString(iconString: string | undefined): JSX.Element | undefined { + switch (iconString) { + case "DashboardIcon": + + return (); + case "GearCircleIcon": + + return (); + case "SettingHorizontalIcon": + + return (); + case "AdminIcon": + + return (); + case "PageIcon": + + return (); + case "PhoneIcon": + + return (); + case "PeopleBranchIcon": + + return (); + case "SpeakerIcon": + + return (); + case "ShieldIcon": + + return (); + case "ManageDoctorIcon": + + return (); + case "ProfileIcon": + return(); + + case "BookingsIcon": + return(); + + case "PetsIcon": + return(); + + case "ChannellingIcon": + return(); + + case "BrandingIcon": + return(); + + case "MFAIcon": + return(); + + case "ManageGroups": + return(); + + default: + + return; + } +} + +export default { + LOADING_DISPLAY_BLOCK, LOADING_DISPLAY_NONE, getIconFromString, hideBasedOnScopes +}; diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.json new file mode 100644 index 000000000..3512bf7af --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.lib.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.lib.json new file mode 100644 index 000000000..c34ddb925 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.lib.json @@ -0,0 +1,30 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": [ + "node" + ] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/next/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": [ + "**/*.js", + "**/*.jsx", + "**/*.ts", + "**/*.tsx" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.spec.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.spec.json new file mode 100644 index 000000000..e47aa00f0 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/libs/shared/util/util-front-end-util/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/nx.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/nx.json new file mode 100644 index 000000000..1be13bf7a --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/nx.json @@ -0,0 +1,52 @@ +{ + "workspaceLayout": { + "appsDir": "apps", + "libsDir": "libs" + }, + "tasksRunnerOptions": { + "default": { + "runner": "@nrwl/nx-cloud", + "options": { + "cacheableOperations": [ + "build", + "test", + "lint", + "package", + "prepare", + "build-storybook" + ], + "accessToken": "OTE4ZDVlMTAtNDA3MS00YTBlLWJiMjEtMmZjNGY3YWIzZjhmfHJlYWQtd3JpdGU=" + } + } + }, + "targetDefaults": { + "lint": { + "inputs": [ + "default", + "{workspaceRoot}/.eslintrc.json" + ] + }, + "test": { + "inputs": [ + "default", + "^default", + "{workspaceRoot}/jest.preset.js" + ] + } + }, + "defaultBase": "main", + "generators": { + "@nrwl/react": { + "application": { + "babel": true + } + }, + "@nrwl/next": { + "application": { + "style": "css", + "linter": "eslint" + } + } + }, + "defaultProject": "business-admin-app" +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/package-lock.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/package-lock.json new file mode 100644 index 000000000..dbfe36ff4 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/package-lock.json @@ -0,0 +1,33190 @@ +{ + "name": "pet-management-webapp", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "pet-management-webapp", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.16", + "@mui/x-date-pickers": "^6.5.0", + "@nrwl/nx-cloud": "^16.0.5", + "@types/jest": "^28.1.1", + "@types/styled-components": "^5.1.26", + "chart.js": "^3.9.1", + "chartjs-plugin-datalabels": "^2.2.0", + "date-fns": "^2.30.0", + "dayjs": "^1.11.7", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-tsdoc": "^0.2.17", + "jwt-decode": "^4.0.0", + "next": "13.0.0", + "next-auth": "^4.16.4", + "next-fonts": "^1.5.1", + "next-with-less": "^2.0.5", + "react": "^18.2.0", + "react-color": "^2.19.3", + "react-dom": "^18.2.0", + "react-final-form": "^6.5.9", + "react-loader-spinner": "^5.3.4", + "rsuite": "^5.22.2", + "rsuite-color-picker": "^0.2.0", + "styled-components": "^5.3.10", + "tinycolor2": "^1.6.0" + }, + "devDependencies": { + "@babel/traverse": "^7.23.2", + "@nrwl/eslint-plugin-nx": "15.1.1", + "@nrwl/jest": "15.2.0", + "@nrwl/next": "^15.2.0", + "@types/react": "18.0.20", + "@typescript-eslint/eslint-plugin": "^5.36.1", + "@typescript-eslint/parser": "^5.36.1", + "eslint": "~8.15.0", + "eslint-config-next": "13.0.0", + "eslint-config-prettier": "8.1.0", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-react-hooks": "4.6.0", + "less": "^4.2.0", + "next-auth": "^4.16.4", + "next-with-less": "^2.0.5", + "react-final-form": "^6.5.9", + "rsuite": "^5.22.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz", + "integrity": "sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz", + "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", + "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", + "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cypress/webpack-preprocessor": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.15.5.tgz", + "integrity": "sha512-ZV2ZylabogNDK3+xwDIWswudCJMFDT9XU6tTGni2xWow/brBvI55sEqcjvb6+9x8skMSPM6vLxdvf/FAOmNEFQ==", + "dev": true, + "dependencies": { + "@babel/parser": "7.13.0", + "bluebird": "3.7.1", + "debug": "^4.3.2", + "fs-extra": "^10.1.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.20", + "md5": "2.3.0", + "source-map": "^0.6.1", + "webpack-virtual-modules": "^0.4.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.1", + "@babel/preset-env": "^7.0.0", + "babel-loader": "^8.0.2", + "webpack": "^4 || ^5" + } + }, + "node_modules/@cypress/webpack-preprocessor/node_modules/@babel/parser": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.0.tgz", + "integrity": "sha512-w80kxEMFhE3wjMOQkfdTvv0CSdRSJZptIlLhU4eU/coNJeWjduspUFz+IRnBbAq6m5XYBFMoT1TNkk9K9yf10g==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "dependencies": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, + "dependencies": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.1.tgz", + "integrity": "sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.1", + "@jest/test-result": "^28.1.1", + "@jest/transform": "^28.1.1", + "@jest/types": "^28.1.1", + "@jridgewell/trace-mapping": "^0.3.7", + "@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.1", + "jest-util": "^28.1.1", + "jest-worker": "^28.1.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/test-sequencer/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.2.tgz", + "integrity": "sha512-R9R+aqrl1QhZJaO05rhvooqxOaf7SKpQ+EjW80sbP3ticTVmLmrn4YBLQS7/ML+WXdrkrPtqSmKFdSE5Ik3gBQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@popperjs/core": "^2.11.7", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.2.tgz", + "integrity": "sha512-aOLCXMCySMFL2WmUhnz+DjF84AoFVu8rn35OsL759HXOZMz8zhEwVf5w/xxkWx7DycM2KXDTgAvYW48nTfqTLA==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.11.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", + "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.2.tgz", + "integrity": "sha512-Pfke1l0GG2OJb/Nr10aVr8huoBFcBTdWKV5iFSTEHqf9c2C1ZlyYMISn7ui6X3Gix8vr+hP5kVqH1LAWwQSb6w==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-beta.2", + "@mui/core-downloads-tracker": "^5.13.2", + "@mui/system": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.2.tgz", + "integrity": "sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peer": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", + "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.5.0.tgz", + "integrity": "sha512-dRCO1mzHjfOqsa4LdKxiXQnV0cuGiAkliyxSDCdRn6clK2WdF9Oj+1+4Mkx7fcJA61SV1eP4Yg29s0/VDsZKZw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.12.3", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/base": "^5.0.0-alpha.87", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@next/env": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.0.tgz", + "integrity": "sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.0.tgz", + "integrity": "sha512-z+gnX4Zizatqatc6f4CQrcC9oN8Us3Vrq/OLyc98h7K/eWctrnV91zFZodmJHUjx0cITY8uYM7LXD7IdYkg3kg==", + "dev": true, + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@next/swc-android-arm-eabi": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.0.tgz", + "integrity": "sha512-+DUQkYF93gxFjWY+CYWE1QDX6gTgnUiWf+W4UqZjM1Jcef8U97fS6xYh+i+8rH4MM0AXHm7OSakvfOMzmjU6VA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-android-arm64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.0.tgz", + "integrity": "sha512-RW9Uy3bMSc0zVGCa11klFuwfP/jdcdkhdruqnrJ7v+7XHm6OFKkSRzX6ee7yGR1rdDZvTnP4GZSRSpzjLv/N0g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.0.tgz", + "integrity": "sha512-APA26nps1j4qyhOIzkclW/OmgotVHj1jBxebSpMCPw2rXfiNvKNY9FA0TcuwPmUCNqaTnm703h6oW4dvp73A4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.0.tgz", + "integrity": "sha512-qsUhUdoFuRJiaJ7LnvTQ6GZv1QnMDcRXCIjxaN0FNVXwrjkq++U7KjBUaxXkRzLV4C7u0NHLNOp0iZwNNE7ypw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-freebsd-x64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.0.tgz", + "integrity": "sha512-sCdyCbboS7CwdnevKH9J6hkJI76LUw1jVWt4eV7kISuLiPba3JmehZSWm80oa4ADChRVAwzhLAo2zJaYRrInbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm-gnueabihf": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.0.tgz", + "integrity": "sha512-/X/VxfFA41C9jrEv+sUsPLQ5vbDPVIgG0CJrzKvrcc+b+4zIgPgtfsaWq9ockjHFQi3ycvlZK4TALOXO8ovQ6Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.0.tgz", + "integrity": "sha512-x6Oxr1GIi0ZtNiT6jbw+JVcbEi3UQgF7mMmkrgfL4mfchOwXtWSHKTSSPnwoJWJfXYa0Vy1n8NElWNTGAqoWFw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.0.tgz", + "integrity": "sha512-SnMH9ngI+ipGh3kqQ8+mDtWunirwmhQnQeZkEq9e/9Xsgjf04OetqrqRHKM1HmJtG2qMUJbyXFJ0F81TPuT+3g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.0.tgz", + "integrity": "sha512-VSQwTX9EmdbotArtA1J67X8964oQfe0xHb32x4tu+JqTR+wOHyG6wGzPMdXH2oKAp6rdd7BzqxUXXf0J+ypHlw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.0.tgz", + "integrity": "sha512-xBCP0nnpO0q4tsytXkvIwWFINtbFRyVY5gxa1zB0vlFtqYR9lNhrOwH3CBrks3kkeaePOXd611+8sjdUtrLnXA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.0.tgz", + "integrity": "sha512-NutwDafqhGxqPj/eiUixJq9ImS/0sgx6gqlD7jRndCvQ2Q8AvDdu1+xKcGWGNnhcDsNM/n1avf1e62OG1GaqJg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.0.tgz", + "integrity": "sha512-zNaxaO+Kl/xNz02E9QlcVz0pT4MjkXGDLb25qxtAzyJL15aU0+VjjbIZAYWctG59dvggNIUNDWgoBeVTKB9xLg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.0.tgz", + "integrity": "sha512-FFOGGWwTCRMu9W7MF496Urefxtuo2lttxF1vwS+1rIRsKvuLrWhVaVTj3T8sf2EBL6gtJbmh4TYlizS+obnGKA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nrwl/cli": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.1.1.tgz", + "integrity": "sha512-rfpIi/zWpL6YyW7Z10oc65FwePvFP0uo7L1f32wMtC25dHh12YD3OS24VniCOrFYWjHNIu7X7hdHx2lcDXPRBg==", + "dev": true, + "dependencies": { + "nx": "15.1.1" + } + }, + "node_modules/@nrwl/cypress": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-15.2.0.tgz", + "integrity": "sha512-dwYeEgQoKvN8B2mW/D5WBZkrwptYGJzgVLISsweze+A+472u8o5woJPs3ytMwrRt5d1ORC6RFT1jf8GMJaPFiw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.0.1", + "@babel/preset-env": "^7.0.0", + "@cypress/webpack-preprocessor": "^5.12.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "babel-loader": "^8.0.2", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "semver": "7.3.4", + "ts-loader": "^9.3.1", + "tsconfig-paths-webpack-plugin": "3.5.2", + "tslib": "^2.3.0", + "webpack": "^4 || ^5", + "webpack-node-externals": "^3.0.0" + }, + "peerDependencies": { + "cypress": ">= 3 < 12" + }, + "peerDependenciesMeta": { + "cypress": { + "optional": true + } + } + }, + "node_modules/@nrwl/cypress/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/cypress/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/cypress/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/cypress/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/cypress/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/cypress/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/devkit": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.1.1.tgz", + "integrity": "sha512-Dh26LjMh/BMmoOja2WSSVSAaVDI59qIg46dZmfU7fcu+Y4FFMor3PMAAo5QVbfLasbx4HG6vrvQlhuwWnXm4hw==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/eslint-plugin-nx": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.1.1.tgz", + "integrity": "sha512-8AgmcSfmOne9i8bTCNh8OoNxCMY5czdC1L2X0zYxMxvK64ZN8k/W7MFkJY5ogthCxVlMKyzVIpSFRE9as1tA4g==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.1.1", + "@nrwl/workspace": "15.1.1", + "@typescript-eslint/utils": "^5.36.1", + "chalk": "4.1.0", + "confusing-browser-globals": "^1.0.9", + "semver": "7.3.4" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.29.0", + "eslint-config-prettier": "^8.1.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/jest": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.2.0.tgz", + "integrity": "sha512-bDsbYbFvIu/N5otKW6sqXO+kg3UEmjjLHiQcXblCXC98d6Mb+GhIP7f0aeROKmiAAsmxubPOHqwVw9PDtY01dw==", + "dev": true, + "dependencies": { + "@jest/reporters": "28.1.1", + "@jest/test-result": "28.1.1", + "@nrwl/devkit": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "28.1.1", + "jest-resolve": "28.1.1", + "jest-util": "28.1.1", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nrwl/jest/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/js": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-15.2.0.tgz", + "integrity": "sha512-X7dCi7SP0kL2nnWWcTYaLVqfT+zNsf6+phMvhNi/e6gftjqyU7pGlkPtbc4EyjKZjsTmYQboLx/2O3Im8BSbXw==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "fast-glob": "3.2.7", + "fs-extra": "^10.1.0", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "minimatch": "3.0.5", + "source-map-support": "0.5.19", + "tree-kill": "1.2.2" + } + }, + "node_modules/@nrwl/js/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/js/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/js/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/js/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/js/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/js/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/js/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@nrwl/linter": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.1.1.tgz", + "integrity": "sha512-FQrek2JVpMo6iVVLm4rhGVIyBRWtGJ0Htsd9KM7uOXZd75jKDFVHtWY/HlKcvfhlJ/0+ZGBArKiJjFlbD4lYpw==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.1.1", + "@nrwl/jest": "15.1.1", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.1.1", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/linter/node_modules/@nrwl/jest": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.1.1.tgz", + "integrity": "sha512-NRQcEy4lcEjHrFmv6UR2gg3RviLNRiYgdqUiboSo0tD2fIqlLEz7m1T/l54f1/Dt0GWeVhzfQGk8WJKkbjZHlQ==", + "dev": true, + "dependencies": { + "@jest/reporters": "28.1.1", + "@jest/test-result": "28.1.1", + "@nrwl/devkit": "15.1.1", + "@phenomnomnominal/tsquery": "4.1.1", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "28.1.1", + "jest-resolve": "28.1.1", + "jest-util": "28.1.1", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@nrwl/next": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/next/-/next-15.2.0.tgz", + "integrity": "sha512-MeaF6lMnJrXYGMu3Yc1GqryPb2neCoaqwezaMfCKO1SWbcmxQT0N6eNxl6c32HXMQCHttplR5PosSZ2zlAlRcg==", + "dev": true, + "dependencies": { + "@babel/plugin-proposal-decorators": "^7.14.5", + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/react": "15.2.0", + "@nrwl/webpack": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@svgr/webpack": "^6.1.2", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "fs-extra": "^10.1.0", + "ignore": "^5.0.4", + "semver": "7.3.4", + "ts-node": "10.9.1", + "tsconfig-paths": "^3.9.0", + "url-loader": "^4.1.1", + "webpack-merge": "^5.8.0" + }, + "peerDependencies": { + "next": "^13.0.0" + } + }, + "node_modules/@nrwl/next/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/next/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/next/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/next/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/next/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/next/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/nx-cloud": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@nrwl/nx-cloud/-/nx-cloud-16.0.5.tgz", + "integrity": "sha512-1p82ym8WE9ziejwgPslstn19iV/VkHfHfKr/5YOnfCHQS+NxUf92ogcYhHXtqWLblVZ9Zs4W4pkSXK4e04wCmQ==", + "dependencies": { + "nx-cloud": "16.0.5" + } + }, + "node_modules/@nrwl/react": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/react/-/react-15.2.0.tgz", + "integrity": "sha512-XPd/HA34P3oSOM51W9lhFjyRVpbzZJFdjLEO+hVLIVQAzlypP7P/9KTfiScD3Wu824euG3PYFOvIyVkoS6VzOQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.15.0", + "@babel/preset-react": "^7.14.5", + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/storybook": "15.2.0", + "@nrwl/web": "15.2.0", + "@nrwl/webpack": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", + "@svgr/webpack": "^6.1.2", + "chalk": "4.1.0", + "css-loader": "^6.4.0", + "minimatch": "3.0.5", + "react-refresh": "^0.10.0", + "semver": "7.3.4", + "style-loader": "^3.3.0", + "stylus": "^0.55.0", + "stylus-loader": "^7.1.0", + "url-loader": "^4.1.1", + "webpack": "^5.75.0", + "webpack-merge": "^5.8.0" + } + }, + "node_modules/@nrwl/react/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/react/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/react/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/react/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/react/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/react/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/rollup": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/rollup/-/rollup-15.2.0.tgz", + "integrity": "sha512-wTB/uyhLcQxfSyLCrpHknl6srRJrdLxU12HVzb6DOxB754vQcrjV9C+OGpDuiMZm2nUPF6Sy0ICtIPNxISiFFA==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^20.0.0", + "@rollup/plugin-image": "^2.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.0.4", + "autoprefixer": "^10.4.9", + "babel-plugin-transform-async-to-promises": "^0.8.15", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "fs-extra": "^10.1.0", + "postcss": "^8.4.14", + "rollup": "^2.56.2", + "rollup-plugin-copy": "^3.4.0", + "rollup-plugin-peer-deps-external": "^2.2.4", + "rollup-plugin-postcss": "^4.0.1", + "rollup-plugin-typescript2": "^0.31.1", + "rxjs": "^6.5.4", + "tslib": "^2.3.0" + } + }, + "node_modules/@nrwl/rollup/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/rollup/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/rollup/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/rollup/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/rollup/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/rollup/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/storybook": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/storybook/-/storybook-15.2.0.tgz", + "integrity": "sha512-rlLU49flCY2ONELvkbx9TA/l4tJ4L1B3kcdRUHPaj5pEL+XkyG1A4JE3ZVCZcdRzYIkkqK6AWcF5/ey6NXW7HA==", + "dev": true, + "dependencies": { + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/workspace": "15.2.0", + "dotenv": "~10.0.0", + "semver": "7.3.4" + } + }, + "node_modules/@nrwl/storybook/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/storybook/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/storybook/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/storybook/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/storybook/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/storybook/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/tao": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.1.1.tgz", + "integrity": "sha512-FCmR9Rq+Nza7G5lXYPzYgVfYz2nI/7yDhTaenwBOyoxYixppfWTEx25mpsPtF38x996b/wp6gREuC4OPov7NWQ==", + "dev": true, + "dependencies": { + "nx": "15.1.1" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/web": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-15.2.0.tgz", + "integrity": "sha512-tXc7IrVgJvwabl2fWFxatcN9B24Igylla+jmGnWf+pmoWyH5+BLY/HjBCz/ikcY2uGAKh7mBAZzm8bryfD4vMw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.15.0", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-decorators": "^7.14.5", + "@babel/plugin-transform-runtime": "^7.15.0", + "@babel/preset-env": "^7.15.0", + "@babel/preset-typescript": "^7.15.0", + "@babel/runtime": "^7.14.8", + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/rollup": "15.2.0", + "@nrwl/webpack": "15.2.0", + "@nrwl/workspace": "15.2.0", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "http-server": "^14.1.0", + "ignore": "^5.0.4", + "tslib": "^2.3.0" + } + }, + "node_modules/@nrwl/web/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/web/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/web/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/web/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/web/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/web/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/webpack": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/webpack/-/webpack-15.2.0.tgz", + "integrity": "sha512-xN02UJz1vV8HaK9DMEghpShjNpgxHb2jM/I1mtjY2jTUBjdlZ8s/90avzRwZap4m41XTVyiLOfjSlxmevq0ePA==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/workspace": "15.2.0", + "autoprefixer": "^10.4.9", + "babel-loader": "^8.2.2", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001394", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "copy-webpack-plugin": "^10.2.4", + "css-loader": "^6.4.0", + "css-minimizer-webpack-plugin": "^3.4.1", + "dotenv": "~10.0.0", + "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "fs-extra": "^10.1.0", + "ignore": "^5.0.4", + "less": "3.12.2", + "less-loader": "^11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "mini-css-extract-plugin": "~2.4.7", + "parse5": "4.0.0", + "parse5-html-rewriting-stream": "6.0.1", + "postcss": "^8.4.14", + "postcss-import": "~14.1.0", + "postcss-loader": "^6.1.1", + "raw-loader": "^4.0.2", + "rxjs": "^6.5.4", + "sass": "^1.42.1", + "sass-loader": "^12.2.0", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.0", + "stylus": "^0.55.0", + "stylus-loader": "^7.1.0", + "terser-webpack-plugin": "^5.3.3", + "ts-loader": "^9.3.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^3.9.0", + "tsconfig-paths-webpack-plugin": "3.5.2", + "tslib": "^2.3.0", + "webpack": "^5.75.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpack-node-externals": "^3.0.0", + "webpack-sources": "^3.2.3", + "webpack-subresource-integrity": "^5.1.0" + } + }, + "node_modules/@nrwl/webpack/node_modules/@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + } + }, + "node_modules/@nrwl/webpack/node_modules/@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "dependencies": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 14 <= 16" + } + }, + "node_modules/@nrwl/webpack/node_modules/@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@nrwl/webpack/node_modules/@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "dependencies": { + "nx": "15.2.0" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/webpack/node_modules/@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/webpack/node_modules/less": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "dev": true, + "dependencies": { + "tslib": "^1.10.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "native-request": "^1.0.5", + "source-map": "~0.6.0" + } + }, + "node_modules/@nrwl/webpack/node_modules/less/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@nrwl/webpack/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nrwl/webpack/node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@nrwl/webpack/node_modules/nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/@nrwl/webpack/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "node_modules/@nrwl/webpack/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@nrwl/workspace": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.1.1.tgz", + "integrity": "sha512-YI5GApBJzltOIz6v58tMvBL3FLQ1z++Akv52WzHybUOski2uKT7FbZwmOebJ2nGF0gPf+J4VOyRFK8pHum/SqQ==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "15.1.1", + "@nrwl/jest": "15.1.1", + "@nrwl/linter": "15.1.1", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.1.1", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "prettier": "^2.6.2" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@nrwl/workspace/node_modules/@nrwl/jest": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.1.1.tgz", + "integrity": "sha512-NRQcEy4lcEjHrFmv6UR2gg3RviLNRiYgdqUiboSo0tD2fIqlLEz7m1T/l54f1/Dt0GWeVhzfQGk8WJKkbjZHlQ==", + "dev": true, + "dependencies": { + "@jest/reporters": "28.1.1", + "@jest/test-result": "28.1.1", + "@nrwl/devkit": "15.1.1", + "@phenomnomnominal/tsquery": "4.1.1", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "28.1.1", + "jest-resolve": "28.1.1", + "jest-util": "28.1.1", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@panva/hkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.2.tgz", + "integrity": "sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz", + "integrity": "sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==", + "dev": true, + "dependencies": { + "esquery": "^1.0.1" + }, + "peerDependencies": { + "typescript": "^3 || ^4" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.9.tgz", + "integrity": "sha512-7QV4cqUwhkDIHpMAZ9mestSJ2DMIotVTbOUwbiudhjCRTAWWKIaBecELiEM2LT3AHFeOAaHIcFu4dbXjX+9GBA==", + "dev": true, + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.3", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <4.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz", + "integrity": "sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^2.38.3" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@rollup/plugin-image": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-image/-/plugin-image-2.1.1.tgz", + "integrity": "sha512-AgP4U85zuQJdUopLUCM+hTf45RepgXeTb8EJsleExVy99dIoYpt3ZlDYJdKmAc2KLkNntCDg6BPJvgJU3uGF+g==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "mini-svg-data-uri": "^1.2.3" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.0.8" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@rsuite/icon-font": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0.tgz", + "integrity": "sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q==" + }, + "node_modules/@rsuite/icons": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.2.tgz", + "integrity": "sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==", + "dependencies": { + "@rsuite/icon-font": "^4.0.0", + "classnames": "^2.2.5", + "insert-css": "^2.0.0", + "lodash": "^4.17.20" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "dev": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dev": true, + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@swc/core": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.18.tgz", + "integrity": "sha512-VChk3ldLhmVoX3Hd2M3Y4j960T0lo2Zus60iZoWST6P65RVPt8BatFVVPAB9dABy1dB5zn1BCpHlH85yXVysQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "peer": true, + "bin": { + "swcx": "run_swcx.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.18", + "@swc/core-darwin-x64": "1.3.18", + "@swc/core-linux-arm-gnueabihf": "1.3.18", + "@swc/core-linux-arm64-gnu": "1.3.18", + "@swc/core-linux-arm64-musl": "1.3.18", + "@swc/core-linux-x64-gnu": "1.3.18", + "@swc/core-linux-x64-musl": "1.3.18", + "@swc/core-win32-arm64-msvc": "1.3.18", + "@swc/core-win32-ia32-msvc": "1.3.18", + "@swc/core-win32-x64-msvc": "1.3.18" + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.18.tgz", + "integrity": "sha512-4UEQ+LyzDFTszEy4LCU50h4cjVNJcNwD87aVBT/8i6YXj5dyMki/TrkIQ6Bhv7g5beg2GRncB2ndjN66r8I8+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.18.tgz", + "integrity": "sha512-DSCd7eVr+4ukffNnvhrFmUoCF0VLOXPgGmdwm6u0irLWOLtr2VZNZcf7UF+t/Y9jPKmXz3OY6lVgwtjxZhiklQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.18.tgz", + "integrity": "sha512-9dy6qJiWAls9OrBvrWbFDbjEkuOPrEP6OsKyrQWTMqLjCLwgLa3g4yC0YtPdUa/A8uyNVKtRcq+NXoKW+mP/QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.18.tgz", + "integrity": "sha512-8FZjiUSM4JBQTD4sV7Y6BNMdo0oDlqa8xYVaAimuIBL8ixD/Fb+0GIxKdB59yKRVQyuXJRa6Pwzd7zk3wY5T0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.18.tgz", + "integrity": "sha512-0zNqfFeAHZp37lu+lTVvZKfDM10EIoYJtv9sWz+0EA5mkzwj4NtC3ialTIjcPAyJ9Oq4zBtToW2hv7qEtyBHZw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.18.tgz", + "integrity": "sha512-PA3Cc97Kc6W6RtpBLeJaoXLCRL5dJLYd2dszf+f5hGHHJybh6eXGIU0ZkZr898NUHoL8fT6Mg6I4JCNImq/yBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.18.tgz", + "integrity": "sha512-RiZXHwED8cfD/zoBG01iY8YZtOF/8t9XHZ1JqCx9PWOMjXD3Vc8F2I7bp1Qg6ahzWEaP+2+/rqGO1kSwaJjJLw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.18.tgz", + "integrity": "sha512-G1Lu/sP+v34lwsGFreklnCdxygMLmobyLY31cNPd0i47ZwgrGowuTV34Mcqfc4AWRkayqVAIlb/WWIZ1+qemcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.18.tgz", + "integrity": "sha512-Uu+m5BPemw5ZiG6LaF+pP0qFQuIXF55wMZNa0Dbl/16hF7ci6q941MT6CqeK5LQQ52FVVqeYO5lDk5CggaA3Mw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.18.tgz", + "integrity": "sha512-9o8uFNsPmWB5FFQSDCsI/KVBSHuAILEwB/hMvbUxKtZeSWAQTm5BqbNPi6X11KJ3MdyoJn7zPejj3grL3dcd/w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", + "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.1.tgz", + "integrity": "sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA==", + "dependencies": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.189", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==" + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/styled-components": { + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.43.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/@yarn-tool/resolve-package": { + "version": "1.0.47", + "resolved": "https://registry.npmjs.org/@yarn-tool/resolve-package/-/resolve-package-1.0.47.tgz", + "integrity": "sha512-Zaw58gQxjQceJqhqybJi1oUDaORT8i2GTgwICPs8v/X/Pkx35FXQba69ldHVg5pQZ6YLKpROXgyHvBaCJOFXiA==", + "dev": true, + "dependencies": { + "pkg-dir": "< 6 >= 5", + "tslib": "^2", + "upath2": "^3.1.13" + } + }, + "node_modules/@yarn-tool/resolve-package/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yarn-tool/resolve-package/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yarn-tool/resolve-package/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@yarn-tool/resolve-package/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.29", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.29.tgz", + "integrity": "sha512-07kAB4mEcZltoMBQqV4Tb8ucCpOQCG6fl4fH/2cmOU8Nh6nZcmvCptIuARC5dd4vfZKI5zUUoK2arR+pOi9PxQ==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "devOptional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/axe-core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", + "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.1.tgz", + "integrity": "sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw==", + "dev": true, + "dependencies": { + "@jest/transform": "^28.1.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-const-enum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", + "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz", + "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, + "node_modules/babel-plugin-transform-async-to-promises": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.18.tgz", + "integrity": "sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==", + "dev": true + }, + "node_modules/babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", + "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001488", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", + "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chart.js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" + }, + "node_modules/chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", + "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js-compat": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", + "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", + "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.18", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dev": true, + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.2.13", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", + "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.3", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.1", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/cypress": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-11.1.0.tgz", + "integrity": "sha512-kzizbG9s3p3ahWqxUwG/21NqLWEGtScMevMyUPeYlcmMX9RzVxWM18MkA3B4Cb3jKx72hSyIE2mHgHymfCM1bg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cypress/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cypress/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-lib": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-3.1.5.tgz", + "integrity": "sha512-UtBonzIF2H0znUASBTZ/jIKBehBIezRp84mIr950rcBVVuQKTwh8oOhPWUmdQ1Hyy931kRAPDXbobDI+OX/Dyg==", + "dependencies": { + "@babel/runtime": "^7.19.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", + "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "dependencies": { + "@eslint/eslintrc": "^1.2.3", + "@humanwhocodes/config-array": "^0.9.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.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.0.tgz", + "integrity": "sha512-y2nqWS2tycWySdVhb+rhp6CuDmDazGySqkzzQZf3UTyfHyC7og1m5m/AtMFwCo5mtvDqvw1BENin52kV9733lg==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "13.0.0", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.21.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^2.7.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", + "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", + "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "glob": "^7.2.0", + "is-glob": "^4.0.3", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "peerDependencies": { + "eslint": ">=7.7.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-tsdoc": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", + "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "0.16.2" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/expect/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "peer": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/final-form": { + "version": "4.20.9", + "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.9.tgz", + "integrity": "sha512-shA1X/7v8RmukWMNRHx0l7+Bm41hOivY78IvOiBrPVHjyWFIyqqIEMCz7yTVRc9Ea+EU4WkZ5r4MH6whSo5taw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/final-form" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "dev": true, + "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", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "vue-template-compiler": "*", + "webpack": "^5.11.0" + }, + "peerDependenciesMeta": { + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "dependencies": { + "loader-utils": "^3.2.0" + } + }, + "node_modules/generic-names/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-server/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "devOptional": true + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-config": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.1.tgz", + "integrity": "sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.1", + "@jest/types": "^28.1.1", + "babel-jest": "^28.1.1", + "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.1", + "jest-environment-node": "^28.1.1", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.1", + "jest-runner": "^28.1.1", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-mock": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.1.tgz", + "integrity": "sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "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" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, + "node_modules/jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "peer": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/listr2/node_modules/rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.11.tgz", + "integrity": "sha512-GvsCITGAyDCxxsJ+X6prJexFQEhOCJaIlUbsAvjzSI5o5O7j2dle3jWvz5Z5aOdpOxW6ol3vI1+0ut+641F1+w==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", + "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/native-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", + "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", + "dev": true, + "optional": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/next": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/next/-/next-13.0.0.tgz", + "integrity": "sha512-puH1WGM6rGeFOoFdXXYfUxN9Sgi4LMytCV5HkQJvVUOhHfC1DoVqOfvzaEteyp6P04IW+gbtK2Q9pInVSrltPA==", + "dependencies": { + "@next/env": "13.0.0", + "@swc/helpers": "0.4.11", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.0", + "use-sync-external-store": "1.2.0" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=14.6.0" + }, + "optionalDependencies": { + "@next/swc-android-arm-eabi": "13.0.0", + "@next/swc-android-arm64": "13.0.0", + "@next/swc-darwin-arm64": "13.0.0", + "@next/swc-darwin-x64": "13.0.0", + "@next/swc-freebsd-x64": "13.0.0", + "@next/swc-linux-arm-gnueabihf": "13.0.0", + "@next/swc-linux-arm64-gnu": "13.0.0", + "@next/swc-linux-arm64-musl": "13.0.0", + "@next/swc-linux-x64-gnu": "13.0.0", + "@next/swc-linux-x64-musl": "13.0.0", + "@next/swc-win32-arm64-msvc": "13.0.0", + "@next/swc-win32-ia32-msvc": "13.0.0", + "@next/swc-win32-x64-msvc": "13.0.0" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^6.0.0 || ^7.0.0", + "react": "^18.0.0-0", + "react-dom": "^18.0.0-0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-auth": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.22.1.tgz", + "integrity": "sha512-NTR3f6W7/AWXKw8GSsgSyQcDW6jkslZLH8AiZa5PQ09w1kR8uHtR9rez/E9gAq/o17+p0JYHE8QjF3RoniiObA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "next": "^12.2.5 || ^13", + "nodemailer": "^6.6.5", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + }, + "peerDependenciesMeta": { + "nodemailer": { + "optional": true + } + } + }, + "node_modules/next-fonts": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/next-fonts/-/next-fonts-1.5.1.tgz", + "integrity": "sha512-pgEJ40xO1oRhM6RqhQJ9CzuZOFp6Zq+aAD/V1P9sq/wdepvLzhFxDm3lCZNoE7+78NSuMKgT6b1qeXSsqWuUMQ==", + "dependencies": { + "file-loader": "^6.0.0", + "url-loader": "^4.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/next-with-less": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/next-with-less/-/next-with-less-2.0.5.tgz", + "integrity": "sha512-1MJDcgFOPucFPCMXV7rTqcWiLI2nLSBi8bA6msvkiNLhYyZMXaFl4MkyYf7eOEUUEtA/c5eD0grPhbcDkrKqPQ==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1" + }, + "peerDependencies": { + "less": "*", + "less-loader": ">= 7.0.0", + "next": ">= 11.0.1" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-abort-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", + "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", + "dev": true + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nx": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.1.1.tgz", + "integrity": "sha512-afwLiY25+wCK7NR1lGVn2nIJRSqOmcJqJxWsz1A2FJJaHXogF4ja0USgjDksxXQGfKsbOyOq4Wvzel1YhtuaoQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/cli": "15.1.1", + "@nrwl/tao": "15.1.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx-cloud": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/nx-cloud/-/nx-cloud-16.0.5.tgz", + "integrity": "sha512-13P7r0aKikjBtmdZrNorwXzVPeVIV4MLEwqGY+DEG6doLBtI5KqEQk/d5B5l2dCF2BEi/LXEmLYCmf9gwbOJ+Q==", + "dependencies": { + "@nrwl/nx-cloud": "16.0.5", + "axios": "1.1.3", + "chalk": "^4.1.0", + "dotenv": "~10.0.0", + "fs-extra": "^11.1.0", + "node-machine-id": "^1.1.12", + "open": "~8.4.0", + "strip-json-comments": "^3.1.1", + "tar": "6.1.11", + "yargs-parser": ">=21.1.1" + }, + "bin": { + "nx-cloud": "bin/nx-cloud.js" + } + }, + "node_modules/nx-cloud/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "dev": true, + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/openid-client": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.2.tgz", + "integrity": "sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==", + "dev": true, + "dependencies": { + "jose": "^4.14.1", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-network-drive": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/path-is-network-drive/-/path-is-network-drive-1.0.20.tgz", + "integrity": "sha512-p5wCWlRB4+ggzxWshqHH9aF3kAuVu295NaENXmVhThbZPJQBeJdxZTP6CIoUR+kWHDUW56S9YcaO1gXnc/BOxw==", + "dev": true, + "dependencies": { + "tslib": "^2" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-strip-sep": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/path-strip-sep/-/path-strip-sep-1.0.17.tgz", + "integrity": "sha512-+2zIC2fNgdilgV7pTrktY6oOxxZUo9x5zJYfTzxsGze5kSGDDwhA5/0WlBn+sUyv/WuuyYn3OfM+Ue5nhdQUgA==", + "dev": true, + "dependencies": { + "tslib": "^2" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/postcss": { + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", + "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "dev": true, + "dependencies": { + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", + "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dev": true, + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/preact-render-to-string/node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "dependencies": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-final-form": { + "version": "6.5.9", + "resolved": "https://registry.npmjs.org/react-final-form/-/react-final-form-6.5.9.tgz", + "integrity": "sha512-x3XYvozolECp3nIjly+4QqxdjSSWfcnpGEL5K8OBT6xmGrq5kBqbA6+/tOqoom9NwqIPPbxPNsOViFlbKgowbA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.15.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/final-form" + }, + "peerDependencies": { + "final-form": "^4.20.4", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-loader-spinner": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-5.3.4.tgz", + "integrity": "sha512-G2vw4ssX+RDZ/vfaeva06yfNqyFViv/u+tVZ3kFLy5TKNlNx2DbuwreBSpRtPespQA+VxinxUJsigwLwG9erOg==", + "dependencies": { + "react-is": "^18.2.0", + "styled-components": "^5.3.5", + "styled-tools": "^1.7.2" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz", + "integrity": "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "dependencies": { + "lodash": "^4.0.1" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "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" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-copy": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", + "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-copy/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-copy/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/rollup-plugin-copy/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/rollup-plugin-peer-deps-external": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz", + "integrity": "sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==", + "dev": true, + "peerDependencies": { + "rollup": "*" + } + }, + "node_modules/rollup-plugin-postcss": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^5.0.1", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "8.x" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-typescript2": { + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.2.tgz", + "integrity": "sha512-hRwEYR1C8xDGVVMFJQdEVnNAeWRvpaY97g5mp3IeLnzhNXzSVq78Ye/BJ9PAaUfN4DXa/uDnqerifMOaMFY54Q==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.1.2", + "@yarn-tool/resolve-package": "^1.0.40", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.0.0", + "resolve": "^1.20.0", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rsuite": { + "version": "5.22.2", + "resolved": "https://registry.npmjs.org/rsuite/-/rsuite-5.22.2.tgz", + "integrity": "sha512-uUiA/B/wj28m18jyZpjkBYWhRUKxw/7U5QMwBpBXBYGH/jQC1c7ag44sbJAZu6yAS9hFP+8GHP7nTD0MAWil1A==", + "dependencies": { + "@babel/runtime": "^7.19.4", + "@juggle/resize-observer": "^3.4.0", + "@rsuite/icons": "^1.0.2", + "@types/chai": "^4.3.3", + "@types/lodash": "^4.14.184", + "@types/prop-types": "^15.7.5", + "@types/react-window": "^1.8.5", + "classnames": "^2.3.1", + "date-fns": "^2.29.3", + "dom-lib": "^3.1.3", + "lodash": "^4.17.11", + "prop-types": "^15.8.1", + "react-window": "^1.8.7", + "rsuite-table": "^5.8.0", + "schema-typed": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/rsuite-color-picker": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rsuite-color-picker/-/rsuite-color-picker-0.2.0.tgz", + "integrity": "sha512-t+M9tJ/gpKdb9Y3TWKkDcHfKjll6sfkVCfJvEjFJaxXijdc1BUdanQBzwS0oP1vvMOihdhWS/OP0csv+2gvwHg==", + "dependencies": { + "react-color": "^2.19.3" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "rsuite": ">=4.0.0" + } + }, + "node_modules/rsuite-table": { + "version": "5.10.5", + "resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-5.10.5.tgz", + "integrity": "sha512-yrJILC2rtB8YcIdF6b+EjE41h2jW1dzwC9on7NjAZIAIrh7wGz8Y35J+ra40HaJUXevdItOCZhzF+Nj8gFUfIg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@juggle/resize-observer": "^3.3.1", + "@rsuite/icons": "^1.0.0", + "classnames": "^2.3.1", + "dom-lib": "^3.1.3", + "lodash": "^4.17.21", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "prop-types": "^15.7.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/rsuite-table/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", + "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "devOptional": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-typed": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-2.0.3.tgz", + "integrity": "sha512-4KckVnJjTtVugYpSAoQrcH4quE4yIVTvI/nHEqtwdceBr/ZCuH2LfV8/gaZFrYU7cwwyufLKaswt28aqQ1T9ww==", + "dependencies": { + "@babel/runtime": "^7.16.0" + } + }, + "node_modules/schema-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", + "dev": true + }, + "node_modules/style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/styled-components": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", + "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", + "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/styled-tools": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/styled-tools/-/styled-tools-1.7.2.tgz", + "integrity": "sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==" + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/stylus": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", + "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "dev": true, + "dependencies": { + "css": "^3.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.0.tgz", + "integrity": "sha512-gNUEjjozR+oZ8cuC/Fx4LVXqZOgDKvpW9t2hpXHcxjfPYqSjQftaGwZUK+wL9B0QJ26uS6p1EmoWHmvld1dF7g==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.12", + "klona": "^2.0.5", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/stylus-loader/node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylus/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-loader": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "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" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/upath2": { + "version": "3.1.19", + "resolved": "https://registry.npmjs.org/upath2/-/upath2-3.1.19.tgz", + "integrity": "sha512-d23dQLi8nDWSRTIQwXtaYqMrHuca0As53fNiTLLFDmsGBbepsZepISaB2H1x45bDFN/n3Qw9bydvyZEacTrEWQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "path-is-network-drive": "^1.0.20", + "path-strip-sep": "^1.0.17", + "tslib": "^2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "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.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", + "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", + "dev": true + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/compat-data": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz", + "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==", + "dev": true + }, + "@babel/core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz", + "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.2", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-module-transforms": "^7.20.2", + "@babel/helpers": "^7.20.1", + "@babel/parser": "^7.20.2", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz", + "integrity": "sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", + "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "requires": { + "@babel/types": "^7.21.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", + "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.19.1", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", + "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.0", + "@babel/types": "^7.19.0" + } + }, + "@babel/helpers": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz", + "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.0" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz", + "integrity": "sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.20.2.tgz", + "integrity": "sha512-nkBH96IBmgKnbHQ5gXFrcmez+Z9S2EIDKDQGp005ROqBigc88Tky4rzCnlP/lnlj245dCEQl4/YyV0V1kYh5dw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/plugin-syntax-decorators": "^7.19.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz", + "integrity": "sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.19.0.tgz", + "integrity": "sha512-xaBZUEDntt4faL1yN8oIFlhfXeQAWJW7CLKYsHTUqriCUbj8xOra8bfxxKGi/UwExPFBuPdH4XfHc9rGQhrVkQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz", + "integrity": "sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz", + "integrity": "sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.19.1", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz", + "integrity": "sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", + "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", + "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-simple-access": "^7.19.4" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", + "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-validator-identifier": "^7.19.1" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", + "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.19.0", + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz", + "integrity": "sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz", + "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", + "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.19.0" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", + "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz", + "integrity": "sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "requires": { + "regenerator-runtime": "^0.13.11" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + } + } + }, + "@babel/runtime-corejs3": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz", + "integrity": "sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg==", + "dev": true, + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.10" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "optional": true, + "peer": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "@cypress/webpack-preprocessor": { + "version": "5.15.5", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.15.5.tgz", + "integrity": "sha512-ZV2ZylabogNDK3+xwDIWswudCJMFDT9XU6tTGni2xWow/brBvI55sEqcjvb6+9x8skMSPM6vLxdvf/FAOmNEFQ==", + "dev": true, + "requires": { + "@babel/parser": "7.13.0", + "bluebird": "3.7.1", + "debug": "^4.3.2", + "fs-extra": "^10.1.0", + "loader-utils": "^2.0.0", + "lodash": "^4.17.20", + "md5": "2.3.0", + "source-map": "^0.6.1", + "webpack-virtual-modules": "^0.4.4" + }, + "dependencies": { + "@babel/parser": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.0.tgz", + "integrity": "sha512-w80kxEMFhE3wjMOQkfdTvv0CSdRSJZptIlLhU4eU/coNJeWjduspUFz+IRnBbAq6m5XYBFMoT1TNkk9K9yf10g==", + "dev": true + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + } + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "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" + }, + "dependencies": { + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "requires": {} + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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/environment": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", + "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "jest-mock": "^28.1.3" + } + }, + "@jest/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", + "dev": true, + "requires": { + "expect": "^28.1.3", + "jest-snapshot": "^28.1.3" + } + }, + "@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2" + } + }, + "@jest/fake-timers": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", + "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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/globals": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", + "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", + "dev": true, + "requires": { + "@jest/environment": "^28.1.3", + "@jest/expect": "^28.1.3", + "@jest/types": "^28.1.3" + } + }, + "@jest/reporters": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.1.tgz", + "integrity": "sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^28.1.1", + "@jest/test-result": "^28.1.1", + "@jest/transform": "^28.1.1", + "@jest/types": "^28.1.1", + "@jridgewell/trace-mapping": "^0.3.7", + "@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.1", + "jest-util": "^28.1.1", + "jest-worker": "^28.1.1", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^9.0.0" + } + }, + "@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/source-map": { + "version": "28.1.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", + "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.13", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + } + }, + "@jest/test-result": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz", + "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==", + "dev": true, + "requires": { + "@jest/console": "^28.1.1", + "@jest/types": "^28.1.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/test-sequencer": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", + "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", + "dev": true, + "requires": { + "@jest/test-result": "^28.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.3", + "slash": "^3.0.0" + }, + "dependencies": { + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + } + } + }, + "@jest/transform": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", + "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "requires": { + "@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": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", + "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==" + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "requires": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, + "@mui/base": { + "version": "5.0.0-beta.2", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.2.tgz", + "integrity": "sha512-R9R+aqrl1QhZJaO05rhvooqxOaf7SKpQ+EjW80sbP3ticTVmLmrn4YBLQS7/ML+WXdrkrPtqSmKFdSE5Ik3gBQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@popperjs/core": "^2.11.7", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.2.tgz", + "integrity": "sha512-aOLCXMCySMFL2WmUhnz+DjF84AoFVu8rn35OsL759HXOZMz8zhEwVf5w/xxkWx7DycM2KXDTgAvYW48nTfqTLA==", + "peer": true + }, + "@mui/icons-material": { + "version": "5.11.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", + "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "@mui/material": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.2.tgz", + "integrity": "sha512-Pfke1l0GG2OJb/Nr10aVr8huoBFcBTdWKV5iFSTEHqf9c2C1ZlyYMISn7ui6X3Gix8vr+hP5kVqH1LAWwQSb6w==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-beta.2", + "@mui/core-downloads-tracker": "^5.13.2", + "@mui/system": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + } + }, + "@mui/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.2.tgz", + "integrity": "sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peer": true, + "requires": {} + }, + "@mui/utils": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", + "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "requires": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@mui/x-date-pickers": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.5.0.tgz", + "integrity": "sha512-dRCO1mzHjfOqsa4LdKxiXQnV0cuGiAkliyxSDCdRn6clK2WdF9Oj+1+4Mkx7fcJA61SV1eP4Yg29s0/VDsZKZw==", + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.12.3", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + } + }, + "@next/env": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.0.0.tgz", + "integrity": "sha512-65v9BVuah2Mplohm4+efsKEnoEuhmlGm8B2w6vD1geeEP2wXtlSJCvR/cCRJ3fD8wzCQBV41VcMBQeYET6MRkg==" + }, + "@next/eslint-plugin-next": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.0.0.tgz", + "integrity": "sha512-z+gnX4Zizatqatc6f4CQrcC9oN8Us3Vrq/OLyc98h7K/eWctrnV91zFZodmJHUjx0cITY8uYM7LXD7IdYkg3kg==", + "dev": true, + "requires": { + "glob": "7.1.7" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "@next/swc-android-arm-eabi": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.0.0.tgz", + "integrity": "sha512-+DUQkYF93gxFjWY+CYWE1QDX6gTgnUiWf+W4UqZjM1Jcef8U97fS6xYh+i+8rH4MM0AXHm7OSakvfOMzmjU6VA==", + "optional": true + }, + "@next/swc-android-arm64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.0.0.tgz", + "integrity": "sha512-RW9Uy3bMSc0zVGCa11klFuwfP/jdcdkhdruqnrJ7v+7XHm6OFKkSRzX6ee7yGR1rdDZvTnP4GZSRSpzjLv/N0g==", + "optional": true + }, + "@next/swc-darwin-arm64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.0.0.tgz", + "integrity": "sha512-APA26nps1j4qyhOIzkclW/OmgotVHj1jBxebSpMCPw2rXfiNvKNY9FA0TcuwPmUCNqaTnm703h6oW4dvp73A4Q==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.0.0.tgz", + "integrity": "sha512-qsUhUdoFuRJiaJ7LnvTQ6GZv1QnMDcRXCIjxaN0FNVXwrjkq++U7KjBUaxXkRzLV4C7u0NHLNOp0iZwNNE7ypw==", + "optional": true + }, + "@next/swc-freebsd-x64": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.0.0.tgz", + "integrity": "sha512-sCdyCbboS7CwdnevKH9J6hkJI76LUw1jVWt4eV7kISuLiPba3JmehZSWm80oa4ADChRVAwzhLAo2zJaYRrInbg==", + "optional": true + }, + "@next/swc-linux-arm-gnueabihf": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.0.0.tgz", + "integrity": "sha512-/X/VxfFA41C9jrEv+sUsPLQ5vbDPVIgG0CJrzKvrcc+b+4zIgPgtfsaWq9ockjHFQi3ycvlZK4TALOXO8ovQ6Q==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.0.0.tgz", + "integrity": "sha512-x6Oxr1GIi0ZtNiT6jbw+JVcbEi3UQgF7mMmkrgfL4mfchOwXtWSHKTSSPnwoJWJfXYa0Vy1n8NElWNTGAqoWFw==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.0.0.tgz", + "integrity": "sha512-SnMH9ngI+ipGh3kqQ8+mDtWunirwmhQnQeZkEq9e/9Xsgjf04OetqrqRHKM1HmJtG2qMUJbyXFJ0F81TPuT+3g==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.0.0.tgz", + "integrity": "sha512-VSQwTX9EmdbotArtA1J67X8964oQfe0xHb32x4tu+JqTR+wOHyG6wGzPMdXH2oKAp6rdd7BzqxUXXf0J+ypHlw==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.0.0.tgz", + "integrity": "sha512-xBCP0nnpO0q4tsytXkvIwWFINtbFRyVY5gxa1zB0vlFtqYR9lNhrOwH3CBrks3kkeaePOXd611+8sjdUtrLnXA==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.0.0.tgz", + "integrity": "sha512-NutwDafqhGxqPj/eiUixJq9ImS/0sgx6gqlD7jRndCvQ2Q8AvDdu1+xKcGWGNnhcDsNM/n1avf1e62OG1GaqJg==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.0.0.tgz", + "integrity": "sha512-zNaxaO+Kl/xNz02E9QlcVz0pT4MjkXGDLb25qxtAzyJL15aU0+VjjbIZAYWctG59dvggNIUNDWgoBeVTKB9xLg==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.0.0.tgz", + "integrity": "sha512-FFOGGWwTCRMu9W7MF496Urefxtuo2lttxF1vwS+1rIRsKvuLrWhVaVTj3T8sf2EBL6gtJbmh4TYlizS+obnGKA==", + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nrwl/cli": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.1.1.tgz", + "integrity": "sha512-rfpIi/zWpL6YyW7Z10oc65FwePvFP0uo7L1f32wMtC25dHh12YD3OS24VniCOrFYWjHNIu7X7hdHx2lcDXPRBg==", + "dev": true, + "requires": { + "nx": "15.1.1" + } + }, + "@nrwl/cypress": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-15.2.0.tgz", + "integrity": "sha512-dwYeEgQoKvN8B2mW/D5WBZkrwptYGJzgVLISsweze+A+472u8o5woJPs3ytMwrRt5d1ORC6RFT1jf8GMJaPFiw==", + "dev": true, + "requires": { + "@babel/core": "^7.0.1", + "@babel/preset-env": "^7.0.0", + "@cypress/webpack-preprocessor": "^5.12.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "babel-loader": "^8.0.2", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "semver": "7.3.4", + "ts-loader": "^9.3.1", + "tsconfig-paths-webpack-plugin": "3.5.2", + "tslib": "^2.3.0", + "webpack": "^4 || ^5", + "webpack-node-externals": "^3.0.0" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + } + } + }, + "@nrwl/devkit": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.1.1.tgz", + "integrity": "sha512-Dh26LjMh/BMmoOja2WSSVSAaVDI59qIg46dZmfU7fcu+Y4FFMor3PMAAo5QVbfLasbx4HG6vrvQlhuwWnXm4hw==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/eslint-plugin-nx": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.1.1.tgz", + "integrity": "sha512-8AgmcSfmOne9i8bTCNh8OoNxCMY5czdC1L2X0zYxMxvK64ZN8k/W7MFkJY5ogthCxVlMKyzVIpSFRE9as1tA4g==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.1.1", + "@nrwl/workspace": "15.1.1", + "@typescript-eslint/utils": "^5.36.1", + "chalk": "4.1.0", + "confusing-browser-globals": "^1.0.9", + "semver": "7.3.4" + } + }, + "@nrwl/jest": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.2.0.tgz", + "integrity": "sha512-bDsbYbFvIu/N5otKW6sqXO+kg3UEmjjLHiQcXblCXC98d6Mb+GhIP7f0aeROKmiAAsmxubPOHqwVw9PDtY01dw==", + "dev": true, + "requires": { + "@jest/reporters": "28.1.1", + "@jest/test-result": "28.1.1", + "@nrwl/devkit": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "28.1.1", + "jest-resolve": "28.1.1", + "jest-util": "28.1.1", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + } + } + }, + "@nrwl/js": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-15.2.0.tgz", + "integrity": "sha512-X7dCi7SP0kL2nnWWcTYaLVqfT+zNsf6+phMvhNi/e6gftjqyU7pGlkPtbc4EyjKZjsTmYQboLx/2O3Im8BSbXw==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "fast-glob": "3.2.7", + "fs-extra": "^10.1.0", + "ignore": "^5.0.4", + "js-tokens": "^4.0.0", + "minimatch": "3.0.5", + "source-map-support": "0.5.19", + "tree-kill": "1.2.2" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "@nrwl/linter": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.1.1.tgz", + "integrity": "sha512-FQrek2JVpMo6iVVLm4rhGVIyBRWtGJ0Htsd9KM7uOXZd75jKDFVHtWY/HlKcvfhlJ/0+ZGBArKiJjFlbD4lYpw==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.1.1", + "@nrwl/jest": "15.1.1", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.1.1", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "@nrwl/jest": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.1.1.tgz", + "integrity": "sha512-NRQcEy4lcEjHrFmv6UR2gg3RviLNRiYgdqUiboSo0tD2fIqlLEz7m1T/l54f1/Dt0GWeVhzfQGk8WJKkbjZHlQ==", + "dev": true, + "requires": { + "@jest/reporters": "28.1.1", + "@jest/test-result": "28.1.1", + "@nrwl/devkit": "15.1.1", + "@phenomnomnominal/tsquery": "4.1.1", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "28.1.1", + "jest-resolve": "28.1.1", + "jest-util": "28.1.1", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0" + } + } + } + }, + "@nrwl/next": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/next/-/next-15.2.0.tgz", + "integrity": "sha512-MeaF6lMnJrXYGMu3Yc1GqryPb2neCoaqwezaMfCKO1SWbcmxQT0N6eNxl6c32HXMQCHttplR5PosSZ2zlAlRcg==", + "dev": true, + "requires": { + "@babel/plugin-proposal-decorators": "^7.14.5", + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/react": "15.2.0", + "@nrwl/webpack": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@svgr/webpack": "^6.1.2", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "fs-extra": "^10.1.0", + "ignore": "^5.0.4", + "semver": "7.3.4", + "ts-node": "10.9.1", + "tsconfig-paths": "^3.9.0", + "url-loader": "^4.1.1", + "webpack-merge": "^5.8.0" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + } + } + }, + "@nrwl/nx-cloud": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@nrwl/nx-cloud/-/nx-cloud-16.0.5.tgz", + "integrity": "sha512-1p82ym8WE9ziejwgPslstn19iV/VkHfHfKr/5YOnfCHQS+NxUf92ogcYhHXtqWLblVZ9Zs4W4pkSXK4e04wCmQ==", + "requires": { + "nx-cloud": "16.0.5" + } + }, + "@nrwl/react": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/react/-/react-15.2.0.tgz", + "integrity": "sha512-XPd/HA34P3oSOM51W9lhFjyRVpbzZJFdjLEO+hVLIVQAzlypP7P/9KTfiScD3Wu824euG3PYFOvIyVkoS6VzOQ==", + "dev": true, + "requires": { + "@babel/core": "^7.15.0", + "@babel/preset-react": "^7.14.5", + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/storybook": "15.2.0", + "@nrwl/web": "15.2.0", + "@nrwl/webpack": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", + "@svgr/webpack": "^6.1.2", + "chalk": "4.1.0", + "css-loader": "^6.4.0", + "minimatch": "3.0.5", + "react-refresh": "^0.10.0", + "semver": "7.3.4", + "style-loader": "^3.3.0", + "stylus": "^0.55.0", + "stylus-loader": "^7.1.0", + "url-loader": "^4.1.1", + "webpack": "^5.75.0", + "webpack-merge": "^5.8.0" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + } + } + }, + "@nrwl/rollup": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/rollup/-/rollup-15.2.0.tgz", + "integrity": "sha512-wTB/uyhLcQxfSyLCrpHknl6srRJrdLxU12HVzb6DOxB754vQcrjV9C+OGpDuiMZm2nUPF6Sy0ICtIPNxISiFFA==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/workspace": "15.2.0", + "@rollup/plugin-babel": "^5.3.0", + "@rollup/plugin-commonjs": "^20.0.0", + "@rollup/plugin-image": "^2.1.0", + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-node-resolve": "^13.0.4", + "autoprefixer": "^10.4.9", + "babel-plugin-transform-async-to-promises": "^0.8.15", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "fs-extra": "^10.1.0", + "postcss": "^8.4.14", + "rollup": "^2.56.2", + "rollup-plugin-copy": "^3.4.0", + "rollup-plugin-peer-deps-external": "^2.2.4", + "rollup-plugin-postcss": "^4.0.1", + "rollup-plugin-typescript2": "^0.31.1", + "rxjs": "^6.5.4", + "tslib": "^2.3.0" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + } + } + }, + "@nrwl/storybook": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/storybook/-/storybook-15.2.0.tgz", + "integrity": "sha512-rlLU49flCY2ONELvkbx9TA/l4tJ4L1B3kcdRUHPaj5pEL+XkyG1A4JE3ZVCZcdRzYIkkqK6AWcF5/ey6NXW7HA==", + "dev": true, + "requires": { + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/workspace": "15.2.0", + "dotenv": "~10.0.0", + "semver": "7.3.4" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + } + } + }, + "@nrwl/tao": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.1.1.tgz", + "integrity": "sha512-FCmR9Rq+Nza7G5lXYPzYgVfYz2nI/7yDhTaenwBOyoxYixppfWTEx25mpsPtF38x996b/wp6gREuC4OPov7NWQ==", + "dev": true, + "requires": { + "nx": "15.1.1" + } + }, + "@nrwl/web": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-15.2.0.tgz", + "integrity": "sha512-tXc7IrVgJvwabl2fWFxatcN9B24Igylla+jmGnWf+pmoWyH5+BLY/HjBCz/ikcY2uGAKh7mBAZzm8bryfD4vMw==", + "dev": true, + "requires": { + "@babel/core": "^7.15.0", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-decorators": "^7.14.5", + "@babel/plugin-transform-runtime": "^7.15.0", + "@babel/preset-env": "^7.15.0", + "@babel/preset-typescript": "^7.15.0", + "@babel/runtime": "^7.14.8", + "@nrwl/cypress": "15.2.0", + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/linter": "15.2.0", + "@nrwl/rollup": "15.2.0", + "@nrwl/webpack": "15.2.0", + "@nrwl/workspace": "15.2.0", + "babel-plugin-const-enum": "^1.0.1", + "babel-plugin-macros": "^2.8.0", + "babel-plugin-transform-typescript-metadata": "^0.3.1", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "http-server": "^14.1.0", + "ignore": "^5.0.4", + "tslib": "^2.3.0" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + } + } + }, + "@nrwl/webpack": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/webpack/-/webpack-15.2.0.tgz", + "integrity": "sha512-xN02UJz1vV8HaK9DMEghpShjNpgxHb2jM/I1mtjY2jTUBjdlZ8s/90avzRwZap4m41XTVyiLOfjSlxmevq0ePA==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/js": "15.2.0", + "@nrwl/workspace": "15.2.0", + "autoprefixer": "^10.4.9", + "babel-loader": "^8.2.2", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001394", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "copy-webpack-plugin": "^10.2.4", + "css-loader": "^6.4.0", + "css-minimizer-webpack-plugin": "^3.4.1", + "dotenv": "~10.0.0", + "file-loader": "^6.2.0", + "fork-ts-checker-webpack-plugin": "7.2.13", + "fs-extra": "^10.1.0", + "ignore": "^5.0.4", + "less": "3.12.2", + "less-loader": "^11.1.0", + "license-webpack-plugin": "^4.0.2", + "loader-utils": "^2.0.3", + "mini-css-extract-plugin": "~2.4.7", + "parse5": "4.0.0", + "parse5-html-rewriting-stream": "6.0.1", + "postcss": "^8.4.14", + "postcss-import": "~14.1.0", + "postcss-loader": "^6.1.1", + "raw-loader": "^4.0.2", + "rxjs": "^6.5.4", + "sass": "^1.42.1", + "sass-loader": "^12.2.0", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.0", + "stylus": "^0.55.0", + "stylus-loader": "^7.1.0", + "terser-webpack-plugin": "^5.3.3", + "ts-loader": "^9.3.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^3.9.0", + "tsconfig-paths-webpack-plugin": "3.5.2", + "tslib": "^2.3.0", + "webpack": "^5.75.0", + "webpack-dev-server": "^4.9.3", + "webpack-merge": "^5.8.0", + "webpack-node-externals": "^3.0.0", + "webpack-sources": "^3.2.3", + "webpack-subresource-integrity": "^5.1.0" + }, + "dependencies": { + "@nrwl/cli": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.2.0.tgz", + "integrity": "sha512-tbl8iTEOuNWTs7HnwFqXXyu4jhR8OYyelECicwB7RkcVqihokhBvlvMdWaVlUYNgiOLWWy/elCEfZs4e7QLBZw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/devkit": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.2.0.tgz", + "integrity": "sha512-njvwu5gWvV1GLlnLs50CIfKQ7piSw81DmlAtnHI/UD9DwzOrQwasd189X5dMrPMDwlif/WObvzcbdMS8M9wm/w==", + "dev": true, + "requires": { + "@phenomnomnominal/tsquery": "4.1.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tslib": "^2.3.0" + } + }, + "@nrwl/linter": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-15.2.0.tgz", + "integrity": "sha512-3gwcFTzCVWI0DtzL8vA+Zfxp73YQkNxyn7uWuRTXYzsbYx/jmE3QDYK31APyli8dxQoYaE9Bp3sVOnLLRFyutg==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@phenomnomnominal/tsquery": "4.1.1", + "nx": "15.2.0", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + } + }, + "@nrwl/tao": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.2.0.tgz", + "integrity": "sha512-Z8oRlO7JO/MfxahglZhD/XgQdvSZo3AzfLfdzQDDHQeL7F8sjwoQvNinsUDH5Vqa2/mAcbBsnp+8JubwdbAJSw==", + "dev": true, + "requires": { + "nx": "15.2.0" + } + }, + "@nrwl/workspace": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.2.0.tgz", + "integrity": "sha512-IPvjSN0Y2GyarnLBUIAl5dz8l8u2UBD30kSiE2eAphH2VgTNu/pdQYEZEdnNUCM8JB6pnPZj7cSXciLxa3FkMQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.2.0", + "@nrwl/jest": "15.2.0", + "@nrwl/linter": "15.2.0", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.2.0", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "less": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "native-request": "^1.0.5", + "source-map": "~0.6.0", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + } + } + }, + "nx": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.2.0.tgz", + "integrity": "sha512-lNoI37FYsN11LiR/XiO0GJqlZDH/ANe/UR1cw2VDipJqbae9rWfi/Td6zjMlymSEraullsiB+Ur7kavId/904w==", + "dev": true, + "requires": { + "@nrwl/cli": "15.2.0", + "@nrwl/tao": "15.2.0", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + } + } + }, + "@nrwl/workspace": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.1.1.tgz", + "integrity": "sha512-YI5GApBJzltOIz6v58tMvBL3FLQ1z++Akv52WzHybUOski2uKT7FbZwmOebJ2nGF0gPf+J4VOyRFK8pHum/SqQ==", + "dev": true, + "requires": { + "@nrwl/devkit": "15.1.1", + "@nrwl/jest": "15.1.1", + "@nrwl/linter": "15.1.1", + "@parcel/watcher": "2.0.4", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "nx": "15.1.1", + "open": "^8.4.0", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "@nrwl/jest": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.1.1.tgz", + "integrity": "sha512-NRQcEy4lcEjHrFmv6UR2gg3RviLNRiYgdqUiboSo0tD2fIqlLEz7m1T/l54f1/Dt0GWeVhzfQGk8WJKkbjZHlQ==", + "dev": true, + "requires": { + "@jest/reporters": "28.1.1", + "@jest/test-result": "28.1.1", + "@nrwl/devkit": "15.1.1", + "@phenomnomnominal/tsquery": "4.1.1", + "chalk": "4.1.0", + "dotenv": "~10.0.0", + "identity-obj-proxy": "3.0.0", + "jest-config": "28.1.1", + "jest-resolve": "28.1.1", + "jest-util": "28.1.1", + "resolve.exports": "1.1.0", + "tslib": "^2.3.0" + } + } + } + }, + "@panva/hkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.0.2.tgz", + "integrity": "sha512-MSAs9t3Go7GUkMhpKC44T58DJ5KGk2vBo+h1cqQeqlMfdGkxaVB78ZWpv9gYi/g2fa4sopag9gJsNvS8XGgWJA==", + "dev": true + }, + "@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, + "@phenomnomnominal/tsquery": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz", + "integrity": "sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ==", + "dev": true, + "requires": { + "esquery": "^1.0.1" + } + }, + "@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.9.tgz", + "integrity": "sha512-7QV4cqUwhkDIHpMAZ9mestSJ2DMIotVTbOUwbiudhjCRTAWWKIaBecELiEM2LT3AHFeOAaHIcFu4dbXjX+9GBA==", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.3", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true + }, + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-commonjs": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-20.0.0.tgz", + "integrity": "sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "commondir": "^1.0.1", + "estree-walker": "^2.0.1", + "glob": "^7.1.6", + "is-reference": "^1.2.1", + "magic-string": "^0.25.7", + "resolve": "^1.17.0" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "@rollup/plugin-image": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-image/-/plugin-image-2.1.1.tgz", + "integrity": "sha512-AgP4U85zuQJdUopLUCM+hTf45RepgXeTb8EJsleExVy99dIoYpt3ZlDYJdKmAc2KLkNntCDg6BPJvgJU3uGF+g==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "mini-svg-data-uri": "^1.2.3" + } + }, + "@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.0.8" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "dependencies": { + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + } + } + }, + "@rsuite/icon-font": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@rsuite/icon-font/-/icon-font-4.0.0.tgz", + "integrity": "sha512-rZTgpTH3H3HLczCA2rnkWfoMKm0ZXoRzsrkVujfP/FfslnKUMvO6w56pa8pCvhWGpNEPUsLS2ULnFGpTEcup/Q==" + }, + "@rsuite/icons": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@rsuite/icons/-/icons-1.0.2.tgz", + "integrity": "sha512-Y7vJNDQpJnFlyYSUXQ2iQ9Meg7+ZKcrIenhpYDdM3c7vYDE/L7pml+hrK28jk6QfV/QkVv5B504D+l7aM6AAJQ==", + "requires": { + "@rsuite/icon-font": "^4.0.0", + "classnames": "^2.2.5", + "insert-css": "^2.0.0", + "lodash": "^4.17.20" + } + }, + "@rushstack/eslint-patch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "dev": true + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz", + "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz", + "integrity": "sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz", + "integrity": "sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "dev": true, + "requires": {} + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "dev": true, + "requires": {} + }, + "@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "dev": true, + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + } + }, + "@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + } + }, + "@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + } + }, + "@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + } + }, + "@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "dev": true, + "requires": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + } + }, + "@swc/core": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.18.tgz", + "integrity": "sha512-VChk3ldLhmVoX3Hd2M3Y4j960T0lo2Zus60iZoWST6P65RVPt8BatFVVPAB9dABy1dB5zn1BCpHlH85yXVysQw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@swc/core-darwin-arm64": "1.3.18", + "@swc/core-darwin-x64": "1.3.18", + "@swc/core-linux-arm-gnueabihf": "1.3.18", + "@swc/core-linux-arm64-gnu": "1.3.18", + "@swc/core-linux-arm64-musl": "1.3.18", + "@swc/core-linux-x64-gnu": "1.3.18", + "@swc/core-linux-x64-musl": "1.3.18", + "@swc/core-win32-arm64-msvc": "1.3.18", + "@swc/core-win32-ia32-msvc": "1.3.18", + "@swc/core-win32-x64-msvc": "1.3.18" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.18.tgz", + "integrity": "sha512-4UEQ+LyzDFTszEy4LCU50h4cjVNJcNwD87aVBT/8i6YXj5dyMki/TrkIQ6Bhv7g5beg2GRncB2ndjN66r8I8+w==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-darwin-x64": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.18.tgz", + "integrity": "sha512-DSCd7eVr+4ukffNnvhrFmUoCF0VLOXPgGmdwm6u0irLWOLtr2VZNZcf7UF+t/Y9jPKmXz3OY6lVgwtjxZhiklQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.18.tgz", + "integrity": "sha512-9dy6qJiWAls9OrBvrWbFDbjEkuOPrEP6OsKyrQWTMqLjCLwgLa3g4yC0YtPdUa/A8uyNVKtRcq+NXoKW+mP/QQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.18.tgz", + "integrity": "sha512-8FZjiUSM4JBQTD4sV7Y6BNMdo0oDlqa8xYVaAimuIBL8ixD/Fb+0GIxKdB59yKRVQyuXJRa6Pwzd7zk3wY5T0Q==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.18.tgz", + "integrity": "sha512-0zNqfFeAHZp37lu+lTVvZKfDM10EIoYJtv9sWz+0EA5mkzwj4NtC3ialTIjcPAyJ9Oq4zBtToW2hv7qEtyBHZw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.18.tgz", + "integrity": "sha512-PA3Cc97Kc6W6RtpBLeJaoXLCRL5dJLYd2dszf+f5hGHHJybh6eXGIU0ZkZr898NUHoL8fT6Mg6I4JCNImq/yBg==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.18.tgz", + "integrity": "sha512-RiZXHwED8cfD/zoBG01iY8YZtOF/8t9XHZ1JqCx9PWOMjXD3Vc8F2I7bp1Qg6ahzWEaP+2+/rqGO1kSwaJjJLw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.18.tgz", + "integrity": "sha512-G1Lu/sP+v34lwsGFreklnCdxygMLmobyLY31cNPd0i47ZwgrGowuTV34Mcqfc4AWRkayqVAIlb/WWIZ1+qemcA==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.18.tgz", + "integrity": "sha512-Uu+m5BPemw5ZiG6LaF+pP0qFQuIXF55wMZNa0Dbl/16hF7ci6q941MT6CqeK5LQQ52FVVqeYO5lDk5CggaA3Mw==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.3.18", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.18.tgz", + "integrity": "sha512-9o8uFNsPmWB5FFQSDCsI/KVBSHuAILEwB/hMvbUxKtZeSWAQTm5BqbNPi6X11KJ3MdyoJn7zPejj3grL3dcd/w==", + "dev": true, + "optional": true, + "peer": true + }, + "@swc/helpers": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.11.tgz", + "integrity": "sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.20", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz", + "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", + "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.4.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", + "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/fs-extra": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", + "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/graceful-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", + "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/http-proxy": { + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.1.tgz", + "integrity": "sha512-C2p7yqleUKtCkVjlOur9BWVA4HgUQmEj/HWCt5WzZ5mLXrWnyIfl0wGuArc+kBXsy0ZZfLp+7dywB4HtSVYGVA==", + "requires": { + "jest-matcher-utils": "^27.0.0", + "pretty-format": "^27.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" + }, + "jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + }, + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.189", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==" + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/react": { + "version": "18.0.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.20.tgz", + "integrity": "sha512-MWul1teSPxujEHVwZl4a5HxQ9vVNsjTchVA+xRqv/VYGCuKGAU6UhfrTdF5aBefwD1BHUD8i/zq+O/vyCm/FrA==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-window": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", + "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", + "requires": { + "@types/react": "*" + } + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "optional": true, + "peer": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true, + "optional": true, + "peer": true + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/styled-components": { + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", + "requires": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.13", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz", + "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz", + "integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/type-utils": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz", + "integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz", + "integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz", + "integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.43.0", + "@typescript-eslint/utils": "5.43.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz", + "integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz", + "integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/visitor-keys": "5.43.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz", + "integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.43.0", + "@typescript-eslint/types": "5.43.0", + "@typescript-eslint/typescript-estree": "5.43.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz", + "integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.43.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "@yarn-tool/resolve-package": { + "version": "1.0.47", + "resolved": "https://registry.npmjs.org/@yarn-tool/resolve-package/-/resolve-package-1.0.47.tgz", + "integrity": "sha512-Zaw58gQxjQceJqhqybJi1oUDaORT8i2GTgwICPs8v/X/Pkx35FXQba69ldHVg5pQZ6YLKpROXgyHvBaCJOFXiA==", + "dev": true, + "requires": { + "pkg-dir": "< 6 >= 5", + "tslib": "^2", + "upath2": "^3.1.13" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + } + } + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.29", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.29.tgz", + "integrity": "sha512-07kAB4mEcZltoMBQqV4Tb8ucCpOQCG6fl4fH/2cmOU8Nh6nZcmvCptIuARC5dd4vfZKI5zUUoK2arR+pOi9PxQ==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "devOptional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "optional": true, + "peer": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true, + "peer": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "optional": true, + "peer": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "optional": true, + "peer": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "optional": true, + "peer": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "optional": true, + "peer": true + }, + "axe-core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", + "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", + "dev": true + }, + "axios": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz", + "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "babel-jest": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.1.tgz", + "integrity": "sha512-MEt0263viUdAkTq5D7upHPNxvt4n9uLUGa6pPz3WviNBMtOmStb1lIXS3QobnoqM+qnH+vr4EKlvhe8QcmxIYw==", + "dev": true, + "requires": { + "@jest/transform": "^28.1.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^28.1.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + } + }, + "babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-const-enum": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-const-enum/-/babel-plugin-const-enum-1.2.0.tgz", + "integrity": "sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.3.3", + "@babel/traverse": "^7.16.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", + "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + } + }, + "babel-plugin-styled-components": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz", + "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + }, + "babel-plugin-transform-async-to-promises": { + "version": "0.8.18", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-promises/-/babel-plugin-transform-async-to-promises-0.8.18.tgz", + "integrity": "sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==", + "dev": true + }, + "babel-plugin-transform-typescript-metadata": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.3.2.tgz", + "integrity": "sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + } + }, + "babel-preset-jest": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", + "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^28.1.3", + "babel-preset-current-node-syntax": "^1.0.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "devOptional": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "optional": true, + "peer": true + }, + "bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", + "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "optional": true, + "peer": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "optional": true, + "peer": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001488", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", + "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "optional": true, + "peer": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true + }, + "chart.js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" + }, + "chartjs-plugin-datalabels": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chartjs-plugin-datalabels/-/chartjs-plugin-datalabels-2.2.0.tgz", + "integrity": "sha512-14ZU30lH7n89oq+A4bWaJPnAG8a7ZTk7dKf48YAzMvJjQtjrgg5Dpk9f+LbjCF6bpx3RAGTeL13IXpKQYyRvlw==", + "requires": {} + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "optional": true, + "peer": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "devOptional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz", + "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==", + "dev": true + }, + "cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "optional": true, + "peer": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + } + } + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "optional": true, + "peer": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "copy-webpack-plugin": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", + "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "core-js-compat": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.1.tgz", + "integrity": "sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A==", + "dev": true, + "requires": { + "browserslist": "^4.21.4" + } + }, + "core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" + }, + "css-declaration-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz", + "integrity": "sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==", + "dev": true, + "requires": {} + }, + "css-loader": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.2.tgz", + "integrity": "sha512-oqGbbVcBJkm8QwmnNzrFrWTnudnRZC+1eXikLJl0n4ljcfotgRifpg2a1lKy8jTrc4/d9A/ap1GFq1jDKG7J+Q==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.18", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dev": true, + "requires": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "requires": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.2.13", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", + "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.0", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.3", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.1", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + } + }, + "cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "cypress": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-11.1.0.tgz", + "integrity": "sha512-kzizbG9s3p3ahWqxUwG/21NqLWEGtScMevMyUPeYlcmMX9RzVxWM18MkA3B4Cb3jKx72hSyIE2mHgHymfCM1bg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz", + "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==", + "dev": true, + "optional": true, + "peer": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "optional": true, + "peer": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "optional": true, + "peer": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "optional": true, + "peer": true + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true, + "optional": true, + "peer": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dom-lib": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/dom-lib/-/dom-lib-3.1.5.tgz", + "integrity": "sha512-UtBonzIF2H0znUASBTZ/jIKBehBIezRp84mIr950rcBVVuQKTwh8oOhPWUmdQ1Hyy931kRAPDXbobDI+OX/Dyg==", + "requires": { + "@babel/runtime": "^7.19.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "ejs": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "requires": { + "stackframe": "^1.3.4" + } + }, + "es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "eslint": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", + "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "requires": { + "@eslint/eslintrc": "^1.2.3", + "@humanwhocodes/config-array": "^0.9.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.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "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" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-next": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.0.0.tgz", + "integrity": "sha512-y2nqWS2tycWySdVhb+rhp6CuDmDazGySqkzzQZf3UTyfHyC7og1m5m/AtMFwCo5mtvDqvw1BENin52kV9733lg==", + "dev": true, + "requires": { + "@next/eslint-plugin-next": "13.0.0", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.21.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^2.7.1", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + } + }, + "eslint-config-prettier": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", + "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.7.1.tgz", + "integrity": "sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "glob": "^7.2.0", + "is-glob": "^4.0.3", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "requires": {} + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react": { + "version": "7.31.8", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz", + "integrity": "sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, + "eslint-plugin-tsdoc": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", + "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", + "requires": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "0.16.2" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + } + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "optional": true, + "peer": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "pify": "^2.2.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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" + } + } + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true, + "peer": true + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "optional": true, + "peer": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "final-form": { + "version": "4.20.9", + "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.9.tgz", + "integrity": "sha512-shA1X/7v8RmukWMNRHx0l7+Bm41hOivY78IvOiBrPVHjyWFIyqqIEMCz7yTVRc9Ea+EU4WkZ5r4MH6whSo5taw==", + "dev": true, + "peer": true, + "requires": { + "@babel/runtime": "^7.10.0" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "optional": true, + "peer": true + }, + "fork-ts-checker-webpack-plugin": { + "version": "7.2.13", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.2.13.tgz", + "integrity": "sha512-fR3WRkOb4bQdWB/y7ssDUlVdrclvwtyCUIHCfivAoYxq9dF7XfrDKbMdZIfwJ7hxIAqkYSGeU7lLJE6xrxIBdg==", + "dev": true, + "requires": { + "@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", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "requires": { + "loader-utils": "^3.2.0" + }, + "dependencies": { + "loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ini": "2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + } + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "requires": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dev": true, + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "devOptional": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "optional": true, + "peer": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "optional": true, + "peer": true + }, + "insert-css": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz", + "integrity": "sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "devOptional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.0.tgz", + "integrity": "sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "optional": true, + "peer": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "optional": true, + "peer": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "optional": true, + "peer": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "optional": true, + "peer": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jake": { + "version": "10.8.5", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "jest-circus": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", + "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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-config": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.1.tgz", + "integrity": "sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA==", + "dev": true, + "requires": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^28.1.1", + "@jest/types": "^28.1.1", + "babel-jest": "^28.1.1", + "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.1", + "jest-environment-node": "^28.1.1", + "jest-get-type": "^28.0.2", + "jest-regex-util": "^28.0.2", + "jest-resolve": "^28.1.1", + "jest-runner": "^28.1.1", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^28.1.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-docblock": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", + "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", + "dev": true, + "requires": { + "detect-newline": "^3.0.0" + } + }, + "jest-each": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", + "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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-environment-node": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", + "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true + }, + "jest-haste-map": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", + "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.3.2", + "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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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-leak-detector": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", + "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", + "dev": true, + "requires": { + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + } + }, + "jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "requires": { + "@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": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", + "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", + "dev": true, + "requires": { + "@jest/types": "^28.1.3", + "@types/node": "*" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "dev": true + }, + "jest-resolve": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.1.tgz", + "integrity": "sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^28.1.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^28.1.1", + "jest-validate": "^28.1.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + } + }, + "jest-runner": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", + "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "requires": { + "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-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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-runtime": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", + "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "jest-resolve": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", + "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", + "dev": true, + "requires": { + "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-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, + "jest-snapshot": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", + "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "jest-util": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz", + "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==", + "dev": true, + "requires": { + "@jest/types": "^28.1.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "jest-validate": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", + "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dev": true, + "requires": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "requires": { + "@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-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" + }, + "jose": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "optional": true, + "peer": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "optional": true, + "peer": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true, + "peer": true + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "optional": true, + "peer": true + }, + "less": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true, + "optional": true, + "peer": true + }, + "rxjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "tslib": "^2.1.0" + } + } + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "dependencies": { + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "optional": true, + "peer": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.11.tgz", + "integrity": "sha512-GvsCITGAyDCxxsJ+X6prJexFQEhOCJaIlUbsAvjzSI5o5O7j2dle3jWvz5Z5aOdpOxW6ol3vI1+0ut+641F1+w==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.3" + } + }, + "memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz", + "integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "native-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.1.0.tgz", + "integrity": "sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "next": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/next/-/next-13.0.0.tgz", + "integrity": "sha512-puH1WGM6rGeFOoFdXXYfUxN9Sgi4LMytCV5HkQJvVUOhHfC1DoVqOfvzaEteyp6P04IW+gbtK2Q9pInVSrltPA==", + "requires": { + "@next/env": "13.0.0", + "@next/swc-android-arm-eabi": "13.0.0", + "@next/swc-android-arm64": "13.0.0", + "@next/swc-darwin-arm64": "13.0.0", + "@next/swc-darwin-x64": "13.0.0", + "@next/swc-freebsd-x64": "13.0.0", + "@next/swc-linux-arm-gnueabihf": "13.0.0", + "@next/swc-linux-arm64-gnu": "13.0.0", + "@next/swc-linux-arm64-musl": "13.0.0", + "@next/swc-linux-x64-gnu": "13.0.0", + "@next/swc-linux-x64-musl": "13.0.0", + "@next/swc-win32-arm64-msvc": "13.0.0", + "@next/swc-win32-ia32-msvc": "13.0.0", + "@next/swc-win32-x64-msvc": "13.0.0", + "@swc/helpers": "0.4.11", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.0", + "use-sync-external-store": "1.2.0" + }, + "dependencies": { + "postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } + } + }, + "next-auth": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.22.1.tgz", + "integrity": "sha512-NTR3f6W7/AWXKw8GSsgSyQcDW6jkslZLH8AiZa5PQ09w1kR8uHtR9rez/E9gAq/o17+p0JYHE8QjF3RoniiObA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.5.0", + "jose": "^4.11.4", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + } + }, + "next-fonts": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/next-fonts/-/next-fonts-1.5.1.tgz", + "integrity": "sha512-pgEJ40xO1oRhM6RqhQJ9CzuZOFp6Zq+aAD/V1P9sq/wdepvLzhFxDm3lCZNoE7+78NSuMKgT6b1qeXSsqWuUMQ==", + "requires": { + "file-loader": "^6.0.0", + "url-loader": "^4.0.0" + } + }, + "next-with-less": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/next-with-less/-/next-with-less-2.0.5.tgz", + "integrity": "sha512-1MJDcgFOPucFPCMXV7rTqcWiLI2nLSBi8bA6msvkiNLhYyZMXaFl4MkyYf7eOEUUEtA/c5eD0grPhbcDkrKqPQ==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1" + } + }, + "node-abort-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", + "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", + "dev": true + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==" + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "nx": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.1.1.tgz", + "integrity": "sha512-afwLiY25+wCK7NR1lGVn2nIJRSqOmcJqJxWsz1A2FJJaHXogF4ja0USgjDksxXQGfKsbOyOq4Wvzel1YhtuaoQ==", + "dev": true, + "requires": { + "@nrwl/cli": "15.1.1", + "@nrwl/tao": "15.1.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "^3.0.0-rc.18", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "4.1.0", + "chokidar": "^3.5.1", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^10.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.3.4", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^3.9.0", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + } + }, + "nx-cloud": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/nx-cloud/-/nx-cloud-16.0.5.tgz", + "integrity": "sha512-13P7r0aKikjBtmdZrNorwXzVPeVIV4MLEwqGY+DEG6doLBtI5KqEQk/d5B5l2dCF2BEi/LXEmLYCmf9gwbOJ+Q==", + "requires": { + "@nrwl/nx-cloud": "16.0.5", + "axios": "1.1.3", + "chalk": "^4.1.0", + "dotenv": "~10.0.0", + "fs-extra": "^11.1.0", + "node-machine-id": "^1.1.12", + "open": "~8.4.0", + "strip-json-comments": "^3.1.1", + "tar": "6.1.11", + "yargs-parser": ">=21.1.1" + }, + "dependencies": { + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + } + } + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "openid-client": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.2.tgz", + "integrity": "sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==", + "dev": true, + "requires": { + "jose": "^4.14.1", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true, + "optional": true, + "peer": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-is-network-drive": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/path-is-network-drive/-/path-is-network-drive-1.0.20.tgz", + "integrity": "sha512-p5wCWlRB4+ggzxWshqHH9aF3kAuVu295NaENXmVhThbZPJQBeJdxZTP6CIoUR+kWHDUW56S9YcaO1gXnc/BOxw==", + "dev": true, + "requires": { + "tslib": "^2" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-strip-sep": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/path-strip-sep/-/path-strip-sep-1.0.17.tgz", + "integrity": "sha512-+2zIC2fNgdilgV7pTrktY6oOxxZUo9x5zJYfTzxsGze5kSGDDwhA5/0WlBn+sUyv/WuuyYn3OfM+Ue5nhdQUgA==", + "dev": true, + "requires": { + "tslib": "^2" + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "optional": true, + "peer": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "optional": true, + "peer": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "postcss": { + "version": "8.4.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", + "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-colormin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.0.tgz", + "integrity": "sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "dev": true, + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "dev": true, + "requires": {} + }, + "postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "requires": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + } + }, + "postcss-merge-rules": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", + "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", + "dev": true, + "requires": { + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dev": true, + "requires": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dev": true, + "requires": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-reduce-initial": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", + "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "dev": true + }, + "preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "dev": true, + "requires": { + "pretty-format": "^3.8.0" + }, + "dependencies": { + "pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "dev": true + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "optional": true, + "peer": true + }, + "pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "requires": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "optional": true, + "peer": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-color": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.19.3.tgz", + "integrity": "sha512-LEeGE/ZzNLIsFWa1TMe8y5VYqr7bibneWmvJwm1pCn/eNmrabWDh659JSPn9BuaMpEfU83WTOJfnCcjDZwNQTA==", + "requires": { + "@icons/material": "^0.2.4", + "lodash": "^4.17.15", + "lodash-es": "^4.17.15", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-final-form": { + "version": "6.5.9", + "resolved": "https://registry.npmjs.org/react-final-form/-/react-final-form-6.5.9.tgz", + "integrity": "sha512-x3XYvozolECp3nIjly+4QqxdjSSWfcnpGEL5K8OBT6xmGrq5kBqbA6+/tOqoom9NwqIPPbxPNsOViFlbKgowbA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.15.4" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "react-loader-spinner": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-loader-spinner/-/react-loader-spinner-5.3.4.tgz", + "integrity": "sha512-G2vw4ssX+RDZ/vfaeva06yfNqyFViv/u+tVZ3kFLy5TKNlNx2DbuwreBSpRtPespQA+VxinxUJsigwLwG9erOg==", + "requires": { + "react-is": "^18.2.0", + "styled-components": "^5.3.5", + "styled-tools": "^1.7.2" + } + }, + "react-refresh": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz", + "integrity": "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==", + "dev": true + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "requires": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + } + }, + "reactcss": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz", + "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", + "requires": { + "lodash": "^4.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "devOptional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "regexpu-core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsgen": "^0.7.1", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "regjsgen": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", + "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", + "dev": true + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve.exports": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", + "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true, + "optional": true, + "peer": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "rollup-plugin-copy": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", + "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "dev": true, + "requires": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "rollup-plugin-peer-deps-external": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz", + "integrity": "sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==", + "dev": true, + "requires": {} + }, + "rollup-plugin-postcss": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^5.0.1", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" + }, + "dependencies": { + "pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true + } + } + }, + "rollup-plugin-typescript2": { + "version": "0.31.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.2.tgz", + "integrity": "sha512-hRwEYR1C8xDGVVMFJQdEVnNAeWRvpaY97g5mp3IeLnzhNXzSVq78Ye/BJ9PAaUfN4DXa/uDnqerifMOaMFY54Q==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.1.2", + "@yarn-tool/resolve-package": "^1.0.40", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.0.0", + "resolve": "^1.20.0", + "tslib": "^2.3.1" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "rsuite": { + "version": "5.22.2", + "resolved": "https://registry.npmjs.org/rsuite/-/rsuite-5.22.2.tgz", + "integrity": "sha512-uUiA/B/wj28m18jyZpjkBYWhRUKxw/7U5QMwBpBXBYGH/jQC1c7ag44sbJAZu6yAS9hFP+8GHP7nTD0MAWil1A==", + "requires": { + "@babel/runtime": "^7.19.4", + "@juggle/resize-observer": "^3.4.0", + "@rsuite/icons": "^1.0.2", + "@types/chai": "^4.3.3", + "@types/lodash": "^4.14.184", + "@types/prop-types": "^15.7.5", + "@types/react-window": "^1.8.5", + "classnames": "^2.3.1", + "date-fns": "^2.29.3", + "dom-lib": "^3.1.3", + "lodash": "^4.17.11", + "prop-types": "^15.8.1", + "react-window": "^1.8.7", + "rsuite-table": "^5.8.0", + "schema-typed": "^2.0.3" + } + }, + "rsuite-color-picker": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rsuite-color-picker/-/rsuite-color-picker-0.2.0.tgz", + "integrity": "sha512-t+M9tJ/gpKdb9Y3TWKkDcHfKjll6sfkVCfJvEjFJaxXijdc1BUdanQBzwS0oP1vvMOihdhWS/OP0csv+2gvwHg==", + "requires": { + "react-color": "^2.19.3" + } + }, + "rsuite-table": { + "version": "5.10.5", + "resolved": "https://registry.npmjs.org/rsuite-table/-/rsuite-table-5.10.5.tgz", + "integrity": "sha512-yrJILC2rtB8YcIdF6b+EjE41h2jW1dzwC9on7NjAZIAIrh7wGz8Y35J+ra40HaJUXevdItOCZhzF+Nj8gFUfIg==", + "requires": { + "@babel/runtime": "^7.12.5", + "@juggle/resize-observer": "^3.3.1", + "@rsuite/icons": "^1.0.0", + "classnames": "^2.3.1", + "dom-lib": "^3.1.3", + "lodash": "^4.17.21", + "react-is": "^17.0.2" + }, + "dependencies": { + "react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.56.1.tgz", + "integrity": "sha512-VpEyKpyBPCxE7qGDtOcdJ6fFbcpOM+Emu7uZLxVrkX8KVU/Dp5UF7WLvzqRuUhB6mqqQt1xffLoG+AndxTZrCQ==", + "devOptional": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "schema-typed": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/schema-typed/-/schema-typed-2.0.3.tgz", + "integrity": "sha512-4KckVnJjTtVugYpSAoQrcH4quE4yIVTvI/nHEqtwdceBr/ZCuH2LfV8/gaZFrYU7cwwyufLKaswt28aqQ1T9ww==", + "requires": { + "@babel/runtime": "^7.16.0" + } + }, + "schema-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.2.0.tgz", + "integrity": "sha512-0zTyLGyDJYd/MBxG1AhJkKa6fpEBds4OQO2ut0w7OYG+ZGhGea09lijvzsqegYSik88zc7cUtIlnnO+/BvD6gQ==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + } + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + } + }, + "style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", + "dev": true + }, + "style-loader": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "dev": true, + "requires": {} + }, + "styled-components": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", + "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "styled-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.0.tgz", + "integrity": "sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==", + "requires": { + "client-only": "0.0.1" + } + }, + "styled-tools": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/styled-tools/-/styled-tools-1.7.2.tgz", + "integrity": "sha512-IjLxzM20RMwAsx8M1QoRlCG/Kmq8lKzCGyospjtSXt/BTIIcvgTonaxQAsKnBrsZNwhpHzO9ADx5te0h76ILVg==" + }, + "stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dev": true, + "requires": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + } + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "stylus": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", + "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "dev": true, + "requires": { + "css": "^3.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.1.0.tgz", + "integrity": "sha512-gNUEjjozR+oZ8cuC/Fx4LVXqZOgDKvpW9t2hpXHcxjfPYqSjQftaGwZUK+wL9B0QJ26uS6p1EmoWHmvld1dF7g==", + "dev": true, + "requires": { + "fast-glob": "^3.2.12", + "klona": "^2.0.5", + "normalize-path": "^3.0.0" + }, + "dependencies": { + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "requires": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, + "terser": { + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "dependencies": { + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true, + "optional": true, + "peer": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tinycolor2": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-loader": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tsconfig-paths-webpack-plugin": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.5.2.tgz", + "integrity": "sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^3.9.0" + } + }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "optional": true, + "peer": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "peer": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "requires": { + "qs": "^6.4.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "optional": true, + "peer": true + }, + "upath2": { + "version": "3.1.19", + "resolved": "https://registry.npmjs.org/upath2/-/upath2-3.1.19.tgz", + "integrity": "sha512-d23dQLi8nDWSRTIQwXtaYqMrHuca0As53fNiTLLFDmsGBbepsZepISaB2H1x45bDFN/n3Qw9bydvyZEacTrEWQ==", + "dev": true, + "requires": { + "@types/node": "*", + "path-is-network-drive": "^1.0.20", + "path-strip-sep": "^1.0.17", + "tslib": "^2" + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true, + "peer": true + } + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "5.86.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.86.0.tgz", + "integrity": "sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg==", + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "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.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" + }, + "webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "requires": { + "typed-assert": "^1.0.8" + } + }, + "webpack-virtual-modules": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", + "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dev": true, + "requires": { + "iconv-lite": "0.6.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + } + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "dev": true, + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "optional": true, + "peer": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/package.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/package.json new file mode 100644 index 000000000..04e9c6908 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/package.json @@ -0,0 +1,60 @@ +{ + "name": "pet-management-webapp", + "version": "1.0.0", + "description": "Here is a list of sample applications to try out B2B Scenarios.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "next start ./dist/apps/business-admin-app -p 3002" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/traverse": "^7.23.2", + "@nrwl/eslint-plugin-nx": "15.1.1", + "@nrwl/jest": "15.2.0", + "@nrwl/next": "^15.2.0", + "@types/react": "18.0.20", + "@typescript-eslint/eslint-plugin": "^5.36.1", + "@typescript-eslint/parser": "^5.36.1", + "eslint": "~8.15.0", + "eslint-config-next": "13.0.0", + "eslint-config-prettier": "8.1.0", + "eslint-plugin-import": "2.26.0", + "eslint-plugin-react-hooks": "4.6.0", + "less": "^4.2.0", + "next-auth": "^4.16.4", + "next-with-less": "^2.0.5", + "react-final-form": "^6.5.9", + "rsuite": "^5.22.2" + }, + "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.16", + "@mui/x-date-pickers": "^6.5.0", + "@nrwl/nx-cloud": "^16.0.5", + "@types/jest": "^28.1.1", + "@types/styled-components": "^5.1.26", + "chart.js": "^3.9.1", + "chartjs-plugin-datalabels": "^2.2.0", + "date-fns": "^2.30.0", + "dayjs": "^1.11.7", + "eslint-plugin-header": "^3.1.1", + "eslint-plugin-tsdoc": "^0.2.17", + "jwt-decode": "^4.0.0", + "next": "13.0.0", + "next-auth": "^4.16.4", + "next-fonts": "^1.5.1", + "next-with-less": "^2.0.5", + "react": "^18.2.0", + "react-color": "^2.19.3", + "react-dom": "^18.2.0", + "react-final-form": "^6.5.9", + "react-loader-spinner": "^5.3.4", + "rsuite": "^5.22.2", + "rsuite-color-picker": "^0.2.0", + "styled-components": "^5.3.10", + "tinycolor2": "^1.6.0" + } +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/server.js b/petcare-sample/b2b/web-app/petvet/web/nextjs/server.js new file mode 100644 index 000000000..1aa17f639 --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/server.js @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +const { createServer } = require("http"); +const { parse } = require("url"); +const next = require("next"); + +const dev = process.env.NODE_ENV !== "production"; +const hostname = "localhost"; +const port = 3002; + +const app = next({ dev, hostname, port }); +const handle = app.getRequestHandler(); + +app.prepare().then(() => { + createServer(async (req, res) => { + try { + + const parsedUrl = parse(req.url, true); + const { pathname, query } = parsedUrl; + + await handle(req, res, parsedUrl); + } catch (err) { + console.error("Error occurred handling", req.url, err); + res.statusCode = 500; + res.end("internal server error"); + } + }) + .once("error", (err) => { + console.error(err); + process.exit(1); + }) + .listen(port, () => { + console.log(`> Ready on http://${hostname}:${port}`); + }); +}); diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/tsconfig.base.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/tsconfig.base.json new file mode 100644 index 000000000..b2a154ccd --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/tsconfig.base.json @@ -0,0 +1,76 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "rootDir": ".", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "es2015", + "module": "esnext", + "resolveJsonModule": true, + "lib": [ + "es2017", + "dom" + ], + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "baseUrl": ".", + "paths": { + "@pet-management-webapp/business-admin-app/data-access/data-access-common-api-util": [ + "libs/business-admin-app/data-access/data-access-common-api-util/src/index.ts" + ], + "@pet-management-webapp/business-admin-app/data-access/data-access-common-models-util": [ + "libs/business-admin-app/data-access/data-access-common-models-util/src/index.ts" + ], + "@pet-management-webapp/business-admin-app/data-access/data-access-controller": [ + "libs/business-admin-app/data-access/data-access-controller/src/index.ts" + ], + "@pet-management-webapp/business-admin-app/ui/ui-assets": [ + "libs/business-admin-app/ui/ui-assets/src/index.ts" + ], + "@pet-management-webapp/business-admin-app/ui/ui-components": [ + "libs/business-admin-app/ui/ui-components/src/index.ts" + ], + "@pet-management-webapp/business-admin-app/util/util-application-config-util": [ + "libs/business-admin-app/util/util-application-config-util/src/index.ts" + ], + "@pet-management-webapp/business-admin-app/util/util-authorization-config-util": [ + "libs/business-admin-app/util/util-authorization-config-util/src/index.ts" + ], + "@pet-management-webapp/shared/data-access/data-access-common-api-util": [ + "libs/shared/data-access/data-access-common-api-util/src/index.ts" + ], + "@pet-management-webapp/shared/data-access/data-access-common-models-util": [ + "libs/shared/data-access/data-access-common-models-util/src/index.ts" + ], + "@pet-management-webapp/shared/ui/ui-assets": [ + "libs/shared/ui/ui-assets/src" + ], + "@pet-management-webapp/shared/ui/ui-basic-components": [ + "libs/shared/ui/ui-basic-components/src/index.ts" + ], + "@pet-management-webapp/shared/ui/ui-components": [ + "libs/shared/ui/ui-components/src/index.ts" + ], + "@pet-management-webapp/shared/util/util-application-config-util": [ + "libs/shared/util/util-application-config-util/src/index.ts" + ], + "@pet-management-webapp/shared/util/util-authorization-config-util": [ + "libs/shared/util/util-authorization-config-util/src/index.ts" + ], + "@pet-management-webapp/shared/util/util-common": [ + "libs/shared/util/util-common/src/index.ts" + ], + "@pet-management-webapp/shared/util/util-front-end-util": [ + "libs/shared/util/util-front-end-util/src/index.ts" + ] + } + }, + "exclude": [ + "node_modules", + "tmp" + ] +} diff --git a/petcare-sample/b2b/web-app/petvet/web/nextjs/workspace.json b/petcare-sample/b2b/web-app/petvet/web/nextjs/workspace.json new file mode 100644 index 000000000..d44fd223c --- /dev/null +++ b/petcare-sample/b2b/web-app/petvet/web/nextjs/workspace.json @@ -0,0 +1,518 @@ +{ + "version": 2, + "projects": { + "business-admin-app": { + "root": "apps/business-admin-app", + "sourceRoot": "apps/business-admin-app", + "projectType": "application", + "targets": { + "build": { + "executor": "@nrwl/next:build", + "outputs": [ + "{options.outputPath}" + ], + "defaultConfiguration": "production", + "options": { + "root": "apps/business-admin-app", + "outputPath": "dist/apps/business-admin-app" + }, + "configurations": { + "development": { + "outputPath": "apps/business-admin-app" + }, + "production": {} + } + }, + "serve": { + "executor": "@nrwl/next:server", + "defaultConfiguration": "development", + "options": { + "buildTarget": "business-admin-app:build", + "dev": true, + "port": 3002 + }, + "configurations": { + "development": { + "buildTarget": "business-admin-app:build:development", + "dev": true, + "hostname": "0.0.0.0" + }, + "production": { + "buildTarget": "business-admin-app:build:production", + "dev": false, + "hostname": "0.0.0.0" + } + } + }, + "export": { + "executor": "@nrwl/next:export", + "options": { + "buildTarget": "business-admin-app:build:production" + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "apps/business-admin-app/jest.config.ts", + "passWithNoTests": true + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "apps/business-admin-app/**/*.{ts,tsx,js,jsx}" + ] + } + } + }, + "tags": [] + }, + "business-admin-app-data-access-data-access-common-api-util": { + "root": "libs/business-admin-app/data-access/data-access-common-api-util", + "sourceRoot": "libs/business-admin-app/data-access/data-access-common-api-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/data-access/data-access-common-api-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/data-access/data-access-common-api-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "business-admin-app-data-access-data-access-common-models-util": { + "root": "libs/business-admin-app/data-access/data-access-common-models-util", + "sourceRoot": "libs/business-admin-app/data-access/data-access-common-models-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/data-access/data-access-common-models-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/data-access/data-access-common-models-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "business-admin-app-data-access-data-access-controller": { + "root": "libs/business-admin-app/data-access/data-access-controller", + "sourceRoot": "libs/business-admin-app/data-access/data-access-controller/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/data-access/data-access-controller/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/data-access/data-access-controller/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "business-admin-app-ui-ui-assets": { + "root": "libs/business-admin-app/ui/ui-assets", + "sourceRoot": "libs/business-admin-app/ui/ui-assets/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/ui/ui-assets/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/ui/ui-assets/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "business-admin-app-ui-ui-components": { + "root": "libs/business-admin-app/ui/ui-components", + "sourceRoot": "libs/business-admin-app/ui/ui-components/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/ui/ui-components/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/ui/ui-components/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "business-admin-app-util-util-application-config-util": { + "root": "libs/business-admin-app/util/util-application-config-util", + "sourceRoot": "libs/business-admin-app/util/util-application-config-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/util/util-application-config-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/util/util-application-config-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "business-admin-app-util-util-authorization-config-util": { + "root": "libs/business-admin-app/util/util-authorization-config-util", + "sourceRoot": "libs/business-admin-app/util/util-authorization-config-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/business-admin-app/util/util-authorization-config-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/business-admin-app/util/util-authorization-config-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-data-access-data-access-common-api-util": { + "root": "libs/shared/data-access/data-access-common-api-util", + "sourceRoot": "libs/shared/data-access/data-access-common-api-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/data-access/data-access-common-api-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/data-access/data-access-common-api-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-data-access-data-access-common-models-util": { + "root": "libs/shared/data-access/data-access-common-models-util", + "sourceRoot": "libs/shared/data-access/data-access-common-models-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/data-access/data-access-common-models-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/data-access/data-access-common-models-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-ui-ui-assets": { + "root": "libs/shared/ui/ui-assets", + "sourceRoot": "libs/shared/ui/ui-assets/src", + "projectType": "library" + }, + "shared-ui-ui-basic-components": { + "root": "libs/shared/ui/ui-basic-components", + "sourceRoot": "libs/shared/ui/ui-basic-components/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/ui/ui-basic-components/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/ui/ui-basic-components/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-ui-ui-components": { + "root": "libs/shared/ui/ui-components", + "sourceRoot": "libs/shared/ui/ui-components/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/ui/ui-components/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/ui/ui-components/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-util-util-application-config-util": { + "root": "libs/shared/util/util-application-config-util", + "sourceRoot": "libs/shared/util/util-application-config-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/util/util-application-config-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/util/util-application-config-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-util-util-authorization-config-util": { + "root": "libs/shared/util/util-authorization-config-util", + "sourceRoot": "libs/shared/util/util-authorization-config-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/util/util-authorization-config-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/util/util-authorization-config-util/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-util-util-common": { + "root": "libs/shared/util/util-common", + "sourceRoot": "libs/shared/util/util-common/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/util/util-common/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/util/util-common/jest.config.ts", + "passWithNoTests": true + } + } + } + }, + "shared-util-util-front-end-util": { + "root": "libs/shared/util/util-front-end-util", + "sourceRoot": "libs/shared/util/util-front-end-util/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/shared/util/util-front-end-util/**/*.{ts,tsx,js,jsx}" + ] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": [ + "{workspaceRoot}/coverage/{projectRoot}" + ], + "options": { + "jestConfig": "libs/shared/util/util-front-end-util/jest.config.ts", + "passWithNoTests": true + } + } + } + } + } +}