diff --git a/.scalafmt.conf b/.scalafmt.conf index d2a38a2..2f05334 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -3,7 +3,7 @@ project.git = true project.excludeFilters = [ ] -runner.dialect=scala213 +runner.dialect=scala3 maxColumn = 120 assumeStandardLibraryStripMargin = false diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/AdminDataExplorerApiClient.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/AdminDataExplorerApiClient.scala deleted file mode 100644 index 1dcdee3..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/AdminDataExplorerApiClient.scala +++ /dev/null @@ -1,178 +0,0 @@ -package net.wiringbits.webapp.utils.api - -import net.wiringbits.webapp.utils.api.models._ -import play.api.libs.json._ -import sttp.client3._ -import sttp.model._ - -import scala.concurrent.{ExecutionContext, Future} -import scala.util.{Failure, Success, Try} - -trait AdminDataExplorerApiClient { - def getTables: Future[AdminGetTables.Response] - - def getTableMetadata( - tableName: String, - sort: List[String], - range: List[Int], - filters: String - ): Future[List[Map[String, String]]] - - def viewItem(tableName: String, id: String): Future[Map[String, String]] - - def viewItems(tableName: String, ids: List[String]): Future[List[Map[String, String]]] - - def createItem(tableName: String, request: AdminCreateTable.Request): Future[AdminCreateTable.Response] - - def updateItem(tableName: String, id: String, request: Map[String, String]): Future[AdminUpdateTable.Response] - - def deleteItem(tableName: String, id: String): Future[AdminDeleteTable.Response] -} - -object AdminDataExplorerApiClient { - case class Config(serverUrl: String) - - private def asJson[R: Reads] = { - asString - .map { - case Right(response) => - // handles 2xx responses - Success(response) - case Left(response) => - // handles non 2xx responses - Try { - val json = Json.parse(response) - // TODO: Unify responses to match the play error format - json - .asOpt[ErrorResponse] - .orElse { - json - .asOpt[PlayErrorResponse] - .map(model => ErrorResponse(model.error.message)) - } - .getOrElse(throw new RuntimeException(s"Unexpected JSON response: $response")) - } match { - case Failure(exception) => - println(s"Unexpected response: ${exception.getMessage}") - exception.printStackTrace() - Failure(new RuntimeException(s"Unexpected response, please try again in a minute")) - case Success(value) => - Failure(new RuntimeException(value.error)) - } - } - .map { t => - t.map(Json.parse).map(_.as[R]) - } - } - - class DefaultImpl(config: Config)(implicit - backend: SttpBackend[Future, _], - ec: ExecutionContext - ) extends AdminDataExplorerApiClient { - - private val ServerAPI = sttp.model.Uri - .parse(config.serverUrl) - .getOrElse(throw new RuntimeException("Invalid server url")) - - private def prepareRequest[R: Reads] = { - basicRequest - .contentType(MediaType.ApplicationJson) - .response(asJson[R]) - } - - override def getTables: Future[AdminGetTables.Response] = { - val path = ServerAPI.path :+ "admin" :+ "tables" - val uri = ServerAPI.withPath(path) - - prepareRequest[AdminGetTables.Response] - .get(uri) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - - override def getTableMetadata( - tableName: String, - sort: List[String], - range: List[Int], - filters: String - ): Future[List[Map[String, String]]] = { - val path = ServerAPI.path :+ "admin" :+ "tables" :+ tableName - val parameters: Map[String, String] = Map( - "sort" -> sort.mkString("[", ",", "]"), - "range" -> range.mkString("[", ",", "]"), - "filters" -> filters - ) - val uri = ServerAPI - .withPath(path) - .addParams(parameters) - - prepareRequest[List[Map[String, String]]] - .get(uri) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - - override def viewItem(tableName: String, id: String): Future[Map[String, String]] = { - val path = ServerAPI.path :+ "admin" :+ "tables" :+ tableName :+ id - val uri = ServerAPI.withPath(path) - - prepareRequest[Map[String, String]] - .get(uri) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - - override def viewItems(tableName: String, id: List[String]): Future[List[Map[String, String]]] = { - val path = ServerAPI.path :+ "admin" :+ "tables" :+ tableName - val primaryKeyParam = Json.toJson(Map("id" -> id)).toString() - val uri = ServerAPI.withPath(path).withParams(Map("filter" -> primaryKeyParam)) - prepareRequest[List[Map[String, String]]] - .get(uri) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - - override def createItem(tableName: String, request: AdminCreateTable.Request): Future[AdminCreateTable.Response] = { - val path = ServerAPI.path :+ "admin" :+ "tables" :+ tableName - val uri = ServerAPI.withPath(path) - - prepareRequest[AdminCreateTable.Response] - .post(uri) - .body(Json.toJson(request).toString()) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - - override def updateItem( - tableName: String, - id: String, - request: Map[String, String] - ): Future[AdminUpdateTable.Response] = { - val path = ServerAPI.path :+ "admin" :+ "tables" :+ tableName :+ id - val uri = ServerAPI.withPath(path) - - prepareRequest[AdminUpdateTable.Response] - .put(uri) - .body(Json.toJson(request).toString()) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - - override def deleteItem(tableName: String, id: String): Future[AdminDeleteTable.Response] = { - val path = ServerAPI.path :+ "admin" :+ "tables" :+ tableName :+ id - val uri = ServerAPI.withPath(path) - - prepareRequest[AdminDeleteTable.Response] - .delete(uri) - .send(backend) - .map(_.body) - .flatMap(Future.fromTry) - } - } -} diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminCreateTable.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminCreateTable.scala deleted file mode 100644 index f6eef7c..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminCreateTable.scala +++ /dev/null @@ -1,16 +0,0 @@ -package net.wiringbits.webapp.utils.api.models - -import play.api.libs.json.{Format, Json} - -object AdminCreateTable { - case class Request(data: Map[String, String]) - - case class Response(noData: String = "") - - implicit val adminCreateTableRequestFormat: Format[Request] = - Json.format[Request] - - implicit val adminCreateTableResponseFormat: Format[Response] = - Json.format[Response] - -} diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminDeleteTable.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminDeleteTable.scala deleted file mode 100644 index 23872dd..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminDeleteTable.scala +++ /dev/null @@ -1,10 +0,0 @@ -package net.wiringbits.webapp.utils.api.models - -import play.api.libs.json.{Format, Json} - -object AdminDeleteTable { - case class Response(noData: String = "") - - implicit val adminDeleteTableResponseFormat: Format[Response] = - Json.format[Response] -} diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminGetTables.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminGetTables.scala deleted file mode 100644 index 5803f25..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminGetTables.scala +++ /dev/null @@ -1,23 +0,0 @@ -package net.wiringbits.webapp.utils.api.models - -import play.api.libs.json.{Format, Json} - -object AdminGetTables { - case class Response(data: List[Response.DatabaseTable]) - object Response { - case class DatabaseTable(name: String, columns: List[TableColumn], primaryKeyName: String, canBeDeleted: Boolean) - case class TableColumn( - name: String, - `type`: String, - editable: Boolean, - reference: Option[TableReference], - filterable: Boolean - ) - case class TableReference(referencedTable: String, referenceField: String) - - implicit val adminTableReferenceResponseFormat: Format[TableReference] = Json.format[TableReference] - implicit val adminTableColumnResponseFormat: Format[TableColumn] = Json.format[TableColumn] - implicit val adminDatabaseTableResponseFormat: Format[DatabaseTable] = Json.format[DatabaseTable] - } - implicit val adminGetTablesResponseFormat: Format[Response] = Json.format[Response] -} diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminUpdateTable.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminUpdateTable.scala deleted file mode 100644 index 7d91430..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminUpdateTable.scala +++ /dev/null @@ -1,14 +0,0 @@ -package net.wiringbits.webapp.utils.api.models - -import play.api.libs.json.{Format, Json} - -object AdminUpdateTable { - case class Request(data: Map[String, String]) - case class Response(id: String) - - implicit val adminUpdateTableRequestFormat: Format[Request] = - Json.format[Request] - - implicit val adminUpdateTableResponseFormat: Format[Response] = - Json.format[Response] -} diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/PlayErrorResponse.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/PlayErrorResponse.scala deleted file mode 100644 index d608945..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/PlayErrorResponse.scala +++ /dev/null @@ -1,14 +0,0 @@ -package net.wiringbits.webapp.utils.api.models - -import play.api.libs.json.{Format, Json} - -// play json errors are like: -// {"error":{"requestId":2,"message":"Invalid Json: ..."}} -case class PlayErrorResponse(error: PlayErrorResponse.PlayError) - -object PlayErrorResponse { - case class PlayError(message: String) - - implicit val playErrorResponseErrorFormat: Format[PlayError] = Json.format[PlayError] - implicit val playErrorResponseFormat: Format[PlayErrorResponse] = Json.format[PlayErrorResponse] -} diff --git a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/package.scala b/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/package.scala deleted file mode 100644 index 361a1ee..0000000 --- a/admin-data-explorer-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/package.scala +++ /dev/null @@ -1,21 +0,0 @@ -package net.wiringbits.webapp.utils.api - -import play.api.libs.json._ - -import java.time.Instant - -package object models { - - /** For some reason, play-json doesn't provide support for Instant in the scalajs version, grabbing the jvm values - * seems to work: - * - https://github.com/playframework/play-json/blob/master/play-json/jvm/src/main/scala/play/api/libs/json/EnvReads.scala - * - https://github.com/playframework/play-json/blob/master/play-json/jvm/src/main/scala/play/api/libs/json/EnvWrites.scala - */ - implicit val instantFormat: Format[Instant] = Format[Instant]( - fjs = implicitly[Reads[String]].map(string => Instant.parse(string)), - tjs = Writes[Instant](i => JsString(i.toString)) - ) - - case class ErrorResponse(error: String) - implicit val errorResponseFormat: Format[ErrorResponse] = Json.format[ErrorResponse] -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/AppRouter.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/AppRouter.scala deleted file mode 100644 index 02fd1ac..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/AppRouter.scala +++ /dev/null @@ -1,61 +0,0 @@ -package net.wiringbits.webapp.utils.admin - -import net.wiringbits.webapp.utils.admin.controllers.{AdminController, ImagesController} -import net.wiringbits.webapp.utils.admin.utils.StringToDataTypesExt -import net.wiringbits.webapp.utils.admin.utils.models.{ - FilterParameter, - PaginationParameter, - QueryParameters, - SortParameter -} -import play.api.routing.Router.Routes -import play.api.routing.SimpleRouter -import play.api.routing.sird.* - -import javax.inject.Inject - -class AppRouter @Inject() (adminController: AdminController, imagesController: ImagesController) extends SimpleRouter { - - override def routes: Routes = { - // get database tables - case GET(p"/admin/tables") => - adminController.getTables() - - // get database table fields - // example: GET http://localhost:9000/admin/tables/users?filters={}&range=[0, 9]&sort=["id", "ASC"] - case GET(p"/admin/tables/$tableName" ? q"filters=$filters" & q"range=$range" & q"sort=$sort") => - val queryParams = - QueryParameters( - sort = SortParameter.fromString(sort), - pagination = PaginationParameter.fromString(range), - filters = FilterParameter.fromString(filters) - ) - adminController.getTableMetadata(tableName, queryParams) - - // get table resource by id (depends on IDFieldName on AdminConfig) - case GET(p"/admin/tables/$tableName/$primaryKeyValue") => - adminController.find(tableName, primaryKeyValue) - - // get table resources by ids - case GET(p"/admin/tables/$tableName" ? q"filter=$fieldStr") => - // fieldStr is a string like: "List(..., ..., ...)" that's why we substring it - val filter = fieldStr.substring(6, fieldStr.length - 1).toStringList - adminController.find(tableName, filter) - - // create table resource - case POST(p"/admin/tables/$tableName") => - adminController.create(tableName) - - // update table resource - case PUT(p"/admin/tables/$tableName/$primaryKeyValue") => - adminController.update(tableName, primaryKeyValue) - - // delete table resource - case DELETE(p"/admin/tables/$tableName/$id") => - adminController.delete(tableName, id) - - // get a image - case GET(p"/admin/images/$tableName/$columnName/$primaryKeyValue") => - imagesController.find(tableName, columnName, primaryKeyValue) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/DataExplorerSettings.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/DataExplorerSettings.scala deleted file mode 100644 index ac1d8c9..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/DataExplorerSettings.scala +++ /dev/null @@ -1,9 +0,0 @@ -package net.wiringbits.webapp.utils.admin.config - -case class DataExplorerSettings(baseUrl: String, tables: List[TableSettings]) { - def unsafeFindByName(tableName: String): TableSettings = { - tables - .find(_.tableName == tableName) - .getOrElse(throw new RuntimeException(s"Cannot find settings for table: $tableName")) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/TableSettings.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/TableSettings.scala deleted file mode 100644 index 2745664..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/TableSettings.scala +++ /dev/null @@ -1,47 +0,0 @@ -package net.wiringbits.webapp.utils.admin.config - -/** @param tableName - * name of table in database - * @param primaryKeyField - * primary key identifier of table - * @param referenceField - * field that react-admin shows for foreign key references instead of primary key - * @param hiddenColumns - * columns that the API won't return when the data is queried (for example: user password) - * @param nonEditableColumns - * columns that aren't editable (disabled) via react-admin - * @param canBeDeleted - * indicates if resources from this table can be deleted - * @param primaryKeyDataType - * UUID, Serial, or BigSerial primary keys - * @param columnTypeOverrides - * overrides the data type and converts it, it requires a column name and Text, BinaryImage, Binary - * @param filterableColumns - * columns that are filterable via react-admin - */ - -case class TableSettings( - tableName: String, - primaryKeyField: String, - referenceField: Option[String] = None, - hiddenColumns: List[String] = List.empty, - nonEditableColumns: List[String] = List.empty, - canBeDeleted: Boolean = true, - primaryKeyDataType: PrimaryKeyDataType = PrimaryKeyDataType.UUID, - columnTypeOverrides: Map[String, CustomDataType] = Map.empty, - filterableColumns: List[String] = List.empty -) - -sealed trait PrimaryKeyDataType extends Product with Serializable -object PrimaryKeyDataType { - final case object UUID extends PrimaryKeyDataType - final case object Serial extends PrimaryKeyDataType - final case object BigSerial extends PrimaryKeyDataType -} - -sealed trait CustomDataType extends Product with Serializable -object CustomDataType { - final case object BinaryImage extends CustomDataType - // TODO: add support to binary files - final case object Binary extends CustomDataType -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/AdminController.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/AdminController.scala deleted file mode 100644 index 9b6251b..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/AdminController.scala +++ /dev/null @@ -1,87 +0,0 @@ -package net.wiringbits.webapp.utils.admin.controllers - -import net.wiringbits.webapp.utils.admin.config.DataExplorerSettings -import net.wiringbits.webapp.utils.admin.services.AdminService -import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters -import net.wiringbits.webapp.utils.api.models.* -import org.slf4j.LoggerFactory -import play.api.libs.json.Json -import play.api.mvc.{AbstractController, ControllerComponents} - -import javax.inject.Inject -import scala.concurrent.ExecutionContext - -// TODO: Remove authentication, which should be provided by each app -class AdminController @Inject() ( - adminService: AdminService, - settings: DataExplorerSettings -)(implicit cc: ControllerComponents, ec: ExecutionContext) - extends AbstractController(cc) { - private val logger = LoggerFactory.getLogger(this.getClass) - - def getTables() = handleGET { request => - for { - _ <- adminUser(request) - _ = logger.info(s"Get database tables") - response <- adminService.tables() - } yield Ok(Json.toJson(response)) - } - - def getTableMetadata(tableName: String, queryParams: QueryParameters) = handleGET { request => - for { - _ <- adminUser(request) - _ = logger.info(s"Get metadata for $tableName, parameters: $queryParams") - (response, contentRange) <- adminService.tableMetadata(tableName, queryParams) - } yield Ok(Json.toJson(response)) - .withHeaders(("Access-Control-Expose-Headers", "Content-Range"), ("Content-Range", contentRange)) - } - - def find(tableName: String, primaryKeyValue: String) = handleGET { request => - for { - _ <- adminUser(request) - _ = logger.info(s"Get data from $tableName where primaryKey = $primaryKeyValue") - response <- adminService.find(tableName, primaryKeyValue) - } yield Ok(Json.toJson(response)) - } - - def find(tableName: String, primaryKeyValues: List[String]) = handleGET { request => - for { - _ <- adminUser(request) - _ = logger.info(s"Get data from $tableName where primaryKeys = ${primaryKeyValues.mkString(",")}") - response <- adminService.find(tableName, primaryKeyValues) - } yield Ok(Json.toJson(response)) - } - - def create(tableName: String) = handleJsonBody[AdminCreateTable.Request] { request => - val body = request.body - for { - _ <- adminUser(request) - _ = logger.info(s"Create row in $tableName: ${body.data}") - _ <- adminService.create(tableName, body) - response = AdminCreateTable.Response() - } yield Ok(Json.toJson(response)) - } - - def update(tableName: String, primaryKeyValue: String) = handleJsonBody[Map[String, String]] { request => - val primaryKeyFieldName = settings.unsafeFindByName(tableName).primaryKeyField - val body = request.body.map { - case ("id", value) => primaryKeyFieldName -> value - case x => x - } - for { - _ <- adminUser(request) - _ = logger.info(s"Update row from $tableName where primaryKey = $primaryKeyValue, body = $body") - _ <- adminService.update(tableName, primaryKeyValue, body) - response = AdminUpdateTable.Response(id = primaryKeyValue) - } yield Ok(Json.toJson(response)) - } - - def delete(tableName: String, id: String) = handleGET { request => - for { - _ <- adminUser(request) - _ = logger.info(s"Delete row from $tableName, id = $id") - _ <- adminService.delete(tableName, id) - response = AdminDeleteTable.Response() - } yield Ok(Json.toJson(response)) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/ImagesController.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/ImagesController.scala deleted file mode 100644 index c0889b2..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/ImagesController.scala +++ /dev/null @@ -1,23 +0,0 @@ -package net.wiringbits.webapp.utils.admin.controllers - -import net.wiringbits.webapp.utils.admin.services.AdminService -import org.slf4j.LoggerFactory -import play.api.mvc.{AbstractController, ControllerComponents} - -import javax.inject.Inject -import scala.concurrent.ExecutionContext - -class ImagesController @Inject() ( - adminService: AdminService -)(implicit cc: ControllerComponents, ec: ExecutionContext) - extends AbstractController(cc) { - private val logger = LoggerFactory.getLogger(this.getClass) - - def find(tableName: String, columnName: String, imageId: String) = handleGET { request => - for { - _ <- adminUser(request) - _ = logger.info(s"Get image for $tableName, id = $imageId") - image <- adminService.findImage(tableName, columnName, imageId) - } yield Ok.sendFile(image).withHeaders(("Content-Type", "image/png")) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/package.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/package.scala deleted file mode 100644 index e371a7e..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/package.scala +++ /dev/null @@ -1,50 +0,0 @@ -package net.wiringbits.webapp.utils.admin - -import net.wiringbits.webapp.utils.api.models.ErrorResponse -import org.slf4j.LoggerFactory -import play.api.libs.json.{JsValue, Json, Reads} -import play.api.mvc.Results.InternalServerError -import play.api.mvc.* - -import scala.concurrent.{ExecutionContext, Future} -import scala.util.control.NonFatal - -package object controllers { - private val logger = LoggerFactory.getLogger(this.getClass) - - def adminUser(request: Request[_]): Future[String] = { - // nginx forwards the user while using basic-authentication, which is unknown in the local environment - val user = request.headers.get("X-Forwarded-User").getOrElse("Unknown") - Future.successful(user) - } - - def handleJsonBody[T: Reads]( - block: Request[T] => Future[Result] - )(implicit cc: ControllerComponents, ec: ExecutionContext): Action[T] = { - cc.actionBuilder - .async(cc.parsers.tolerantJson[T]) { request => - block(request).recover(errorHandler) - } - } - - def handleGET( - block: Request[AnyContent] => Future[Result] - )(implicit cc: ControllerComponents, ec: ExecutionContext): Action[AnyContent] = { - cc.actionBuilder - .async { request => - block(request).recover(errorHandler) - } - } - - def renderError(msg: String): JsValue = { - Json.toJson(ErrorResponse(msg)) - } - - def errorHandler: PartialFunction[Throwable, Result] = { - // rendering any error this way should be enough for a while - case NonFatal(ex) => - // debug level used because this includes any validation error as well as server errors - logger.debug(s"Error response while handling a request: ${ex.getMessage}", ex) - InternalServerError(renderError(ex.getMessage)) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/executors/DatabaseExecutionContext.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/executors/DatabaseExecutionContext.scala deleted file mode 100644 index 2fb8734..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/executors/DatabaseExecutionContext.scala +++ /dev/null @@ -1,17 +0,0 @@ -package net.wiringbits.webapp.utils.admin.executors - -import akka.actor.ActorSystem -import play.api.libs.concurrent.CustomExecutionContext - -import javax.inject.{Inject, Singleton} -import scala.concurrent.ExecutionContext - -trait DatabaseExecutionContext extends ExecutionContext - -object DatabaseExecutionContext { - - @Singleton - class AkkaBased @Inject() (system: ActorSystem) - extends CustomExecutionContext(system, "database.dispatcher") - with DatabaseExecutionContext -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/AdminModule.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/AdminModule.scala deleted file mode 100644 index 831f382..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/AdminModule.scala +++ /dev/null @@ -1,7 +0,0 @@ -package net.wiringbits.webapp.utils.admin.modules - -import net.wiringbits.webapp.utils.admin.tasks.DataExplorerConfigValidatorTask -import play.api.inject -import play.api.inject.SimpleModule - -class AdminModule extends SimpleModule(inject.bind[DataExplorerConfigValidatorTask].toSelf.eagerly()) diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/ExecutorsModule.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/ExecutorsModule.scala deleted file mode 100644 index e9d3470..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/ExecutorsModule.scala +++ /dev/null @@ -1,11 +0,0 @@ -package net.wiringbits.webapp.utils.admin.modules - -import com.google.inject.AbstractModule -import net.wiringbits.webapp.utils.admin.executors.DatabaseExecutionContext - -class ExecutorsModule extends AbstractModule { - - override def configure(): Unit = { - val _ = bind(classOf[DatabaseExecutionContext]).to(classOf[DatabaseExecutionContext.AkkaBased]).asEagerSingleton() - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/DatabaseTablesRepository.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/DatabaseTablesRepository.scala deleted file mode 100644 index 7a8d5d8..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/DatabaseTablesRepository.scala +++ /dev/null @@ -1,139 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories - -import net.wiringbits.webapp.utils.admin.config.{DataExplorerSettings, TableSettings} -import net.wiringbits.webapp.utils.admin.executors.DatabaseExecutionContext -import net.wiringbits.webapp.utils.admin.repositories.daos.DatabaseTablesDAO -import net.wiringbits.webapp.utils.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn, TableData} -import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters -import play.api.db.Database - -import javax.inject.Inject -import scala.concurrent.Future - -class DatabaseTablesRepository @Inject() (database: Database)(implicit - ec: DatabaseExecutionContext, - tableSettings: DataExplorerSettings -) { - def all(): Future[List[DatabaseTable]] = Future { - database.withConnection { implicit conn => - DatabaseTablesDAO.all() - } - } - - def getTableColumns(tableName: String): Future[List[TableColumn]] = Future { - database.withConnection { implicit conn => - DatabaseTablesDAO.getTableColumns(tableName) - } - } - - def getForeignKeys(tableName: String): Future[List[ForeignKey]] = Future { - database.withConnection { implicit conn => - DatabaseTablesDAO.getForeignKeys(tableName) - } - } - - def getMandatoryFields(tableName: String): Future[List[TableColumn]] = Future { - database.withConnection { implicit conn => - val primaryKeyField = tableSettings.unsafeFindByName(tableName).primaryKeyField - DatabaseTablesDAO.getMandatoryFields(tableName, primaryKeyField) - } - } - - def getTableMetadata(settings: TableSettings, queryParameters: QueryParameters): Future[List[TableData]] = Future { - database.withTransaction { implicit conn => - val columns = DatabaseTablesDAO.getTableColumns(settings.tableName) - val rows = DatabaseTablesDAO.getTableData(settings, columns, queryParameters, tableSettings.baseUrl) - val columnNames = getColumnNames(columns, settings.primaryKeyField) - rows.map { row => - val tableRow = row.convertToMap(columnNames) - TableData(tableRow) - } - } - } - - private def getColumnNames(columns: List[TableColumn], primaryKeyField: String) = { - val columnNames = columns.map(_.name) - // react-admin looks for an "id" field instead of "user_id", "user_log_id", etc.. - columnNames.updated(columnNames.indexOf(primaryKeyField), "id") - } - - def find(tableName: String, primaryKeyValue: String): Future[Option[TableData]] = Future { - database.withTransaction { implicit conn => - val settings = tableSettings.unsafeFindByName(tableName) - val columns = DatabaseTablesDAO.getTableColumns(tableName) - val maybe = DatabaseTablesDAO.find(settings, columns, primaryKeyValue, tableSettings.baseUrl) - val columnNames = getColumnNames(columns, settings.primaryKeyField) - maybe.map(x => TableData(x.convertToMap(columnNames))) - } - } - - def create(tableName: String, body: Map[String, String]): Future[Unit] = Future { - database.withConnection { implicit conn => - val primaryKeyField = tableSettings.unsafeFindByName(tableName).primaryKeyField - val primaryKeyType = tableSettings.unsafeFindByName(tableName).primaryKeyDataType - DatabaseTablesDAO.create( - tableName = tableName, - body = body, - primaryKeyField = primaryKeyField, - primaryKeyType = primaryKeyType - ) - } - } - - def update(tableName: String, primaryKeyValue: String, body: Map[String, String]): Future[Unit] = - Future { - database.withTransaction { implicit conn => - val settings = tableSettings.unsafeFindByName(tableName) - val columns = DatabaseTablesDAO.getTableColumns(tableName) - // hide non editable fields in case somebody edit it - val bodyWithoutNonEditableColumns = body.filterNot { case (key, _) => - settings.nonEditableColumns.contains(key) - } - // transforms Map[String, String] to Map[TableColumn, String] - // this is necessary because we want the column type to cast the data - val fieldsAndValues = bodyWithoutNonEditableColumns.map { case (key, value) => - val field = - columns.find(_.name == key).getOrElse(throw new RuntimeException(s"Invalid property in body request: $key")) - (field, value) - } - val primaryKeyType = settings.primaryKeyDataType - DatabaseTablesDAO.update( - tableName = tableName, - fieldsAndValues = fieldsAndValues, - primaryKeyField = settings.primaryKeyField, - primaryKeyValue = primaryKeyValue, - primaryKeyType = primaryKeyType - ) - } - } - - def delete(tableName: String, primaryKeyValue: String): Future[Unit] = - Future { - database.withConnection { implicit conn => - val primaryKeyField = tableSettings.unsafeFindByName(tableName).primaryKeyField - val primaryKeyType = tableSettings.unsafeFindByName(tableName).primaryKeyDataType - DatabaseTablesDAO.delete( - tableName = tableName, - primaryKeyField = primaryKeyField, - primaryKeyValue = primaryKeyValue, - primaryKeyType = primaryKeyType - ) - } - } - - def numberOfRecords(tableName: String): Future[Int] = Future { - database.withConnection { implicit conn => - DatabaseTablesDAO.countRecordsOnTable(tableName) - } - } - - def getImageData( - settings: TableSettings, - columnName: String, - imageId: String - ): Future[Option[Array[Byte]]] = Future { - database.withConnection { implicit conn => - DatabaseTablesDAO.getImageData(settings, columnName, imageId) - } - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/DatabaseTablesDAO.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/DatabaseTablesDAO.scala deleted file mode 100644 index 7e9929d..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/DatabaseTablesDAO.scala +++ /dev/null @@ -1,318 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.daos - -import anorm.{SqlParser, SqlStringInterpolation} -import net.wiringbits.webapp.utils.admin.config.{CustomDataType, PrimaryKeyDataType, TableSettings} -import net.wiringbits.webapp.utils.admin.repositories.models.* -import net.wiringbits.webapp.utils.admin.utils.models.{FilterParameter, QueryParameters} -import net.wiringbits.webapp.utils.admin.utils.{QueryBuilder, StringRegex} - -import java.sql.{Connection, Date, PreparedStatement, ResultSet} -import java.time.LocalDate -import java.util.UUID -import scala.collection.mutable.ListBuffer -import scala.util.Try - -object DatabaseTablesDAO { - - def all(schema: String = "public")(implicit conn: Connection): List[DatabaseTable] = { - SQL""" - SELECT table_name - FROM information_schema.tables - WHERE table_schema = $schema - AND table_type = 'BASE TABLE' - ORDER BY table_name - """.as(tableParser.*) - } - - def getTableColumns( - tableName: String - )(implicit conn: Connection): List[TableColumn] = { - val sql = s"SELECT * FROM $tableName LIMIT 0" - val preparedStatement = conn.prepareStatement(sql) - - try { - val resultSet = preparedStatement.executeQuery() - val metadata = resultSet.getMetaData - val numberOfColumns = metadata.getColumnCount - try { - val fields = for { - columnNumber <- 1 to numberOfColumns - columnName = metadata.getColumnName(columnNumber) - columnType = metadata.getColumnTypeName(columnNumber) - } yield TableColumn(columnName, columnType) - fields.toList - } finally { - resultSet.close() - } - } finally { - preparedStatement.close() - } - } - - def getForeignKeys( - tableName: String - )(implicit conn: Connection): List[ForeignKey] = { - SQL""" - SELECT kcu.table_name AS foreign_table, - rel_tco.table_name AS primary_table, - kcu.column_name AS fk_column - FROM information_schema.table_constraints tco - JOIN information_schema.key_column_usage kcu - ON tco.constraint_schema = kcu.constraint_schema - AND tco.constraint_name = kcu.constraint_name - JOIN information_schema.referential_constraints rco - ON tco.constraint_schema = rco.constraint_schema - AND tco.constraint_name = rco.constraint_name - JOIN information_schema.table_constraints rel_tco - ON rco.unique_constraint_schema = rel_tco.constraint_schema - AND rco.unique_constraint_name = rel_tco.constraint_name - WHERE tco.constraint_type = 'FOREIGN KEY' - AND kcu.table_name = $tableName - GROUP BY kcu.table_schema, kcu.table_name, kcu.column_name, rel_tco.table_name, rel_tco.table_schema - ORDER BY kcu.table_schema, kcu.table_name - """.as(foreignKeyParser.*) - } - - def getTableData( - settings: TableSettings, - columns: List[TableColumn], - queryParameters: QueryParameters, - baseUrl: String - )(implicit conn: Connection): List[TableRow] = { - val dateRegex = StringRegex.dateRegex - val limit = queryParameters.pagination.end - queryParameters.pagination.start - val offset = queryParameters.pagination.start - val tableName = settings.tableName - // react-admin gives us a "id" field instead of the primary key of the actual column so we need to replace it - val sortBy = if (queryParameters.sort.field == "id") settings.primaryKeyField else queryParameters.sort.field - - val conditionsSql = queryParameters.filters - .map { case FilterParameter(filterField, filterValue) => - filterValue match { - case dateRegex(_, _, _) => - s"DATE($filterField) = ?" - - case _ => - if (filterValue.toIntOption.isDefined || filterValue.toDoubleOption.isDefined) - s"$filterField = ?" - else - s"$filterField LIKE ?" - } - } - .mkString("WHERE ", " AND ", " ") - - val sql = - s""" - SELECT * FROM $tableName - ${if (queryParameters.filters.nonEmpty) conditionsSql else ""} - ORDER BY $sortBy ${queryParameters.sort.ordering} - LIMIT $limit OFFSET $offset - """ - val preparedStatement = conn.prepareStatement(sql) - - queryParameters.filters.zipWithIndex - .foreach { case (FilterParameter(_, filterValue), index) => - // We have to increment index by 1 because SQL parameterIndex starts in 1 - val sqlIndex = index + 1 - - filterValue match { - case dateRegex(year, month, day) => - val parsedDate = LocalDate.of(year.toInt, month.toInt, day.toInt) - preparedStatement.setDate(sqlIndex, Date.valueOf(parsedDate)) - - case _ => - if (filterValue.toIntOption.isDefined) - preparedStatement.setInt(sqlIndex, filterValue.toInt) - else if (filterValue.toDoubleOption.isDefined) - preparedStatement.setDouble(sqlIndex, filterValue.toDouble) - else - preparedStatement.setString(sqlIndex, s"%$filterValue%") - } - } - - val resultSet = preparedStatement.executeQuery() - val tableData = new ListBuffer[TableRow]() - try { - while (resultSet.next) { - val rowData = for { - column <- columns - columnName = column.name - stringData = getStringFromColumnName( - settings = settings, - resultSet = resultSet, - columnName = columnName, - baseUrl = baseUrl - ) - } yield Cell(stringData) - tableData += TableRow(rowData) - } - tableData.toList - } finally { - resultSet.close() - preparedStatement.close() - } - } - - private def getStringFromColumnName( - settings: TableSettings, - resultSet: ResultSet, - columnName: String, - baseUrl: String - ) = { - val maybe = settings.columnTypeOverrides.get(columnName) - val data = maybe - .map { - case CustomDataType.BinaryImage => - val rowId = resultSet.getString(settings.primaryKeyField) - s"$baseUrl/admin/images/${settings.tableName}/$columnName/$rowId" - // TODO: handle binary file - case CustomDataType.Binary => resultSet.getString(columnName) - } - .getOrElse(resultSet.getString(columnName)) - Option(data).getOrElse("") - } - - def getMandatoryFields(tableName: String, primaryKeyField: String)(implicit conn: Connection): List[TableColumn] = { - SQL""" - SELECT column_name, data_type - FROM information_schema.columns - WHERE table_schema = 'public' - AND is_nullable = 'NO' - AND column_default IS NULL - AND table_name = $tableName - AND column_name != $primaryKeyField - ORDER BY column_name - """.as(tableColumnParser.*) - } - - def find(settings: TableSettings, columns: List[TableColumn], primaryKeyValue: String, baseUrl: String)(implicit - conn: Connection - ): Option[TableRow] = { - val sql = s""" - SELECT * - FROM ${settings.tableName} - WHERE ${settings.primaryKeyField} = ? - """ - val preparedStatement = conn.prepareStatement(sql) - - setPreparedStatementKey(preparedStatement, primaryKeyValue, settings.primaryKeyDataType) - val resultSet = preparedStatement.executeQuery() - Try { - resultSet.next() - val row = for { - column <- columns - columnName = column.name - stringData = getStringFromColumnName( - settings = settings, - resultSet = resultSet, - columnName = columnName, - baseUrl = baseUrl - ) - } yield Cell(stringData) - TableRow(row.toList) - }.toOption - } - - private def setPreparedStatementKey( - preparedStatement: PreparedStatement, - primaryKeyValue: String, - primaryKeyType: PrimaryKeyDataType, - parameterIndex: Int = 1 - ): Unit = { - primaryKeyType match { // regular string unless UUID - case PrimaryKeyDataType.UUID => preparedStatement.setObject(parameterIndex, UUID.fromString(primaryKeyValue)) - // TODO: Handle errors when the value is not an integer - case PrimaryKeyDataType.Serial => - preparedStatement.setInt(parameterIndex, primaryKeyValue.toInt) // use setInt instead of setObject - case PrimaryKeyDataType.BigSerial => - preparedStatement.setLong(parameterIndex, primaryKeyValue.toLong) // use setLong instead of setObject - } - } - def create( - tableName: String, - body: Map[String, String], - primaryKeyField: String, - primaryKeyType: PrimaryKeyDataType = PrimaryKeyDataType.UUID - )(implicit - conn: Connection - ): Unit = { - val sql = QueryBuilder.create(tableName, body, primaryKeyField, primaryKeyType) - val preparedStatement = conn.prepareStatement(sql) - - var i = 0 - if (primaryKeyType == PrimaryKeyDataType.UUID) { - i = i + 1 - preparedStatement.setObject(i, UUID.randomUUID()) - } - // NOTE: QueryBuilder.create needs primaryKeyType parameter because it seems there is no way to pass DEFAULT - // into prepared statement parameter. Must be set literally in QueryBuilder.create - // eg. NULL can be used in MySQL to generate default value in an autoincrement column, but not Postgres unfortunately - // Postgres: INSERT INTO test_serial (id) VALUES(DEFAULT); MySQL: INSERT INTO table (id) VALUES(NULL) - - for (j <- i + 1 to body.size + i) { - val value = body(body.keys.toList(j - i - 1)) - preparedStatement.setObject(j, value) - } - val _ = preparedStatement.executeUpdate() - } - - def update( - tableName: String, - fieldsAndValues: Map[TableColumn, String], - primaryKeyField: String, - primaryKeyValue: String, - primaryKeyType: PrimaryKeyDataType = PrimaryKeyDataType.UUID - )(implicit conn: Connection): Unit = { - val sql = QueryBuilder.update(tableName, fieldsAndValues, primaryKeyField) - val preparedStatement = conn.prepareStatement(sql) - - val notNullData = fieldsAndValues.filterNot { case (_, value) => value == "null" } - notNullData.zipWithIndex.foreach { case ((_, value), i) => - preparedStatement.setObject(i + 1, value) - } - // where ... = ? - setPreparedStatementKey(preparedStatement, primaryKeyValue, primaryKeyType, notNullData.size + 1) - val _ = preparedStatement.executeUpdate() - } - - def delete( - tableName: String, - primaryKeyField: String, - primaryKeyValue: String, - primaryKeyType: PrimaryKeyDataType = PrimaryKeyDataType.UUID - )(implicit - conn: Connection - ): Unit = { - val sql = s""" - DELETE FROM $tableName - WHERE $primaryKeyField = ? - """ - val preparedStatement = conn.prepareStatement(sql) - setPreparedStatementKey(preparedStatement, primaryKeyValue, primaryKeyType) - val _ = preparedStatement.executeUpdate() - } - - def countRecordsOnTable(tableName: String)(implicit conn: Connection): Int = { - SQL""" - SELECT COUNT(*) - FROM #$tableName - """.as(SqlParser.int("count").single) - } - - def getImageData(settings: TableSettings, columnName: String, imageId: String)(implicit - conn: Connection - ): Option[Array[Byte]] = { - val sql = s""" - SELECT $columnName - FROM ${settings.tableName} - WHERE ${settings.primaryKeyField} = ? - """ - val preparedStatement = conn.prepareStatement(sql) - setPreparedStatementKey(preparedStatement, imageId, settings.primaryKeyDataType) - val resultSet = preparedStatement.executeQuery() - Try { - resultSet.next() - resultSet.getBytes(columnName) - }.toOption - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/package.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/package.scala deleted file mode 100644 index 9bf8cb8..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/package.scala +++ /dev/null @@ -1,45 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories - -import anorm.* -import net.wiringbits.webapp.utils.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn} - -package object daos { - import anorm.{Column, MetaDataItem, TypeDoesNotMatch} - import org.postgresql.util.PGobject - - implicit val citextToString: Column[String] = Column.nonNull { case (value, meta) => - val MetaDataItem(qualified, _, clazz) = meta - value match { - case str: String => Right(str) - case obj: PGobject if "citext" equalsIgnoreCase obj.getType => Right(obj.getValue) - case _ => - Left( - TypeDoesNotMatch( - s"Cannot convert $value: ${value.asInstanceOf[AnyRef].getClass} to String for column $qualified, class = $clazz" - ) - ) - } - } - - val tableParser: RowParser[DatabaseTable] = { - Macro.parser[DatabaseTable]( - "table_name" - ) - } - - val tableColumnParser: RowParser[TableColumn] = { - Macro.parser[TableColumn]( - "column_name", - "data_type" - ) - } - - val foreignKeyParser: RowParser[ForeignKey] = { - Macro.parser[ForeignKey]( - "foreign_table", - "primary_table", - "fk_column" - ) - } - -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/Cell.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/Cell.scala deleted file mode 100644 index 3efcfd0..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/Cell.scala +++ /dev/null @@ -1,5 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.models - -case class Cell( - value: String -) diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/DatabaseTable.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/DatabaseTable.scala deleted file mode 100644 index 98a1d83..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/DatabaseTable.scala +++ /dev/null @@ -1,5 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.models - -case class DatabaseTable( - name: String -) diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/ForeignKey.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/ForeignKey.scala deleted file mode 100644 index d515b5f..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/ForeignKey.scala +++ /dev/null @@ -1,3 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.models - -case class ForeignKey(foreignTable: String, primaryTable: String, foreignColumnName: String) diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableColumn.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableColumn.scala deleted file mode 100644 index 994e087..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableColumn.scala +++ /dev/null @@ -1,6 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.models - -case class TableColumn( - name: String, - `type`: String -) diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableData.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableData.scala deleted file mode 100644 index bdc3d75..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableData.scala +++ /dev/null @@ -1,3 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.models - -case class TableData(data: Map[String, String]) diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableRow.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableRow.scala deleted file mode 100644 index 33dd2af..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableRow.scala +++ /dev/null @@ -1,13 +0,0 @@ -package net.wiringbits.webapp.utils.admin.repositories.models - -import scala.collection.immutable.ListMap - -case class TableRow( - data: List[Cell] -) { - def convertToMap(fieldNames: List[String]): Map[String, String] = { - val rowData = data.map(_.value) - val test = fieldNames.zip(rowData) - ListMap.from(test) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/services/AdminService.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/services/AdminService.scala deleted file mode 100644 index c6e9b59..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/services/AdminService.scala +++ /dev/null @@ -1,265 +0,0 @@ -package net.wiringbits.webapp.utils.admin.services - -import net.wiringbits.webapp.utils.admin.config.{CustomDataType, DataExplorerSettings, TableSettings} -import net.wiringbits.webapp.utils.admin.repositories.DatabaseTablesRepository -import net.wiringbits.webapp.utils.admin.repositories.models.{ForeignKey, TableData} -import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters -import net.wiringbits.webapp.utils.admin.utils.{MapStringHideExt, contentRangeHeader} -import net.wiringbits.webapp.utils.api.models.* - -import java.awt.image.BufferedImage -import java.io.{ByteArrayInputStream, File} -import java.util.UUID -import javax.imageio.ImageIO -import javax.inject.Inject -import scala.concurrent.{ExecutionContext, Future} -import scala.util.Try - -class AdminService @Inject() ( - databaseTablesRepository: DatabaseTablesRepository, - tableSettings: DataExplorerSettings -)(implicit - ec: ExecutionContext -) { - - private def getColumnReference( - foreignKeys: List[ForeignKey], - columnName: String - ): Option[AdminGetTables.Response.TableReference] = { - val filteredForeignKeys = foreignKeys.filter(_.foreignColumnName == columnName) - val maybe = filteredForeignKeys.map(_.primaryTable).headOption - - maybe.map { tableName => - val maybe = tableSettings.unsafeFindByName(tableName).referenceField - val referenceField = maybe.getOrElse("id") - AdminGetTables.Response.TableReference(referencedTable = tableName, referenceField = referenceField) - } - } - - def tables(): Future[AdminGetTables.Response] = { - def getColumnName(fieldName: String, primaryKeyField: String) = { - val isPrimaryField = fieldName == primaryKeyField - // NOTE: react-admin requires the id field to be available - if (isPrimaryField) "id" else fieldName - } - - for { - items <- Future.sequence { - tableSettings.tables.map { settings => - val hiddenColumns = settings.hiddenColumns - for { - tableColumns <- databaseTablesRepository.getTableColumns(settings.tableName) - foreignKeys <- databaseTablesRepository.getForeignKeys(settings.tableName) - - visibleColumns = tableColumns.filterNot(column => hiddenColumns.contains(column.name)) - columns = visibleColumns.map { column => - val fieldName = getColumnName(column.name, settings.primaryKeyField) - val isEditable = !settings.nonEditableColumns.contains(column.name) - val reference = getColumnReference(foreignKeys, column.name) - val isFilterable = settings.filterableColumns.contains(column.name) - AdminGetTables.Response.TableColumn( - name = fieldName, - `type` = column.`type`, - editable = isEditable, - reference = reference, - filterable = isFilterable - ) - } - } yield AdminGetTables.Response.DatabaseTable( - name = settings.tableName, - columns = columns, - primaryKeyName = settings.primaryKeyField, - canBeDeleted = settings.canBeDeleted - ) - } - } - } yield AdminGetTables.Response(items) - } - - private def hideData(tableData: TableData, hiddenColumns: List[String]) = { - tableData.data.hideData(hiddenColumns) - } - - def tableMetadata(tableName: String, queryParams: QueryParameters): Future[(List[Map[String, String]], String)] = { - val validations = { - for { - _ <- Future(validateTableName(tableName)) - } yield () - } - - for { - _ <- validations - settings = tableSettings.unsafeFindByName(tableName) - _ <- validateQueryParameters(tableName, queryParams) - tableRows <- databaseTablesRepository.getTableMetadata(settings, queryParams) - numberOfRecords <- databaseTablesRepository.numberOfRecords(tableName) - hiddenTableData = tableRows.map(data => hideData(data, settings.hiddenColumns)) - contentRange = contentRangeHeader(tableName, queryParams, numberOfRecords) - } yield (hiddenTableData, contentRange) - } - - private def validateQueryParameters(tableName: String, params: QueryParameters): Future[Unit] = { - val validOrdering = List("ASC", "DESC") - if (!validOrdering.contains(params.sort.ordering)) - throw new RuntimeException("Invalid ordering parameter") - if (params.pagination.start < 0) - throw new RuntimeException("You can't query a table using negative numbers") - if (params.pagination.start > params.pagination.end) - throw new RuntimeException("The start parameter can't be bigger than the end") - for { - _ <- validateColumnName(tableName, params.sort.field) - } yield () - } - - def find(tableName: String, primaryKeyValue: String): Future[Map[String, String]] = { - val validations = Future { - validateTableName(tableName) - } - - for { - _ <- validations - maybe <- databaseTablesRepository.find(tableName, primaryKeyValue) - tableRow = maybe.getOrElse(throw new RuntimeException(s"Cannot find item in $tableName with id $primaryKeyValue")) - settings = tableSettings.unsafeFindByName(tableName) - hiddenData = hideData(tableRow, settings.hiddenColumns) - } yield hiddenData - } - - def find(tableName: String, primaryKeyValues: List[String]): Future[List[Map[String, String]]] = { - val validations = Future { - validateTableName(tableName) - } - - for { - _ <- validations - settings = tableSettings.unsafeFindByName(tableName) - tableRows <- Future.sequence { - primaryKeyValues.map { primaryKeyValue => - for { - maybe <- databaseTablesRepository.find(tableName, primaryKeyValue) - tableData = maybe.getOrElse( - throw new RuntimeException(s"Cannot find item in $tableName with id $primaryKeyValue") - ) - } yield tableData - } - } - maskedTableData = tableRows.map(x => hideData(x, settings.hiddenColumns)) - } yield maskedTableData - } - - def create(tableName: String, request: AdminCreateTable.Request): Future[Unit] = { - val body = request.data - val validations = { - validateTableName(tableName) - for { - _ <- validateRequestData(tableName, body) - _ <- validateMissingFields(tableName, body) - } yield () - } - - for { - _ <- validations - _ <- databaseTablesRepository.create(tableName, body) - } yield () - } - - private def validateMissingFields(tableName: String, data: Map[String, String]): Future[Unit] = { - for { - mandatoryFields <- databaseTablesRepository.getMandatoryFields(tableName) - mandatoryFieldNames = mandatoryFields.map(_.name) - missingFields = mandatoryFieldNames.forall(data.contains) - } yield - if (missingFields) () - else - throw new RuntimeException( - s"There are missing fields: ${mandatoryFieldNames.filterNot(data.contains).mkString(", ")}" - ) - } - - def update(tableName: String, primaryKeyValue: String, body: Map[String, String]): Future[Unit] = { - val validations = { - if (body.isEmpty) throw new RuntimeException(s"You need to send data") else () - validateTableName(tableName) - for { - _ <- validateRequestData(tableName, body) - } yield () - } - - for { - _ <- validations - _ <- databaseTablesRepository.update(tableName, primaryKeyValue, body) - } yield () - } - - def delete(tableName: String, primaryKeyValue: String): Future[Unit] = { - val validations = for { - _ <- Future(validateTableName(tableName)) - settings = tableSettings.unsafeFindByName(tableName) - _ = if (settings.canBeDeleted) () else throw new RuntimeException(s"Table $tableName resources cannot be deleted") - } yield () - - for { - _ <- validations - - _ <- databaseTablesRepository.delete(tableName, primaryKeyValue) - } yield () - } - - private def validateTableName(tableName: String): Unit = { - val exists = tableSettings.tables.exists(_.tableName == tableName) - if (exists) () else throw new RuntimeException(s"Unexpected error because the DB table wasn't found: $tableName") - } - - private def validateRequestData(tableName: String, body: Map[String, String]): Future[Unit] = { - for { - tableColumns <- databaseTablesRepository.getTableColumns(tableName) - columnNames = tableColumns.map(_.name) - requestFields = body.keys - exists = requestFields.forall(columnNames.contains) - } yield if (exists) () else throw new RuntimeException(s"A field doesn't correspond to this table schema") - } - - private def validateColumnName(tableName: String, columnName: String): Future[Unit] = { - for { - tableColumns <- databaseTablesRepository.getTableColumns(tableName) - columnNames = tableColumns.map(_.name) - exists = columnNames.contains(columnName) || columnName == "id" - } yield if (exists) () else throw new RuntimeException(s"Column $columnName doesn't exists in $tableName") - } - - def findImage(tableName: String, columnName: String, imageId: String): Future[File] = { - val validations = { - for { - _ <- validateColumnName(tableName, columnName) - _ <- Future(validateResourceId(imageId)) - } yield () - } - for { - _ <- validations - settings = tableSettings.unsafeFindByName(tableName) - _ = validateImageColumn(settings, columnName) - maybe <- databaseTablesRepository.getImageData(settings, columnName, imageId) - imageData = maybe.getOrElse(throw new RuntimeException(s"Image with id $imageId on $tableName doesn't exists")) - image = createImage(imageData) - } yield createFile(imageId, image) - } - - private def validateResourceId(resourceId: String): Unit = { - val isValid = Try(BigInt(resourceId)).isSuccess || Try(UUID.fromString(resourceId)).isSuccess - if (isValid) () else throw new RuntimeException(s"Resource id $resourceId is not valid") - } - - private def validateImageColumn(settings: TableSettings, columnName: String): Unit = { - val maybe = settings.columnTypeOverrides.find(x => x._1 == columnName && x._2 == CustomDataType.BinaryImage) - if (maybe.isDefined) () else throw new RuntimeException("This column can't be used as a binary image") - } - - private def createImage(data: Array[Byte]) = ImageIO.read(new ByteArrayInputStream(data)) - - // TODO: avoid assuming that every DB image is on png format - private def createFile(imageId: String, buffImage: BufferedImage) = { - val outputFile = File.createTempFile(imageId, ".png") - ImageIO.write(buffImage, "png", outputFile) - outputFile - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/tasks/DataExplorerConfigValidatorTask.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/tasks/DataExplorerConfigValidatorTask.scala deleted file mode 100644 index 9e66c1f..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/tasks/DataExplorerConfigValidatorTask.scala +++ /dev/null @@ -1,93 +0,0 @@ -package net.wiringbits.webapp.utils.admin.tasks - -import net.wiringbits.webapp.utils.admin.config.{DataExplorerSettings, TableSettings} -import net.wiringbits.webapp.utils.admin.repositories.daos.DatabaseTablesDAO -import net.wiringbits.webapp.utils.admin.repositories.models.{DatabaseTable, TableColumn} -import org.slf4j.LoggerFactory -import play.api.db.Database - -import javax.inject.Inject -import scala.util.{Failure, Success, Try} - -/** Given that the use provides the tables used by the data explorer, it is important to make sure those tables exist in - * the database. - * - * This task loads the available tables from the database and compares those to the ones provided by the user-defined - * config, failing when there is a mismatch. - * - * @param database - * @param settings - */ -class DataExplorerConfigValidatorTask @Inject() ( - database: Database, - settings: DataExplorerSettings -) { - private val logger = LoggerFactory.getLogger(this.getClass) - - start() - - def start(): Unit = { - logger.info("Running task") - Try(run()) match { - case Failure(exception) => logger.error("Data explorer settings validation failed", exception) - case Success(_) => logger.info("Data explorer settings validated") - } - } - - private def run(): Unit = { - database.withConnection { implicit conn => - val tables = DatabaseTablesDAO.all() - for (settingsTable <- settings.tables) { - logger.info(s"Verifying ${settingsTable.tableName}") - val fields = DatabaseTablesDAO.getTableColumns(settingsTable.tableName) - validateSettings(settingsTable) - validateTableName(settingsTable.tableName, tables) - validatePrimaryKeyFieldName(settingsTable.primaryKeyField, fields) - validateHiddenColumns(settingsTable.hiddenColumns, fields) - validateNonEditableColumns(settingsTable.nonEditableColumns, fields) - validateReferenceField(settingsTable.referenceField, fields) - } - } - } - - private def validateTableName(tableName: String, tablesInDB: List[DatabaseTable]): Unit = { - if (tablesInDB.exists(_.name == tableName)) () - else throw new RuntimeException(s"$tableName not found, available tables = ${tablesInDB.mkString(", ")}") - } - - private def validatePrimaryKeyFieldName(idFieldName: String, fields: List[TableColumn]): Unit = { - val exists = fields.exists(_.name == idFieldName) - if (exists) () - else throw new RuntimeException(s"The provided id on DataExplorer settings doesn't exists: $idFieldName") - } - - private def validateHiddenColumns(columns: List[String], fields: List[TableColumn]): Unit = { - val fieldNames = fields.map(_.name) - val isValid = columns.forall(fieldNames.contains) - if (isValid) () - else throw new RuntimeException(s"The provided hidden columns on DataExplorer settings doesn't exists: $columns") - } - - private def validateReferenceField(maybe: Option[String], fields: List[TableColumn]): Unit = { - maybe.foreach { field => - val isValid = fields.exists(_.name == field) - if (isValid) () - else - throw new RuntimeException( - s"The provided reference field column on DataExplorer settings doesn't exists: $field" - ) - } - } - - private def validateNonEditableColumns(columns: List[String], tableFields: List[TableColumn]): Unit = { - val fieldNames = tableFields.map(_.name) - val isValid = columns.forall(fieldNames.contains) - if (isValid) () - else throw new RuntimeException(s"The provided disabled columns on DataExplorer settings doesn't exists: $columns") - } - - private def validateSettings(settings: TableSettings): Unit = { - if (settings.referenceField.exists(settings.hiddenColumns.contains)) - throw new RuntimeException("Hidden columns cannot contain the reference field") - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/QueryBuilder.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/QueryBuilder.scala deleted file mode 100644 index 89e2495..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/QueryBuilder.scala +++ /dev/null @@ -1,49 +0,0 @@ -package net.wiringbits.webapp.utils.admin.utils - -import net.wiringbits.webapp.utils.admin.config.PrimaryKeyDataType -import net.wiringbits.webapp.utils.admin.repositories.models.TableColumn - -import scala.collection.mutable - -object QueryBuilder { - def create( - tableName: String, - body: Map[String, String], - primaryKeyField: String, - primaryKeyType: PrimaryKeyDataType = PrimaryKeyDataType.UUID - ): String = { - val sqlFields = new mutable.StringBuilder(primaryKeyField) - val sqlValues = primaryKeyType match { - case PrimaryKeyDataType.UUID => new mutable.StringBuilder("?") - case PrimaryKeyDataType.Serial => new mutable.StringBuilder("DEFAULT") - case PrimaryKeyDataType.BigSerial => new mutable.StringBuilder("DEFAULT") - } - for ((key, _) <- body) { - sqlFields.append(s", $key") - sqlValues.append(s", ?") - } - - s""" - |INSERT INTO $tableName - | ($sqlFields) - |VALUES ( - | ${sqlValues.toString()} - |) - |""".stripMargin - } - - def update(tableName: String, body: Map[TableColumn, String], primaryKeyField: String): String = { - val updateStatement = new mutable.StringBuilder("SET") - for ((tableField, value) <- body) { - val resultStatement = if (value == "null") "NULL" else s"?::${tableField.`type`}" - val statement = s" ${tableField.name} = $resultStatement," - updateStatement.append(statement) - } - updateStatement.deleteCharAt(updateStatement.length - 1) - s""" - |UPDATE $tableName - |$updateStatement - |WHERE $primaryKeyField = ? - |""".stripMargin - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/StringRegex.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/StringRegex.scala deleted file mode 100644 index 449a954..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/StringRegex.scala +++ /dev/null @@ -1,7 +0,0 @@ -package net.wiringbits.webapp.utils.admin.utils - -import scala.util.matching.Regex - -object StringRegex { - val dateRegex: Regex = "([12]\\d{3})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])".r -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/FilterParameter.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/FilterParameter.scala deleted file mode 100644 index f3a5bec..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/FilterParameter.scala +++ /dev/null @@ -1,16 +0,0 @@ -package net.wiringbits.webapp.utils.admin.utils.models - -import net.wiringbits.webapp.utils.admin.utils.StringToDataTypesExt - -case class FilterParameter(field: String, value: String) { - override def toString: String = s"$field=$value" -} - -object FilterParameter { - def fromString(str: String): List[FilterParameter] = { - val filters = str.toStringMap - filters.map { case (field, value) => - FilterParameter(field, value) - }.toList - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/PaginationParameter.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/PaginationParameter.scala deleted file mode 100644 index 8a9aca3..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/PaginationParameter.scala +++ /dev/null @@ -1,17 +0,0 @@ -package net.wiringbits.webapp.utils.admin.utils.models - -import net.wiringbits.webapp.utils.admin.utils.StringToDataTypesExt - -import scala.util.Try - -case class PaginationParameter(start: Int, end: Int) - -object PaginationParameter { - // transforms a string like: "[0,9]" into this model - def fromString(str: String): PaginationParameter = { - val range = str.toStringList.map(Integer.parseInt) - val start = range.headOption.getOrElse(0) - val end = Try(range(1)).getOrElse(9) - PaginationParameter(start = start, end = end) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/QueryParameters.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/QueryParameters.scala deleted file mode 100644 index 558dd71..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/QueryParameters.scala +++ /dev/null @@ -1,8 +0,0 @@ -package net.wiringbits.webapp.utils.admin.utils.models - -case class QueryParameters(sort: SortParameter, pagination: PaginationParameter, filters: List[FilterParameter]) { - override def toString: String = { - s"sort = ${sort.field} ${sort.ordering}, pagination = ${pagination.start} to ${pagination.end}, filters = ${filters - .mkString("{", ", ", "}")}" - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/SortParameter.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/SortParameter.scala deleted file mode 100644 index b5ba128..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/models/SortParameter.scala +++ /dev/null @@ -1,16 +0,0 @@ -package net.wiringbits.webapp.utils.admin.utils.models - -import net.wiringbits.webapp.utils.admin.utils.StringToDataTypesExt - -import scala.util.Try - -case class SortParameter(field: String, ordering: String) - -object SortParameter { - def fromString(str: String): SortParameter = { - val sort = str.toStringList - val field = sort.headOption.getOrElse("") - val ordering = Try(sort(1)).getOrElse("") - SortParameter(field = field, ordering = ordering) - } -} diff --git a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/package.scala b/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/package.scala deleted file mode 100644 index 9b4b3ce..0000000 --- a/admin-data-explorer-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/utils/package.scala +++ /dev/null @@ -1,29 +0,0 @@ -package net.wiringbits.webapp.utils.admin - -import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters -import play.api.libs.json.Json - -package object utils { - implicit class StringToDataTypesExt(val str: String) extends AnyVal { - // convert ["id", "ASC"] string to List("id", "ASC") - implicit def toStringList: List[String] = { - str.substring(1, str.length - 1).filterNot(x => x == '"').split(",").toList - } - - // convert json object string (for example: "{}") to Map - implicit def toStringMap: Map[String, String] = { - val maybe = Json.parse(str).validate[Map[String, String]] - maybe.getOrElse(Map.empty) - } - } - - implicit class MapStringHideExt(val data: Map[String, String]) extends AnyVal { - def hideData(columnsToHide: List[String]): Map[String, String] = { - data.filterNot { case (key, _) => columnsToHide.contains(key) } - } - } - - def contentRangeHeader(tableName: String, queryParameters: QueryParameters, numberOfRecords: Int): String = { - s"$tableName ${queryParameters.pagination.start}-${queryParameters.pagination.end}/$numberOfRecords" - } -} diff --git a/admin-data-explorer-play-server/src/test/resources/application.conf b/admin-data-explorer-play-server/src/test/resources/application.conf deleted file mode 100644 index 39c0bfe..0000000 --- a/admin-data-explorer-play-server/src/test/resources/application.conf +++ /dev/null @@ -1,77 +0,0 @@ -# https://www.playframework.com/documentation/latest/Configuration - -play.i18n.langs = ["en"] - -play.filters.hosts { - allowed = ["localhost", "localhost:9000", "127.0.0.1:9000"] - allowed += ${?APP_ALLOWED_HOST_1} - allowed += ${?APP_ALLOWED_HOST_2} -} - -play.http { - secret.key="this doesn't matter no sessions are being used" - secret.key=${?PLAY_APPLICATION_SECRET} - - errorHandler = "play.api.http.JsonHttpErrorHandler" -} - -play.filters.disabled += "play.filters.csrf.CSRFFilter" - -db.default { - driver = "org.postgresql.Driver" - host = "localhost:5432" - database = "wiringbits_db" - username = "postgres" - password = "postgres" - - host = ${?POSTGRES_HOST} - database = ${?POSTGRES_DATABASE} - username = ${?POSTGRES_USERNAME} - password = ${?POSTGRES_PASSWORD} - - url = "jdbc:postgresql://"${db.default.host}"/"${db.default.database} -} - -play.evolutions { - autoApply = true - - db.default { - enabled = true - # Important because when this is false, failed migrations won't get to the play_evolutions table - # preventing us to fix them manually - autocommit = true - } -} - -# Number of database connections -# See https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing -fixedConnectionPool = 9 - -play.db { - prototype { - hikaricp.minimumIdle = ${fixedConnectionPool} - hikaricp.maximumPoolSize = ${fixedConnectionPool} - } -} - -# Job queue sized to HikariCP connection pool -database.dispatcher { - executor = "thread-pool-executor" - throughput = 1 - thread-pool-executor { - fixed-pool-size = ${fixedConnectionPool} - } -} - -blocking.dispatcher { - executor = "thread-pool-executor" - throughput = 1 - thread-pool-executor { - // very high bound to process lots of blocking operations concurrently - fixed-pool-size = 5000 - } -} - -play.modules.enabled += "net.wiringbits.webapp.utils.admin.modules.ExecutorsModule" -play.modules.enabled += "net.wiringbits.webapp.utils.admin.modules.AdminModule" -play.modules.enabled += "net.wiringbits.webapp.utils.admin.modules.DataExplorerTestModule" diff --git a/admin-data-explorer-play-server/src/test/resources/evolutions/default/1.sql b/admin-data-explorer-play-server/src/test/resources/evolutions/default/1.sql deleted file mode 100644 index 7c76a6d..0000000 --- a/admin-data-explorer-play-server/src/test/resources/evolutions/default/1.sql +++ /dev/null @@ -1,30 +0,0 @@ - --- !Ups - -CREATE EXTENSION IF NOT EXISTS CITEXT; - --- The users table has the minimum necessary data -CREATE TABLE users( - user_id UUID NOT NULL, - name TEXT NOT NULL, - last_name TEXT NULL, - email CITEXT NOT NULL, - password TEXT NOT NULL, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - CONSTRAINT users_user_id_pk PRIMARY KEY (user_id), - CONSTRAINT users_email_unique UNIQUE (email) -); - -CREATE INDEX users_email_index ON users USING BTREE (email); - --- create the table to store the user logs -CREATE TABLE user_logs ( - user_log_id UUID NOT NULL, - user_id UUID NOT NULL, - message TEXT NOT NULL, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), - CONSTRAINT user_logs_pk PRIMARY KEY (user_log_id), - CONSTRAINT user_logs_users_fk FOREIGN KEY (user_id) REFERENCES users(user_id) -); - -CREATE INDEX user_logs_user_id_index ON user_logs USING BTREE (user_id); diff --git a/admin-data-explorer-play-server/src/test/resources/evolutions/default/2.sql b/admin-data-explorer-play-server/src/test/resources/evolutions/default/2.sql deleted file mode 100644 index 3af7030..0000000 --- a/admin-data-explorer-play-server/src/test/resources/evolutions/default/2.sql +++ /dev/null @@ -1,35 +0,0 @@ - --- !Ups - -CREATE TABLE uuid_table ( - id UUID NOT NULL PRIMARY KEY, - name TEXT NOT NULL -); - -CREATE TABLE serial_table ( - id SERIAL NOT NULL PRIMARY KEY, - name TEXT NOT NULL -); - -CREATE TABLE big_serial_table ( - id BIGSERIAL NOT NULL PRIMARY KEY, - name TEXT NOT NULL -); - --- start at max value. first insert will be at max, second should fail. --- ERROR: integer out of range -CREATE SEQUENCE serial_table_overflow_seq START 2147483647; -CREATE TABLE serial_table_overflow ( - id integer NOT NULL DEFAULT nextval('serial_table_overflow_seq') PRIMARY KEY, - name TEXT NOT NULL -); -ALTER SEQUENCE serial_table_overflow_seq OWNED BY serial_table_overflow.id; - --- start at max value. first insert will be at max, second should fail. --- ERROR: nextval: reached maximum value of sequence "big_serial_table_overflow_seq" (9223372036854775807) -CREATE SEQUENCE big_serial_table_overflow_seq START 9223372036854775807; -CREATE TABLE big_serial_table_overflow ( - id bigint NOT NULL DEFAULT nextval('big_serial_table_overflow_seq') PRIMARY KEY, - name TEXT NOT NULL -); -ALTER SEQUENCE big_serial_table_overflow_seq OWNED BY big_serial_table_overflow.id; diff --git a/admin-data-explorer-play-server/src/test/resources/logback.xml b/admin-data-explorer-play-server/src/test/resources/logback.xml deleted file mode 100644 index 8df13b1..0000000 --- a/admin-data-explorer-play-server/src/test/resources/logback.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - ${user.home:-.}/logs/application.log - - - - ${user.home:-.}/logs/application.%d{yyyy-MM-dd}.log - - - 30 - 3GB - - - - %date [%level] from %logger in %thread - %message%n%rEx%xException - - - - - - %coloredLevel %logger{15} - %message%n%rEx%xException{10} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/admin-data-explorer-play-server/src/test/resources/messages b/admin-data-explorer-play-server/src/test/resources/messages deleted file mode 100644 index 0226738..0000000 --- a/admin-data-explorer-play-server/src/test/resources/messages +++ /dev/null @@ -1 +0,0 @@ -# https://www.playframework.com/documentation/latest/ScalaI18N diff --git a/admin-data-explorer-play-server/src/test/resources/routes b/admin-data-explorer-play-server/src/test/resources/routes deleted file mode 100644 index 9a31b0d..0000000 --- a/admin-data-explorer-play-server/src/test/resources/routes +++ /dev/null @@ -1,17 +0,0 @@ -# get database tables -GET /admin/tables net.wiringbits.webapp.utils.admin.controllers.AdminController.getTables() - -# get database table fields -GET /admin/tables/:tableName net.wiringbits.webapp.utils.admin.controllers.AdminController.getTableMetadata(tableName, offset: Int ?= 0, limit: Int ?= 10) - -# get table resource by id (depends on IDFieldName on AdminConfig) -GET /admin/tables/:tableName/:ID net.wiringbits.webapp.utils.admin.controllers.AdminController.find(tableName, ID) - -# create table resource -POST /admin/tables/:tableName net.wiringbits.webapp.utils.admin.controllers.AdminController.create(tableName) - -# update table resource -PUT /admin/tables/:tableName/:ID net.wiringbits.webapp.utils.admin.controllers.AdminController.update(tableName, ID) - -# delete table resource -DELETE /admin/tables/:tableName/:ID net.wiringbits.webapp.utils.admin.controllers.AdminController.delete(tableName, ID) diff --git a/admin-data-explorer-play-server/src/test/scala/controllers/AdminControllerSpec.scala b/admin-data-explorer-play-server/src/test/scala/controllers/AdminControllerSpec.scala deleted file mode 100644 index 544c3a5..0000000 --- a/admin-data-explorer-play-server/src/test/scala/controllers/AdminControllerSpec.scala +++ /dev/null @@ -1,774 +0,0 @@ -package controllers - -import com.dimafeng.testcontainers.PostgreSQLContainer -import controllers.common.PlayPostgresSpec -import net.wiringbits.webapp.utils.admin.AppRouter -import net.wiringbits.webapp.utils.admin.config.{DataExplorerSettings, TableSettings} -import net.wiringbits.webapp.utils.admin.controllers.{AdminController, ImagesController} -import net.wiringbits.webapp.utils.api.models.AdminCreateTable -import org.apache.commons.lang3.StringUtils -import play.api.inject.guice.GuiceApplicationBuilder - -import java.util.UUID -import java.util.regex.Pattern -import scala.util.Random - -class AdminControllerSpec extends PlayPostgresSpec { - def dataExplorerSettings: DataExplorerSettings = app.injector.instanceOf(classOf[DataExplorerSettings]) - def usersSettings: TableSettings = dataExplorerSettings.tables.headOption.value - // TODO: loop through dataExplorerSettings for each table instead of defining usersSettings, uuidSettings - def uuidSettings: TableSettings = dataExplorerSettings.tables(1) - def serialSettings: TableSettings = dataExplorerSettings.tables(2) - def bigSerialSettings: TableSettings = dataExplorerSettings.tables(3) - def serialOverflowSettings: TableSettings = dataExplorerSettings.tables(4) - def bigSerialOverflowSettings: TableSettings = dataExplorerSettings.tables(5) - - def isValidUUID(str: String): Boolean = { - if (str == null) return false - Pattern.compile("^[{]?[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}[}]?$").matcher(str).matches() - } - - override def guiceApplicationBuilder(container: PostgreSQLContainer): GuiceApplicationBuilder = { - val appBuilder = super.guiceApplicationBuilder(container) - val adminController = appBuilder.injector().instanceOf[AdminController] - val imagesController = appBuilder.injector().instanceOf[ImagesController] - val appRouter = new AppRouter(adminController, imagesController) - appBuilder.router(appRouter) - } - - "GET /admin/tables" should { - "return tables from modules" in withApiClient { client => - val response = client.getTables.futureValue - val tableName = response.data.map(_.name).headOption.value // users - tableName must be(usersSettings.tableName) - val uuidTable = response.data.map(_.name)(1) // table 2 - uuidTable must be(uuidSettings.tableName) - val serialTable = response.data.map(_.name)(2) // table 3 - serialTable must be(serialSettings.tableName) - val bigSerialTable = response.data.map(_.name)(3) // table 4 - bigSerialTable must be(bigSerialSettings.tableName) - } - - "return extra config from module" in withApiClient { client => - val response = client.getTables.futureValue - val head = response.data.headOption.value - head.primaryKeyName must be(usersSettings.primaryKeyField) - usersSettings.referenceField must be(None) - usersSettings.hiddenColumns must be(List.empty) - usersSettings.nonEditableColumns must be(List.empty) - - val head2 = response.data(1) - head2.primaryKeyName must be(uuidSettings.primaryKeyField) - uuidSettings.referenceField must be(None) - uuidSettings.hiddenColumns must be(List.empty) - uuidSettings.nonEditableColumns must be(List.empty) - - val head3 = response.data(2) - head3.primaryKeyName must be(serialSettings.primaryKeyField) - serialSettings.referenceField must be(None) - serialSettings.hiddenColumns must be(List.empty) - serialSettings.nonEditableColumns must be(List.empty) - - val head4 = response.data(3) - head4.primaryKeyName must be(bigSerialSettings.primaryKeyField) - bigSerialSettings.referenceField must be(None) - bigSerialSettings.hiddenColumns must be(List.empty) - bigSerialSettings.nonEditableColumns must be(List.empty) - } - } - - "GET /admin/tables/:tableName" should { - "return data" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val request = AdminCreateTable.Request( - Map("name" -> name, "email" -> email, "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val head = response.headOption.value - // TODO: Find a better way to do this - val nameValue = head.find(_._1 == "name").value._2 - val emailValue = head.find(_._1 == "email").value._2 - response.size must be(1) - name must be(nameValue) - email must be(emailValue) - } - - "return data from uuid table" in withApiClient { client => - val name = "wiringbits" - // val uuid_id = UUID.randomUUID().toString - val request = AdminCreateTable.Request( - Map("name" -> name) - ) - client.createItem(uuidSettings.tableName, request).futureValue - - val response = client.getTableMetadata(uuidSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val head = response.headOption.value - // TODO: Find a better way to do this - val uuidValue = head.find(_._1 == "id").value._2 - val nameValue = head.find(_._1 == "name").value._2 - response.size must be(1) - name must be(nameValue) - isValidUUID(uuidValue) must be(true) - } - - "return data from serial table" in withApiClient { client => - val name = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name)) - client.createItem(serialSettings.tableName, request).futureValue - - val response = - client.getTableMetadata(serialSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val head = response.headOption.value - // TODO: Find a better way to do this - val intValue = head.find(_._1 == "id").value._2 - val nameValue = head.find(_._1 == "name").value._2 - response.size must be(1) - intValue must be("1") - name must be(nameValue) - } - "return data from big serial table" in withApiClient { client => - val name = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name)) - client.createItem(bigSerialSettings.tableName, request).futureValue - - val response = - client.getTableMetadata(bigSerialSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val head = response.headOption.value - // TODO: Find a better way to do this - val intValue = head.find(_._1 == "id").value._2 - val nameValue = head.find(_._1 == "name").value._2 - response.size must be(1) - intValue must be("1") - name must be(nameValue) - } - - "return a empty map if there isn't any user" in withApiClient { client => - val response = client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - response.size must be(0) - } - - "return an empty map if tables are empty" in withApiClient { client => - val response = client.getTableMetadata(uuidSettings.tableName, List("id", "ASC"), List(0, 9), "{}").futureValue - response.size must be(0) - val response2 = client.getTableMetadata(serialSettings.tableName, List("id", "ASC"), List(0, 9), "{}").futureValue - response2.size must be(0) - val response3 = - client.getTableMetadata(bigSerialSettings.tableName, List("id", "ASC"), List(0, 9), "{}").futureValue - response3.size must be(0) - } - - "return a empty map if start and end is the same" in withApiClient { client => - val request = AdminCreateTable.Request( - Map("name" -> "wiringbits", "email" -> "test@wiringbits.net", "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 0), "{}").futureValue - response.size must be(0) - } - - "return an empty map for range of zero length" in withApiClient { client => - val name = "wiringbits" - val request = AdminCreateTable.Request( - Map("name" -> name) - ) // can use this for all 3 of the simple tables UUID, SERIAL, BIGSERIAL - - client.createItem(uuidSettings.tableName, request).futureValue // 1 - val response1 = client.getTableMetadata(uuidSettings.tableName, List("id", "ASC"), List(0, 0), "{}").futureValue - response1.size must be(0) - - client.createItem(serialSettings.tableName, request).futureValue // 2 - val response2 = client.getTableMetadata(serialSettings.tableName, List("id", "ASC"), List(0, 0), "{}").futureValue - response2.size must be(0) - - client.createItem(bigSerialSettings.tableName, request).futureValue // 2 - val response3 = - client.getTableMetadata(bigSerialSettings.tableName, List("id", "ASC"), List(0, 0), "{}").futureValue - response3.size must be(0) - - } - - "only return the end minus start elements" in withApiClient { client => - Range.apply(0, 4).foreach { i => - val data = Map("name" -> "wiringbits", "email" -> s"test@wiringbits$i.net", "password" -> "wiringbits") - val request = AdminCreateTable.Request(data) - client.createItem(usersSettings.tableName, request).futureValue - } - val end = 2 - val start = 1 - val returnedElements = end - start - val response = - client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(start, end), "{}").futureValue - response.size must be(returnedElements) - } - - "only return the range size of elements" in withApiClient { client => - val end = 2 - val start = 1 - val returnedElements = end - start - // val data = Map() // data for these tables is always nothing. BIG/SERIAL autogenerated. - val name = "wiringbits" - - val tables = List(uuidSettings, serialSettings, bigSerialSettings) - // this could just be a for loop instead of for comprehension - for (table <- tables) - yield { - Range.apply(0, 4).foreach { _ => - val request = AdminCreateTable.Request( - Map("name" -> name) - ) // tried using data and got error. I thought val data was in scope but perhaps not - client.createItem(table.tableName, request).futureValue - } - } - - for (table <- tables) - yield { - val response = client.getTableMetadata(table.tableName, List("id", "ASC"), List(start, end), "{}").futureValue - response.size must be(returnedElements) - } - } - - "return the elements in ascending order" in withApiClient { client => - // should really be 5, since 5 users are created. Or Range.apply should start at 1. - val createdUsers = 4 - val nameLength = 7 - Range.apply(0, createdUsers).foreach { i => - val letter = Character.valueOf(('A' + i).toChar) - val name = StringUtils.repeat(letter, nameLength) - val data = Map("name" -> name, "email" -> s"test@wiringbits$i.net", "password" -> "wiringbits") - val request = AdminCreateTable.Request(data) - client.createItem(usersSettings.tableName, request).futureValue - } - val response = - client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, createdUsers), "{}").futureValue - val head = response.headOption.value - val name = head.find(_._1 == "name").value._2 - response.size must be(createdUsers) - name must be(StringUtils.repeat('A', nameLength)) - } - - // TODO: add uuidSettings table to tests below - "return the elements of all tables in ascending order" in withApiClient { client => - val createdRows = 4 - val tables = List(serialSettings, bigSerialSettings) - val name = "wiringbits" - val expectedName = name + "0" - - // insert rows - for (table <- tables) - yield { - Range.apply(0, createdRows).foreach { i => - val request = AdminCreateTable.Request(Map("name" -> s"$name$i")) - client.createItem(table.tableName, request).futureValue - } - } - - for (table <- tables) - yield { - val response = - client.getTableMetadata(table.tableName, List("name", "ASC"), List(0, createdRows), "{}").futureValue - val head = response.headOption.value - val id = head.find(_._1 == "id").value._2 // id from response - val nameValue = head.find(_._1 == "name").value._2 // name from response - response.size must be(createdRows) - id must be("1") - nameValue must be(expectedName) - } - } - - "return the elements in descending order" in withApiClient { client => - val createdUsers = 4 - val nameLength = 7 - Range.apply(0, createdUsers).foreach { i => - val letter = Character.valueOf(('A' + i).toChar) - val name = StringUtils.repeat(letter, nameLength); - val data = Map("name" -> name, "email" -> s"test@wiringbits$i.net", "password" -> "wiringbits") - val request = AdminCreateTable.Request(data) - client.createItem(usersSettings.tableName, request).futureValue - } - val response = - client.getTableMetadata(usersSettings.tableName, List("name", "DESC"), List(0, createdUsers), "{}").futureValue - val head = response.headOption.value - val name = head.find(_._1 == "name").value._2 - response.size must be(createdUsers) - name must be(StringUtils.repeat('D', nameLength)) - } - "return the elements of all tables in descending order" in withApiClient { client => - val createdRows = 4 - // removed uuidSettings because ordering is random - val tables = List(serialSettings, bigSerialSettings) - val name = "Johnny" - val expectedNameValue = name + (createdRows - 1).toString - // insert rows - for (table <- tables) - yield { - Range.apply(0, createdRows).foreach { i => - val request = AdminCreateTable.Request(Map("name" -> s"$name$i")) - client.createItem(table.tableName, request).futureValue - } - } - - for (table <- tables) - yield { - val response = - client.getTableMetadata(table.tableName, List("name", "DESC"), List(0, createdRows), "{}").futureValue - val head = response.headOption.value - val id = head.find(_._1 == "id").value._2 // id from response - val nameValue = head.find(_._1 == "name").value._2 // name from response - response.size must be(createdRows) - id must be(createdRows.toString) // toString - expectedNameValue must be(nameValue) - } - } - - "return filtered elements" in withApiClient { client => - val createdUsers = 4 - Range.apply(0, createdUsers).foreach { i => - val data = Map("name" -> "wiringbits", "email" -> s"test@wiringbits$i.net", "password" -> "wiringbits") - val request = AdminCreateTable.Request(data) - client.createItem(usersSettings.tableName, request).futureValue - } - val expectedEmail = "test@wiringbits0.net" - val response = - client - .getTableMetadata( - usersSettings.tableName, - List("name", "ASC"), - List(0, createdUsers), - s"""{"email":"$expectedEmail"}""" - ) - .futureValue - - val head = response.headOption.value - val email = head.find(_._1 == "email").value._2 - response.size must be(1) - email must be(expectedEmail) - } - - "return filtered elements for all tables" in withApiClient { client => - val createdRows = 4 - val tables = List(serialSettings, bigSerialSettings) - - for (table <- tables) { - Range.apply(0, createdRows).foreach { i => - val data = Map("name" -> s"wiringbits$i") - val request = AdminCreateTable.Request(data) - client.createItem(table.tableName, request).futureValue - } - } - val expectedName = "wiringbits0" - - for (table <- tables) { - val response = - client - .getTableMetadata( - table.tableName, - List("name", "ASC"), - List(0, createdRows), - s"""{"name":"$expectedName"}""" - ) - .futureValue - - val head = response.headOption.value - val name = head.find(_._1 == "name").value._2 - response.size must be(1) - name must be(expectedName) - } - } - - "fail when table doesn't exists" in withApiClient { client => - val invalidTableName = "aaaaaaaaaaa" - val error = client.getTableMetadata(invalidTableName, List("name", "ASC"), List(0, 9), "{}").expectError - error must be(s"Unexpected error because the DB table wasn't found: $invalidTableName") - } - - "return data with partial match" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val request = AdminCreateTable.Request( - Map("name" -> name, "email" -> email, "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client - .getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 9), """{"name":"irin"}""") - .futureValue - val head = response.headOption.value - val nameValue = head.find(_._1 == "name").value._2 - val emailValue = head.find(_._1 == "email").value._2 - response.size must be(1) - name must be(nameValue) - email must be(emailValue) - } - - "not return data due to partial match" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val request = AdminCreateTable.Request( - Map("name" -> name, "email" -> email, "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client - .getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 9), """{"name":"yyy"}""") - .futureValue - response.headOption.isEmpty must be(true) - } - - "return data with two filters" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val request = AdminCreateTable.Request( - Map("name" -> name, "email" -> email, "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client - .getTableMetadata( - usersSettings.tableName, - List("name", "ASC"), - List(0, 9), - """{"name":"irin","email":"test"}""" - ) - .futureValue - val head = response.headOption.value - val nameValue = head.find(_._1 == "name").value._2 - val emailValue = head.find(_._1 == "email").value._2 - response.size must be(1) - name must be(nameValue) - email must be(emailValue) - } - - "not return with a valid filter and a non valid filter" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val request = AdminCreateTable.Request( - Map("name" -> name, "email" -> email, "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client - .getTableMetadata( - usersSettings.tableName, - List("name", "ASC"), - List(0, 9), - """{"name":"irin","email":"yyyy"}""" - ) - .futureValue - response.headOption.isEmpty must be(true) - } - } - - "GET /admin/tables/:tableName/:primaryKey" should { - "return table row" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val password = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name, "email" -> email, "password" -> password)) - client.createItem(usersSettings.tableName, request).futureValue - - val users = client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val userId = users.headOption.value.find(_._1 == "id").value._2 - - val response = client.viewItem(usersSettings.tableName, userId).futureValue - response.find(_._1 == "name").value._2 must be(name) - response.find(_._1 == "email").value._2 must be(email) - response.find(_._1 == "password").value._2 must be(password) - response.find(_._1 == "id").value._2 must be(userId) - } - - "return table row for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val name = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name)) - - for (table <- tables) { - client.createItem(table.tableName, request).futureValue - - val rows = client.getTableMetadata(table.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val rowId = rows.headOption.value.find(_._1 == "id").value._2 - - val response = client.viewItem(table.tableName, rowId).futureValue - response.find(_._1 == "name").value._2 must be(name) - response.find(_._1 == "id").value._2 must be(rowId) - } - } - - "fail if the table row doesn't exists" in withApiClient { client => - val userId = UUID.randomUUID().toString - val error = client.viewItem(usersSettings.tableName, userId).expectError - error must be(s"Cannot find item in users with id $userId") - } - - "fail if the table row doesn't exists for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val rand = new Random() - val id = rand.nextInt(1000) + 100 - for (table <- tables) { - val tableName = table.tableName - val error = client.viewItem(table.tableName, id.toString).expectError - error must be(s"Cannot find item in $tableName with id $id") - } - } - } - - "GET /admin/tables/:tableName/:primaryKeys" should { - "return table rows" in withApiClient { client => - val tableName = "users" - val numOfCreatedUsers = 3 - Range.apply(0, numOfCreatedUsers).foreach { i => - val request = AdminCreateTable - .Request(Map("name" -> "wiringbits", "email" -> s"test@wiringbits$i.net", "password" -> "wiringbits")) - client.createItem(tableName, request).futureValue - } - val users = client.getTableMetadata(tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val userIds = users.map(_.find(_._1 == "id").value._2) - val response = client.viewItems(tableName, userIds).futureValue - val sameName = response.flatMap(_.find(_._1 == "name")).forall(_._2 == "wiringbits") - val samePassword = response.flatMap(_.find(_._1 == "password")).forall(_._2 == "wiringbits") - - response.size must be(userIds.length) - response.size must be(numOfCreatedUsers) - sameName must be(true) - samePassword must be(true) - } - - "return table rows for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val numOfCreatedRows = 3 - for (table <- tables) { - Range.apply(0, numOfCreatedRows).foreach { i => - val request = AdminCreateTable - .Request(Map("name" -> s"wiringbits$i")) - client.createItem(table.tableName, request).futureValue - } - val rows = client.getTableMetadata(table.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val ids = rows.map(_.find(_._1 == "id").value._2) - val response = client.viewItems(table.tableName, ids).futureValue - // TODO: check the names - // val sameName = response.flatMap(_.find(_._1 == "name")).forall(_._2 == "wiringbits") - - response.size must be(ids.length) - response.size must be(numOfCreatedRows) - /*sameName must be(true) - samePassword must be(true)*/ - } - } - - "fail if the table row doesn't exists" in withApiClient { client => - val userIds = List(UUID.randomUUID().toString) - val error = client.viewItems("users", userIds).expectError - error must be(s"Cannot find item in users with id ${userIds.headOption.value}") - } - - "fail if the table row doesn't exists for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val rand = new Random() - val ids = List((rand.nextInt(1000) + 100).toString) - for (table <- tables) { - val tableName = table.tableName - val error = client.viewItems(tableName, ids).expectError - error must be(s"Cannot find item in $tableName with id ${ids.headOption.value}") - } - } - } - - "POST /admin/tables/:tableName" should { - "create a new user" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val password = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name, "email" -> email, "password" -> password)) - val response = client.createItem("users", request).futureValue - response.noData must be(empty) - } - - "create a new row for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val name = "wiringbits" - - for (table <- tables) { - val request = AdminCreateTable.Request(Map("name" -> name)) - val response = client.createItem(table.tableName, request).futureValue - response.noData must be(empty) - } - } - - "fail when a mandatory field is not sent" in withApiClient { client => - val name = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name)) - - val error = client.createItem("users", request).expectError - error must be(s"There are missing fields: email, password") - } - - "fail when a mandatory field is not sent for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - // val name = "wiringbits" - for (table <- tables) { - val request = AdminCreateTable.Request(Map()) - val error = client.createItem(table.tableName, request).expectError - error must be(s"There are missing fields: name") - } - } - - "fail when overlow max int value" in withApiClient { client => - val name = "wiringbits" - val table = serialOverflowSettings - val request = AdminCreateTable.Request(Map("name" -> name)) - val ignore = client.createItem(table.tableName, request).futureValue - ignore.noData must be(empty) - val request2 = AdminCreateTable.Request(Map("name" -> s"asdf")) - val error = client.createItem(table.tableName, request2).expectError - error must be(s"ERROR: integer out of range") - } - "fail when overlow max bigint value" in withApiClient { client => - val name = "wiringbits" - val table = bigSerialOverflowSettings - val request = AdminCreateTable.Request(Map("name" -> name)) - val ignore = client.createItem(table.tableName, request).futureValue - ignore.noData must be(empty) - val request2 = AdminCreateTable.Request(Map("name" -> s"asdf")) - val error = client.createItem(table.tableName, request2).expectError - error must be( - s"ERROR: nextval: reached maximum value of sequence \"big_serial_table_overflow_seq\" (9223372036854775807)" - ) - } - } - - "fail when field in request doesn't exists" in withApiClient { client => - val name = "wiringbits" - val nonExistentField = "nonExistentField" - val request = AdminCreateTable.Request(Map("name" -> name, "nonExistentField" -> nonExistentField)) - - val error = client.createItem("users", request).expectError - error must be(s"A field doesn't correspond to this table schema") - } - "fail when field in request doesn't exists for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val name = "wiringbits" - val nonExistentField = "nonExistentField" - for (table <- tables) { - val request = AdminCreateTable.Request(Map("name" -> name, "nonExistentField" -> nonExistentField)) - - val error = client.createItem(table.tableName, request).expectError - error must be(s"A field doesn't correspond to this table schema") - } - } - - "PUT /admin/tables/:tableName" should { - "update a new user" in withApiClient { client => - val request = AdminCreateTable.Request( - Map("name" -> "wiringbits", "email" -> "test@wiringbits.net", "password" -> "wiringbits") - ) - client.createItem(usersSettings.tableName, request).futureValue - - val response = client.getTableMetadata(usersSettings.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val userId = response.headOption.value.find(_._1 == "id").value._2 - - val email = "wiringbits@wiringbits.net" - val updateRequest = Map("email" -> email) - val updateResponse = client.updateItem(usersSettings.tableName, userId, updateRequest).futureValue - - val newResponse = client.viewItem(usersSettings.tableName, userId).futureValue - val emailResponse = newResponse.find(_._1 == "email").value._2 - updateResponse.id must be(userId) - emailResponse must be(email) - } - - "update a new row for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - for (table <- tables) { - val request = AdminCreateTable.Request( - Map("name" -> "wiringbits") - ) - client.createItem(table.tableName, request).futureValue - val response = client.getTableMetadata(table.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val id = response.headOption.value.find(_._1 == "id").value._2 - - val name = "wiringbitsbitsbits" - val updateRequest = Map("name" -> name) - val updateResponse = client.updateItem(table.tableName, id, updateRequest).futureValue - - val newResponse = client.viewItem(table.tableName, id).futureValue - val nameResponse = newResponse.find(_._1 == "name").value._2 - updateResponse.id must be(id) - nameResponse must be(name) - } - } - - "fail if the field in body doesn't exists" in withApiClient { client => - val request = AdminCreateTable.Request( - Map("name" -> "wiringbits", "email" -> "test@wiringbits.net", "password" -> "wiringbits") - ) - client.createItem("users", request).futureValue - - val response = client.getTableMetadata("users", List("user_id", "ASC"), List(0, 9), "{}").futureValue - val userId = response.headOption.value.find(_._1 == "id").value._2 - - val email = "wiringbits@wiringbits.net" - val updateRequest = Map("nonExistentField" -> email) - val error = client.updateItem("users", userId, updateRequest).expectError - error must be("A field doesn't correspond to this table schema") - } - - "fail if the field in body doesn't exists for all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - for (table <- tables) { - val request = AdminCreateTable.Request( - Map("name" -> "test") - ) - client.createItem(table.tableName, request).futureValue - - val response = client.getTableMetadata(table.tableName, List("id", "ASC"), List(0, 9), "{}").futureValue - val id = response.headOption.value.find(_._1 == "id").value._2 - - val name = "wiringbits" - val updateRequest = Map("nonExistentField" -> name) - val error = client.updateItem(table.tableName, id, updateRequest).expectError - error must be("A field doesn't correspond to this table schema") - } - } - } - - "DELETE /admin/tables/users" should { - "delete a new user" in withApiClient { client => - val name = "wiringbits" - val email = "test@wiringbits.net" - val password = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name, "email" -> email, "password" -> password)) - client.createItem("users", request).futureValue - - val response = client.getTableMetadata("users", List("name", "ASC"), List(0, 9), "{}").futureValue - val userId = response.headOption.value.find(_._1 == "id").value._2 - - client.deleteItem("users", userId).futureValue - - val newResponse = client.getTableMetadata("users", List("name", "ASC"), List(0, 9), "{}").futureValue - newResponse.isEmpty must be(true) - } - } - - "DELETE /admin/tables/:tableName" should { - "delete a new row in all tables" in withApiClient { client => - val tables = List(serialSettings, bigSerialSettings) - val name = "wiringbits" - val request = AdminCreateTable.Request(Map("name" -> name)) - - for (table <- tables) { - client.createItem(table.tableName, request).futureValue - - val response = client.getTableMetadata(table.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - val id = response.headOption.value.find(_._1 == "id").value._2 - - client.deleteItem(table.tableName, id).futureValue - - val newResponse = client.getTableMetadata(table.tableName, List("name", "ASC"), List(0, 9), "{}").futureValue - newResponse.isEmpty must be(true) - } - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/controllers/common/PlayAPISpec.scala b/admin-data-explorer-play-server/src/test/scala/controllers/common/PlayAPISpec.scala deleted file mode 100644 index 441d2e5..0000000 --- a/admin-data-explorer-play-server/src/test/scala/controllers/common/PlayAPISpec.scala +++ /dev/null @@ -1,115 +0,0 @@ -package controllers.common - -import org.scalatest.concurrent.ScalaFutures -import org.scalatestplus.play.PlaySpec -import org.slf4j.LoggerFactory -import play.api.inject.guice.GuiceApplicationBuilder -import play.api.mvc.Result -import play.api.test.FakeRequest -import play.api.test.Helpers._ -import play.api.{Application, Mode} - -import java.net.URLEncoder -import scala.concurrent.Future - -/** A PlayAPISpec allow us to write tests for the API calls. - */ -trait PlayAPISpec extends PlaySpec with ScalaFutures { - - protected def defaultGuiceApplicationBuilder: GuiceApplicationBuilder = - GuiceApplicationBuilder() - .in(Mode.Test) - - private val JsonHeader = CONTENT_TYPE -> "application/json" - private val EmptyJson = "{}" - - protected val logger = LoggerFactory.getLogger(this.getClass) - - def log[T](request: FakeRequest[T], response: Future[Result]): Unit = { - logger.info( - s"REQUEST > $request, headers = ${request.headers}; RESPONSE < status = ${status(response)}, body = ${contentAsString(response)}" - ) - } - - /** Syntactic sugar for calling APIs * */ - def GET(url: String, extraHeaders: (String, String)*)(implicit application: Application): Future[Result] = { - val headers = JsonHeader :: extraHeaders.toList - val request = FakeRequest("GET", url) - .withHeaders(headers: _*) - - val response = route(application, request).value - log(request, response) - response - } - - def POST(url: String, extraHeaders: (String, String)*)(implicit application: Application): Future[Result] = { - POST(url, EmptyJson, extraHeaders: _*) - } - - def POST(url: String, jsonBody: String, extraHeaders: (String, String)*)(implicit - application: Application - ): Future[Result] = { - val headers = JsonHeader :: extraHeaders.toList - val request = FakeRequest("POST", url) - .withHeaders(headers: _*) - .withBody(jsonBody) - - val response = route(application, request).value - log(request, response) - response - } - - def PUT(url: String, extraHeaders: (String, String)*)(implicit application: Application): Future[Result] = { - PUT(url, EmptyJson, extraHeaders: _*) - } - - def PUT(url: String, jsonBody: String, extraHeaders: (String, String)*)(implicit - application: Application - ): Future[Result] = { - val headers = JsonHeader :: extraHeaders.toList - val request = FakeRequest("PUT", url) - .withHeaders(headers: _*) - .withBody(jsonBody) - - val response = route(application, request).value - log(request, response) - response - } - - def DELETE(url: String, extraHeaders: (String, String)*)(implicit application: Application): Future[Result] = { - val headers = JsonHeader :: extraHeaders.toList - val request = FakeRequest("DELETE", url) - .withHeaders(headers: _*) - - val response = route(application, request).value - log(request, response) - - response - } -} - -object PlayAPISpec { - - object Implicits { - - implicit class HttpExt(val params: List[(String, String)]) extends AnyVal { - - def toQueryString: String = { - params - .map { case (key, value) => - val encodedKey = URLEncoder.encode(key, "UTF-8") - val encodedValue = URLEncoder.encode(value, "UTF-8") - List(encodedKey, encodedValue).mkString("=") - } - .mkString("&") - } - } - - implicit class StringUrlExt(val url: String) extends AnyVal { - - def withQueryParams(params: (String, String)*): String = { - List(url, params.toList.toQueryString).mkString("?") - } - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala b/admin-data-explorer-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala deleted file mode 100644 index 5ef2a71..0000000 --- a/admin-data-explorer-play-server/src/test/scala/controllers/common/PlayPostgresSpec.scala +++ /dev/null @@ -1,65 +0,0 @@ -package controllers.common - -import com.dimafeng.testcontainers.PostgreSQLContainer -import com.dimafeng.testcontainers.scalatest.TestContainerForEach -import net.wiringbits.webapp.utils.api.AdminDataExplorerApiClient -import org.scalatest.TestData -import org.scalatest.time.SpanSugar.convertIntToGrainOfTime -import org.scalatestplus.play.guice.GuiceOneServerPerTest -import org.testcontainers.utility.DockerImageName -import play.api.inject.guice.GuiceApplicationBuilder -import play.api.{Application, Configuration, Environment, Mode} - -import scala.concurrent.{ExecutionContext, Future} -import scala.util.control.NonFatal - -trait PlayPostgresSpec extends PlayAPISpec with TestContainerForEach with GuiceOneServerPerTest { - implicit val executionContext: ExecutionContext = ExecutionContext.Implicits.global - override implicit val patienceConfig: PatienceConfig = PatienceConfig(30.seconds, 1.second) - - private val postgresImage = DockerImageName.parse("postgres:13") - override val containerDef: PostgreSQLContainer.Def = PostgreSQLContainer.Def(dockerImageName = postgresImage) - - /** Loads configuration disabling evolutions on default database. - * - * This allows to not write a custom application.conf for testing and ensure play evolutions are disabled. - */ - private def loadConfigWithoutEvolutions(env: Environment, container: PostgreSQLContainer): Configuration = { - val map = Map( - "db.default.username" -> container.username, - "db.default.password" -> container.password, - "db.default.url" -> container.jdbcUrl - ) - - Configuration.from(map).withFallback(Configuration.load(env)) - } - - def guiceApplicationBuilder(container: PostgreSQLContainer): GuiceApplicationBuilder = - GuiceApplicationBuilder(loadConfiguration = env => loadConfigWithoutEvolutions(env, container)) - .in(Mode.Test) - - override def newAppForTest(testData: TestData): Application = { - withContainers { postgres => - guiceApplicationBuilder(postgres).build() - } - } - - def withApiClient[A](runTest: AdminDataExplorerApiClient => A): A = { - import sttp.client3.asynchttpclient.future.AsyncHttpClientFutureBackend - - implicit val sttpBackend = AsyncHttpClientFutureBackend() - - val config = AdminDataExplorerApiClient.Config(s"http://localhost:$port") - val client = new AdminDataExplorerApiClient.DefaultImpl(config) - runTest(client) - } - - implicit class RichFutureExt[T](val future: Future[T]) { - def expectError: String = future - .map(_ => "Success when failure expected") - .recover { case NonFatal(ex) => - ex.getMessage - } - .futureValue - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/QueryBuilderSpec.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/QueryBuilderSpec.scala deleted file mode 100644 index ecb2989..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/QueryBuilderSpec.scala +++ /dev/null @@ -1,84 +0,0 @@ -package net.wiringbits.webapp.utils.admin - -import net.wiringbits.webapp.utils.admin.repositories.models.TableColumn -import net.wiringbits.webapp.utils.admin.utils.QueryBuilder -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} -import org.scalatest.wordspec.AnyWordSpec - -class QueryBuilderSpec extends AnyWordSpec { - - "create" should { - "create a complete SQL query" in { - val expected = - """ - |INSERT INTO users - | (user_id, email, name) - |VALUES ( - | ?, ?, ? - |) - |""".stripMargin - val tableName = "users" - val body = Map("email" -> "wiringbits@wiringbits.net", "name" -> "wiringbits") - val primaryKeyField = "user_id" - - val response = QueryBuilder.create(tableName, body, primaryKeyField) - response must be(expected) - } - - "insert a empty body" in { - val expected = - """ - |INSERT INTO users - | (user_id) - |VALUES ( - | ? - |) - |""".stripMargin - val tableName = "users" - val body = Map.empty[String, String] - val primaryKeyField = "user_id" - - val response = QueryBuilder.create(tableName, body, primaryKeyField) - response must be(expected) - } - } - - "update" should { - "build a SQL query" in { - val expected = - s""" - |UPDATE users - |SET email = ?::citext, name = ?::text - |WHERE user_id = ? - |""".stripMargin - val tableName = "users" - val body = Map( - TableColumn("email", "citext") -> "wiringbits@wiringbits.net", - TableColumn("name", "text") -> "wiringbits@wiringbits.net" - ) - val primaryKeyField = "user_id" - - val response = QueryBuilder.update(tableName, body, primaryKeyField) - response must be(expected) - } - - "build a SQL query with null fields" in { - val expected = - s""" - |UPDATE users - |SET email = ?::citext, name = ?::text, phone_number = NULL - |WHERE user_id = ? - |""".stripMargin - val tableName = "users" - val body = Map( - TableColumn("email", "citext") -> "wiringbits@wiringbits.net", - TableColumn("name", "text") -> "wiringbits@wiringbits.net", - TableColumn("phone_number", "text") -> "null" - ) - val primaryKeyField = "user_id" - - val response = QueryBuilder.update(tableName, body, primaryKeyField) - response must be(expected) - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/StringRegexSpec.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/StringRegexSpec.scala deleted file mode 100644 index 56426cd..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/StringRegexSpec.scala +++ /dev/null @@ -1,43 +0,0 @@ -package net.wiringbits.webapp.utils.admin - -import net.wiringbits.webapp.utils.admin.utils.StringRegex -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} -import org.scalatest.wordspec.AnyWordSpec - -class StringRegexSpec extends AnyWordSpec { - "dateRegex" should { - val dateRegex = StringRegex.dateRegex - - val valid = List( - "2023-01-20", - "2012-03-01", - "2020-09-19", - "2024-12-31", - "2002-02-23" - ) - - val invalid = List( - "aaaa-bb-cc", - "2022-a3-23", - "20e1-03-23", - "2004-01-c4", - "2012-01-23-a", - "20230223", - "??????????", - "asdfghjkl", - "ABCDEFGHI" - ) - - valid.foreach { value => - s"accept valid value: $value" in { - dateRegex.matches(value) must be(true) - } - } - - invalid.foreach { value => - s"reject invalid value: $value" in { - dateRegex.matches(value) must be(false) - } - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/UtilsSpec.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/UtilsSpec.scala deleted file mode 100644 index 1aa5d57..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/UtilsSpec.scala +++ /dev/null @@ -1,32 +0,0 @@ -package net.wiringbits.webapp.utils.admin - -import net.wiringbits.webapp.utils.admin.utils.StringToDataTypesExt -import org.scalatest.OptionValues.convertOptionToValuable -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} -import org.scalatest.wordspec.AnyWordSpec - -class UtilsSpec extends AnyWordSpec { - "toStringList" should { - "create a list" in { - val response = """["a","b"]""".toStringList - response.length must be(2) - response.contains("a") must be(true) - response.contains("b") must be(true) - } - } - - "toStringMap" should { - "create a empty map" in { - val response = "{}".toStringMap - response.size must be(0) - } - - "create a new map from str" in { - val response = """{"a":"b"}""".toStringMap - val head = response.headOption.value - response.size must be(1) - head._1 must be("a") - head._2 must be("b") - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/FilterParameterSpec.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/FilterParameterSpec.scala deleted file mode 100644 index a23f131..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/FilterParameterSpec.scala +++ /dev/null @@ -1,29 +0,0 @@ -package net.wiringbits.webapp.utils.admin.models - -import net.wiringbits.webapp.utils.admin.utils.models.FilterParameter -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} -import org.scalatest.wordspec.AnyWordSpec - -class FilterParameterSpec extends AnyWordSpec { - "fromString" should { - "create a valid filter parameter" in { - val str = """{"name": "wiringbits@wiringbits.net"}""" - val response = FilterParameter.fromString(str) - response.head.field must be("name") - response.head.value must be("wiringbits@wiringbits.net") - } - - "create a empty model if str is a empty json" in { - val str = "{}" - val response = FilterParameter.fromString(str) - response.isEmpty must be(true) - } - - "create a valid filter parameter with two items" in { - val str = """{"name": "wiringbits@wiringbits.net", "password": "wiringbits"}""" - val response = FilterParameter.fromString(str) - response.exists(item => item.field == "name" && item.value == "wiringbits@wiringbits.net") must be(true) - response.exists(item => item.field == "password" && item.value == "wiringbits") must be(true) - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/PaginationParameterSpec.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/PaginationParameterSpec.scala deleted file mode 100644 index 162a0ee..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/PaginationParameterSpec.scala +++ /dev/null @@ -1,24 +0,0 @@ -package net.wiringbits.webapp.utils.admin.models - -import net.wiringbits.webapp.utils.admin.utils.models.PaginationParameter -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} -import org.scalatest.wordspec.AnyWordSpec - -import scala.util.Try - -class PaginationParameterSpec extends AnyWordSpec { - "fromString" should { - "create a valid pagination parameter" in { - val str = "[0,9]" - val response = PaginationParameter.fromString(str) - response.start must be(0) - response.end must be(9) - } - - "fail if the start or end of array isn't a number" in { - val str = """["a","b"]""" - val response = Try { PaginationParameter.fromString(str) } - response.isFailure must be(true) - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/SortParameterSpec.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/SortParameterSpec.scala deleted file mode 100644 index 520da63..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/models/SortParameterSpec.scala +++ /dev/null @@ -1,17 +0,0 @@ -package net.wiringbits.webapp.utils.admin.models - -import net.wiringbits.webapp.utils.admin.utils.models.SortParameter -import org.scalatest.matchers.must.Matchers.{be, convertToAnyMustWrapper} -import org.scalatest.wordspec.AnyWordSpec - -class SortParameterSpec extends AnyWordSpec { - "fromString" should { - "create a valid sort parameter" in { - val str = """["name","ASC"]""" - // val primaryKeyField = "user_id" - val response = SortParameter.fromString(str) - response.field must be("name") - response.ordering must be("ASC") - } - } -} diff --git a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/modules/DataExplorerTestModule.scala b/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/modules/DataExplorerTestModule.scala deleted file mode 100644 index 7dbbe35..0000000 --- a/admin-data-explorer-play-server/src/test/scala/net/wiringbits/webapp/utils/admin/modules/DataExplorerTestModule.scala +++ /dev/null @@ -1,37 +0,0 @@ -package net.wiringbits.webapp.utils.admin.modules - -import com.google.inject.{AbstractModule, Provides} -import net.wiringbits.webapp.utils.admin.config.{DataExplorerSettings, TableSettings, PrimaryKeyDataType} - -class DataExplorerTestModule extends AbstractModule { - - @Provides() - def dataExplorerSettings: DataExplorerSettings = { - DataExplorerSettings("http://localhost:9000", settings) - } - - val settings: List[TableSettings] = List( - TableSettings("users", "user_id"), // "UUID" default - TableSettings( - tableName = "uuid_table", - primaryKeyField = "id", - primaryKeyDataType = PrimaryKeyDataType.UUID - ), // explicit default - TableSettings(tableName = "serial_table", primaryKeyField = "id", primaryKeyDataType = PrimaryKeyDataType.Serial), - TableSettings( - tableName = "big_serial_table", - primaryKeyField = "id", - primaryKeyDataType = PrimaryKeyDataType.BigSerial - ), - TableSettings( - tableName = "serial_table_overflow", - primaryKeyField = "id", - primaryKeyDataType = PrimaryKeyDataType.Serial - ), - TableSettings( - tableName = "big_serial_table_overflow", - primaryKeyField = "id", - primaryKeyDataType = PrimaryKeyDataType.BigSerial - ) - ) -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/API.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/API.scala deleted file mode 100644 index 4ef910c..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/API.scala +++ /dev/null @@ -1,5 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web - -import net.wiringbits.webapp.utils.api.AdminDataExplorerApiClient - -case class API(client: AdminDataExplorerApiClient, url: String) diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/AdminView.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/AdminView.scala deleted file mode 100644 index 17425f3..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/AdminView.scala +++ /dev/null @@ -1,37 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web - -import io.github.nafg.simplefacade.Factory -import japgolly.scalajs.react.vdom.VdomNode -import net.wiringbits.webapp.utils.api.models.AdminGetTables -import net.wiringbits.webapp.utils.ui.web.components.{EditGuesser, ListGuesser} -import net.wiringbits.webapp.utils.ui.web.facades.reactadmin._ -import net.wiringbits.webapp.utils.ui.web.models.DataExplorerSettings -import org.scalajs.macrotaskexecutor.MacrotaskExecutor.Implicits.global - -import scala.concurrent.Future - -object AdminView { - private def AdminTables(api: API, response: AdminGetTables.Response, dataExplorerSettings: DataExplorerSettings) = { - val tablesUrl = s"${api.url}/admin/tables" - - def buildResources: List[VdomNode] = { - response.data.map { table => - Resource( - _.name := table.name, - _.list := ListGuesser(table), - _.edit := EditGuesser(table, dataExplorerSettings) - ) - } - } - - val resources = buildResources - Admin(_.dataProvider := simpleRestProvider(tablesUrl))(resources: _*) - } - - def apply( - api: API, - dataExplorerSettings: DataExplorerSettings = DataExplorerSettings() - ): Future[Factory[Admin.Props]] = { - api.client.getTables.map { AdminTables(api, _, dataExplorerSettings) } - } -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/components/EditGuesser.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/components/EditGuesser.scala deleted file mode 100644 index 6eb7cfb..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/components/EditGuesser.scala +++ /dev/null @@ -1,73 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.components - -import japgolly.scalajs.react.React.Fragment -import japgolly.scalajs.react.ScalaFnComponent -import japgolly.scalajs.react.vdom.html_<^._ -import net.wiringbits.webapp.utils.api.models.AdminGetTables -import net.wiringbits.webapp.utils.ui.web.facades.reactadmin.ReactAdmin.useEditContext -import net.wiringbits.webapp.utils.ui.web.facades.reactadmin._ -import net.wiringbits.webapp.utils.ui.web.models.{ButtonAction, ColumnType, DataExplorerSettings} -import net.wiringbits.webapp.utils.ui.web.utils.ResponseGuesser -import org.scalajs.dom -import org.scalajs.macrotaskexecutor.MacrotaskExecutor.Implicits.global - -import scala.scalajs.js -import scala.util.{Failure, Success} - -object EditGuesser { - - def apply(response: AdminGetTables.Response.DatabaseTable, dataExplorerSettings: DataExplorerSettings) = { - val fields = ResponseGuesser.getTypesFromResponse(response) - val inputs: List[VdomNode] = fields - .map { fieldType => - fieldType.`type` match { - case ColumnType.Date => DateTimeInput(_.source := fieldType.name, _.disabled := fieldType.disabled) - case ColumnType.Text => TextInput(_.source := fieldType.name, _.disabled := fieldType.disabled) - case ColumnType.Email => TextInput(_.source := fieldType.name, _.disabled := fieldType.disabled) - case ColumnType.Image => ImageField(_.source := fieldType.name) - case ColumnType.Number => NumberInput(_.source := fieldType.name, _.disabled := fieldType.disabled) - case ColumnType.Reference(reference, source) => - ReferenceInput(_.source := fieldType.name, _.reference := reference)( - SelectInput(_.optionText := source, _.disabled := fieldType.disabled) - ) - } - } - - def onClick(action: ButtonAction, ctx: js.Dictionary[js.Any]): Unit = { - val primaryKey = dom.window.location.hash.split("/").lastOption.getOrElse("") - action.onClick(primaryKey).onComplete { - case Failure(ex) => ex.printStackTrace() - case Success(_) => refetch(ctx) - } - } - - def refetch(ctx: js.Dictionary[js.Any]): Unit = { - val _ = ctx.get("refetch").map(_.asInstanceOf[js.Dynamic].apply()) - } - - val tableAction = dataExplorerSettings.actions.find(_.tableName == response.name) - def buttons(ctx: js.Dictionary[js.Any]) = tableAction - .map { x => - x.actions.map { action => - Button(_.onClick := (() => onClick(action, ctx)))(action.text) - }: List[VdomNode] - } - .getOrElse(List.empty) - - val actions = ScalaFnComponent.withHooks[Unit].unchecked(useEditContext()).render { (_, ctx) => - { - TopToolbar()(buttons(ctx): _*) - }: VdomNode - } - - val deleteButton: VdomNode = if (response.canBeDeleted) DeleteButton() else Fragment() - val toolbar: VdomNode = Toolbar()( - SaveButton(), - deleteButton - ) - - Edit(_.actions := actions())( - SimpleForm(_.toolbar := toolbar)(inputs: _*) - ) - } -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/components/ListGuesser.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/components/ListGuesser.scala deleted file mode 100644 index dd4a46d..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/components/ListGuesser.scala +++ /dev/null @@ -1,57 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.components - -import io.github.nafg.simplefacade.Factory -import japgolly.scalajs.react.vdom.all.div -import japgolly.scalajs.react.vdom.html_<^._ -import net.wiringbits.webapp.utils.api.models.AdminGetTables -import net.wiringbits.webapp.utils.ui.web.facades.reactadmin._ -import net.wiringbits.webapp.utils.ui.web.models.ColumnType -import net.wiringbits.webapp.utils.ui.web.utils.ResponseGuesser - -import scala.scalajs.js - -object ListGuesser { - def apply(response: AdminGetTables.Response.DatabaseTable): Factory[ComponentList.Props] = { - val fields = ResponseGuesser.getTypesFromResponse(response) - - val widgetFields: List[VdomNode] = fields.map { field => - val imageStyles = js.Dynamic.literal("width" -> "100px") - val styles = js.Dynamic.literal("& img" -> imageStyles) - field.`type` match { - case ColumnType.Date => DateField(_.source := field.name, _.showTime := true) - case ColumnType.Text => TextField(_.source := field.name) - case ColumnType.Email => EmailField(_.source := field.name) - case ColumnType.Image => ImageField(_.source := field.name, _.sx := styles) - case ColumnType.Number => NumberField(_.source := field.name) - case ColumnType.Reference(reference, source) => - ReferenceField(_.reference := reference, _.source := field.name)( - TextField(_.source := source) - ) - } - } - - val filterList: List[VdomNode] = fields.filter(_.filterable).map { field => - field.`type` match { - case ColumnType.Date => DateInput(_.source := field.name) - case ColumnType.Text | ColumnType.Email => TextInput(_.source := field.name) - case ColumnType.Image => div() - case ColumnType.Number => NumberInput(_.source := field.name) - case ColumnType.Reference(reference, source) => - ReferenceField(_.reference := reference, _.source := field.name)( - TextField(_.source := source) - ) - } - } - - val listToolbar: VdomNode = TopToolbar()( - FilterButton( - _.filters := filterList - ), - ExportButton() - ) - - ComponentList(_.actions := listToolbar, _.filters := filterList)( - Datagrid(_.rowClick := "edit", _.bulkActionButtons := response.canBeDeleted)(widgetFields: _*) - ) - } -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/DataProvider.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/DataProvider.scala deleted file mode 100644 index d3dc396..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/DataProvider.scala +++ /dev/null @@ -1,6 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.facades.reactadmin - -import scala.scalajs.js - -@js.native -trait DataProvider extends js.Object diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/ReactAdmin.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/ReactAdmin.scala deleted file mode 100644 index 07bdae3..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/ReactAdmin.scala +++ /dev/null @@ -1,17 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.facades.reactadmin - -import scala.scalajs.js -import scala.scalajs.js.annotation.JSImport - -@js.native -@JSImport("react-admin", JSImport.Namespace) -object ReactAdmin extends js.Any { - def useRecordContext(): js.Dictionary[js.Any] = js.native - - def useEditContext(): js.Dictionary[js.Any] = js.native - - val Admin, Create, Datagrid, Edit, EditButton, EmailField, ImageField, List, ReferenceField, ReferenceInput, Resource, - SelectInput, SimpleForm, TextField, DateField, DateTimeInput, TextInput, Button, SaveButton, DeleteButton, - Toolbar, TopToolbar, UrlField, DateInput, FilterButton, ExportButton, NumberInput, NumberField: js.Object = - js.native -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/components.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/components.scala deleted file mode 100644 index 52cdb25..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/components.scala +++ /dev/null @@ -1,126 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.facades.reactadmin - -import io.github.nafg.simplefacade.Implicits._ -import io.github.nafg.simplefacade.{FacadeModule, PropTypes} -import japgolly.scalajs.react.vdom.html_<^.VdomNode - -object Admin extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.Admin - override def mkProps = new Props - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val dataProvider = of[DataProvider] - } -} - -object Create extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.Create - override def mkProps = new Props - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - } -} - -object Datagrid extends FacadeModule.ArrayChildren.Simple { - override def raw = ReactAdmin.Datagrid - override def mkProps = new Props - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val rowClick = of[String] - val bulkActionButtons = of[Boolean] - } -} - -object Edit extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.Edit - override def mkProps = new Props - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val actions = of[VdomNode] - } -} - -object EditButton extends FacadeModule.Simple { - override def raw = ReactAdmin.EditButton - override def mkProps = new Props - class Props extends PropTypes -} - -object SaveButton extends FacadeModule.Simple { - override def raw = ReactAdmin.SaveButton - override def mkProps = new Props - class Props extends PropTypes -} - -object DeleteButton extends FacadeModule.Simple { - override def raw = ReactAdmin.DeleteButton - override def mkProps = new Props - class Props extends PropTypes -} - -object Button extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.Button - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val onClick = of[() => Unit] - } - override def mkProps = new Props -} - -object Toolbar extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.Toolbar - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - } - override def mkProps = new Props -} - -object TopToolbar extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.TopToolbar - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - } - override def mkProps = new Props -} - -object ComponentList extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.List - override def mkProps = new Props - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val actions: PropTypes.Prop[VdomNode] = of[VdomNode] - val filters: PropTypes.Prop[List[VdomNode]] = of[List[VdomNode]] - } -} - -object Resource extends FacadeModule.Simple { - override def raw = ReactAdmin.Resource - override def mkProps = new Props - class Props extends PropTypes { - val name = of[String] - val create, edit, list = of[VdomNode] - } -} - -object SimpleForm extends FacadeModule.NodeChildren.Simple { - override def raw = ReactAdmin.SimpleForm - override def mkProps = new Props - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val toolbar = of[VdomNode] - } -} - -object FilterButton extends FacadeModule.Simple { - override def raw = ReactAdmin.FilterButton - class Props extends PropTypes { - val filters: PropTypes.Prop[List[VdomNode]] = of[List[VdomNode]] - } - override def mkProps = new Props -} - -object ExportButton extends FacadeModule.Simple { - override def raw = ReactAdmin.ExportButton - override def mkProps = new Props - class Props extends PropTypes -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/fieldComponents.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/fieldComponents.scala deleted file mode 100644 index dfdabc7..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/fieldComponents.scala +++ /dev/null @@ -1,108 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.facades.reactadmin - -import io.github.nafg.simplefacade.Implicits._ -import io.github.nafg.simplefacade.{FacadeModule, PropTypes} -import japgolly.scalajs.react.vdom.VdomNode - -import scala.scalajs.js - -trait FieldProps extends PropTypes { - val source = of[String] - val disabled = of[Boolean] -} - -object EmailField extends FacadeModule.Simple { - override def raw = ReactAdmin.EmailField - class Props extends FieldProps - override def mkProps = new Props -} - -object ImageField extends FacadeModule.Simple { - override def raw = ReactAdmin.ImageField - class Props extends FieldProps { - val sx = of[js.Object] - } - override def mkProps = new Props -} - -trait ReferenceBase extends FacadeModule.NodeChildren.Simple { - class Props extends PropTypes.WithChildren[VdomNode] { - val children = of[VdomNode] - val source = of[String] - val reference = of[String] - } - override def mkProps = new Props -} - -object ReferenceField extends ReferenceBase { - override def raw = ReactAdmin.ReferenceField -} - -object ReferenceInput extends ReferenceBase { - override def raw = ReactAdmin.ReferenceInput -} - -object SelectInput extends FacadeModule.Simple { - override def raw = ReactAdmin.SelectInput - class Props extends PropTypes { - val optionText = of[String] - val disabled = of[Boolean] - } - override def mkProps = new Props -} - -object TextField extends FacadeModule.Simple { - override def raw = ReactAdmin.TextField - class Props extends FieldProps - override def mkProps = new Props -} - -object DateField extends FacadeModule.Simple { - override def raw = ReactAdmin.DateField - class Props extends FieldProps { - val showTime = of[Boolean] - } - override def mkProps = new Props -} - -object DateTimeInput extends FacadeModule.Simple { - override def raw = ReactAdmin.DateTimeInput - class Props extends FieldProps - override def mkProps = new Props -} - -object TextInput extends FacadeModule.Simple { - override def raw = ReactAdmin.TextInput - class Props extends FieldProps { - val multiline = of[Boolean] - } - override def mkProps = new Props -} - -object UrlField extends FacadeModule.Simple { - override def raw = ReactAdmin.UrlField - class Props extends FieldProps - override def mkProps = new Props -} - -object DateInput extends FacadeModule.Simple { - override def raw = ReactAdmin.DateInput - class Props extends FieldProps - override def mkProps = new Props -} - -object NumberInput extends FacadeModule.Simple { - override def raw = ReactAdmin.NumberInput - class Props extends FieldProps { - val max = of[Double] - val min = of[Double] - val step = of[Double] - } - override def mkProps: Props = new Props -} - -object NumberField extends FacadeModule.Simple { - override def raw = ReactAdmin.NumberField - class Props extends FieldProps - override def mkProps = new Props -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/package.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/package.scala deleted file mode 100644 index efc1264..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/facades/reactadmin/package.scala +++ /dev/null @@ -1,11 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.facades - -import scala.annotation.unused -import scala.scalajs.js -import scala.scalajs.js.annotation.JSImport - -package object reactadmin { - @js.native - @JSImport("ra-data-simple-rest", JSImport.Default) - def simpleRestProvider(@unused url: String): DataProvider = js.native -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/ButtonAction.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/ButtonAction.scala deleted file mode 100644 index dc334f1..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/ButtonAction.scala +++ /dev/null @@ -1,10 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.models - -import scala.concurrent.Future - -/** @param text - * button label that's going to be displayed in react-admin - * @param onClick - * this callback has the resource ID of the clicked element - */ -case class ButtonAction(text: String, onClick: String => Future[_]) diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/Column.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/Column.scala deleted file mode 100644 index 64f663a..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/Column.scala +++ /dev/null @@ -1,3 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.models - -case class Column(name: String, `type`: ColumnType, disabled: Boolean, filterable: Boolean) diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/ColumnType.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/ColumnType.scala deleted file mode 100644 index ce02e95..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/ColumnType.scala +++ /dev/null @@ -1,35 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.models - -import net.wiringbits.webapp.utils.api.models.AdminGetTables.Response.TableColumn - -sealed trait ColumnType extends Product with Serializable - -object ColumnType { - case object Date extends ColumnType - case object Text extends ColumnType - case object Email extends ColumnType - case object Image extends ColumnType - case object Number extends ColumnType - case class Reference(referencedTable: String, source: String) extends ColumnType - - def fromTableField(column: TableColumn): ColumnType = { - val isEmail = column.name.contains("email") - val isDate = column.`type`.equalsIgnoreCase("timestamptz") - val isImage = column.`type`.equalsIgnoreCase("bytea") - val isInt = column.`type`.equalsIgnoreCase("integer") - val isNumeric = column.`type`.toLowerCase.contains("numeric") - val default = column.reference - .map { reference => ColumnType.Reference(reference.referencedTable, reference.referenceField) } - .getOrElse(ColumnType.Text) - - if (isEmail) - ColumnType.Email - else if (isDate) - ColumnType.Date - else if (isImage) - ColumnType.Image - else if (isInt || isNumeric) - ColumnType.Number - else default - } -} diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/DataExplorerSettings.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/DataExplorerSettings.scala deleted file mode 100644 index d35569e..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/DataExplorerSettings.scala +++ /dev/null @@ -1,3 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.models - -case class DataExplorerSettings(actions: List[TableAction] = List.empty) diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/TableAction.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/TableAction.scala deleted file mode 100644 index 443a06a..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/models/TableAction.scala +++ /dev/null @@ -1,3 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.models - -case class TableAction(tableName: String, actions: List[ButtonAction]) diff --git a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/utils/ResponseGuesser.scala b/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/utils/ResponseGuesser.scala deleted file mode 100644 index 22111be..0000000 --- a/admin-data-explorer-web/src/main/scala/net/wiringbits/webapp/utils/ui/web/utils/ResponseGuesser.scala +++ /dev/null @@ -1,13 +0,0 @@ -package net.wiringbits.webapp.utils.ui.web.utils - -import net.wiringbits.webapp.utils.api.models.AdminGetTables -import net.wiringbits.webapp.utils.ui.web.models.{Column, ColumnType} - -object ResponseGuesser { - def getTypesFromResponse(response: AdminGetTables.Response.DatabaseTable): List[Column] = { - response.columns.map { column => - val fieldType = ColumnType.fromTableField(column) - Column(name = column.name, `type` = fieldType, disabled = !column.editable, filterable = column.filterable) - } - } -} diff --git a/admin-data-explorer-web/yarn.lock b/admin-data-explorer-web/yarn.lock deleted file mode 100644 index 199caf1..0000000 --- a/admin-data-explorer-web/yarn.lock +++ /dev/null @@ -1,4467 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@emotion/hash@^0.7.1": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831" - integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A== - -"@material-ui/core@3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-3.9.4.tgz#5297fd4ad9e739a87da4a6d34fc4af5396886e13" - integrity sha512-r8QFLSexcYZbnqy/Hn4v8xzmAJV41yaodUVjmbGLi1iGDLG3+W941hEtEiBmxTRRqv2BdK3r4ijILcqKmDv/Sw== - dependencies: - "@babel/runtime" "^7.2.0" - "@material-ui/system" "^3.0.0-alpha.0" - "@material-ui/utils" "^3.0.0-alpha.2" - "@types/jss" "^9.5.6" - "@types/react-transition-group" "^2.0.8" - brcast "^3.0.1" - classnames "^2.2.5" - csstype "^2.5.2" - debounce "^1.1.0" - deepmerge "^3.0.0" - dom-helpers "^3.2.1" - hoist-non-react-statics "^3.2.1" - is-plain-object "^2.0.4" - jss "^9.8.7" - jss-camel-case "^6.0.0" - jss-default-unit "^8.0.2" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-vendor-prefixer "^7.0.0" - normalize-scroll-left "^0.1.2" - popper.js "^1.14.1" - prop-types "^15.6.0" - react-event-listener "^0.6.2" - react-transition-group "^2.2.1" - recompose "0.28.0 - 0.30.0" - warning "^4.0.1" - -"@material-ui/icons@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-3.0.2.tgz#d67a6dd1ec8312d3a88ec97944a63daeef24fe10" - integrity sha512-QY/3gJnObZQ3O/e6WjH+0ah2M3MOgLOzCy8HTUoUx9B6dDrS18vP7Ycw3qrDEKlB6q1KNxy6CZHm5FCauWGy2g== - dependencies: - "@babel/runtime" "^7.2.0" - recompose "0.28.0 - 0.30.0" - -"@material-ui/styles@3.0.0-alpha.10": - version "3.0.0-alpha.10" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-3.0.0-alpha.10.tgz#4c28a6d6dacb1fb71aff4642f92b63232a3f298d" - integrity sha512-qJ5eiupBPRCNlMCDZ2G5h8auBtBtm8uT/oCUAJ/FqhO5oC7POLmmvDN1Cq1cgAmqQnaL6uN5mAM1Gc90GpKr9A== - dependencies: - "@babel/runtime" "^7.2.0" - "@emotion/hash" "^0.7.1" - "@material-ui/utils" "^3.0.0-alpha.2" - classnames "^2.2.5" - deepmerge "^3.0.0" - hoist-non-react-statics "^3.2.1" - jss "^10.0.0-alpha.7" - jss-plugin-camel-case "^10.0.0-alpha.7" - jss-plugin-default-unit "^10.0.0-alpha.7" - jss-plugin-global "^10.0.0-alpha.7" - jss-plugin-nested "^10.0.0-alpha.7" - jss-plugin-props-sort "^10.0.0-alpha.7" - jss-plugin-rule-value-function "^10.0.0-alpha.7" - jss-plugin-vendor-prefixer "^10.0.0-alpha.7" - prop-types "^15.6.0" - warning "^4.0.1" - -"@material-ui/system@^3.0.0-alpha.0": - version "3.0.0-alpha.2" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-3.0.0-alpha.2.tgz#096e80c8bb0f70aea435b9e38ea7749ee77b4e46" - integrity sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA== - dependencies: - "@babel/runtime" "^7.2.0" - deepmerge "^3.0.0" - prop-types "^15.6.0" - warning "^4.0.1" - -"@material-ui/utils@^3.0.0-alpha.2": - version "3.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz#836c62ea46f5ffc6f0b5ea05ab814704a86908b1" - integrity sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng== - dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - react-is "^16.6.3" - -"@types/classnames@2.2.10": - version "2.2.10" - resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.10.tgz#cc658ca319b6355399efc1f5b9e818f1a24bf999" - integrity sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/history@*": - version "4.7.9" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" - integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== - -"@types/jss@^9.5.6": - version "9.5.8" - resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.8.tgz#258391f42211c042fc965508d505cbdc579baa5b" - integrity sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA== - dependencies: - csstype "^2.0.0" - indefinite-observable "^1.0.1" - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/node@*": - version "16.11.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.10.tgz#2e3ad0a680d96367103d3e670d41c2fed3da61ae" - integrity sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA== - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/react-router-dom@5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.2.tgz#853f229f1f297513c0be84f7c914a08b778cfdf5" - integrity sha512-kRx8hoBflE4Dp7uus+j/0uMHR5uGTAvQtc4A3vOTWKS+epe0leCuxEx7HNT7XGUd1lH53/moWM51MV2YUyhzAg== - dependencies: - "@types/history" "*" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.17" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.17.tgz#087091006213b11042f39570e5cd414863693968" - integrity sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ== - dependencies: - "@types/history" "*" - "@types/react" "*" - -"@types/react-router@5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.2.tgz#41e5e6aa333a7b9a2bfdac753c04e1ca4b3e0d21" - integrity sha512-euC3SiwDg3NcjFdNmFL8uVuAFTpZJm0WMFUw+4eXMUnxa7M9RGFEG0szt0z+/Zgk4G2k9JBFhaEnY64RBiFmuw== - dependencies: - "@types/history" "*" - "@types/react" "*" - -"@types/react-transition-group@^2.0.8": - version "2.9.2" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.9.2.tgz#c48cf2a11977c8b4ff539a1c91d259eaa627028d" - integrity sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "17.0.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959" - integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== - -acorn@^6.0.5: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async@^2.5.0, async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.0.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brcast@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.2.tgz#55c41a7a077ff4e7ac784c2060e544d4c39ad477" - integrity sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA== - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" - integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= - -chokidar@^2.1.6, chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@^2.2.5: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - 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" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -concat-with-sourcemaps@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.7.tgz#9420e100fb984cbde11a78dca2d818306bc8f0d2" - integrity sha512-5i4Spc9NNvVXzkR77x2kjcYCDZMNPLzP7ZBzJMNKZjXzk+E6tRVL/lPlYw60VM3hb7gf+iBQn2x1T8TpMN0SEw== - dependencies: - source-map "^0.6.1" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-vendor@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-0.3.8.tgz#6421cfd3034ce664fe7673972fd0119fc28941fa" - integrity sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo= - dependencies: - is-in-browser "^1.0.2" - -css-vendor@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" - integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== - dependencies: - "@babel/runtime" "^7.8.3" - is-in-browser "^1.0.2" - -csstype@^2.0.0, csstype@^2.5.2: - version "2.6.19" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" - integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== - -csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -debounce@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.1, debug@^3.2.5: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -deepmerge@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -dom-helpers@^3.2.1, dom-helpers@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== - dependencies: - "@babel/runtime" "^7.1.2" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -express@^4.17.0: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbjs@^0.8.1: - version "0.8.18" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" - integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@^1.0.0: - version "1.14.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" - integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - 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" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^2.3.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-parser-js@>=0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.4.tgz#d1f3e45f31973de8393af2c725da5d42919ab2bb" - integrity sha512-Qn1yyi10ipcylSSqlTFsj7bhimACWbFm5w5JNMxhLKfcJAeWFBc+/VBv4mu5qlWSKr0cjXqtwM6HISZkESUILA== - -http-proxy-middleware@^0.19.1: - version "0.19.2" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz#ee73dcc8348165afefe8de2ff717751d181608ee" - integrity sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ== - dependencies: - http-proxy "^1.18.1" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indefinite-observable@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-1.0.2.tgz#0a328793ab2385d4b9dca23eaab4afe6936a73f8" - integrity sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA== - dependencies: - symbol-observable "1.2.0" - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -interpret@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -jss-camel-case@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jss-camel-case/-/jss-camel-case-6.1.0.tgz#ccb1ff8d6c701c02a1fed6fb6fb6b7896e11ce44" - integrity sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ== - dependencies: - hyphenate-style-name "^1.0.2" - -jss-default-unit@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/jss-default-unit/-/jss-default-unit-8.0.2.tgz#cc1e889bae4c0b9419327b314ab1c8e2826890e6" - integrity sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg== - -jss-global@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jss-global/-/jss-global-3.0.0.tgz#e19e5c91ab2b96353c227e30aa2cbd938cdaafa2" - integrity sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q== - -jss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jss-nested/-/jss-nested-6.0.1.tgz#ef992b79d6e8f63d939c4397b9d99b5cbbe824ca" - integrity sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA== - dependencies: - warning "^3.0.0" - -jss-plugin-camel-case@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz#8d7f915c8115afaff8cbde08faf610ec9892fba6" - integrity sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA== - dependencies: - "@babel/runtime" "^7.3.1" - hyphenate-style-name "^1.0.3" - jss "10.8.2" - -jss-plugin-default-unit@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz#c66f12e02e0815d911b85c02c2a979ee7b4ce69a" - integrity sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-global@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz#1a35632a693cf50113bcc5ffe6b51969df79c4ec" - integrity sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-nested@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz#79f3c7f75ea6a36ae72fe52e777035bb24d230c7" - integrity sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - tiny-warning "^1.0.2" - -jss-plugin-props-sort@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz#e25a7471868652c394562b6dc5433dcaea7dff6f" - integrity sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-rule-value-function@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz#55354b55f1b2968a15976729968f767f02d64049" - integrity sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - tiny-warning "^1.0.2" - -jss-plugin-vendor-prefixer@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz#ebb4a482642f34091e454901e21176441dd5f475" - integrity sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg== - dependencies: - "@babel/runtime" "^7.3.1" - css-vendor "^2.0.8" - jss "10.8.2" - -jss-props-sort@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/jss-props-sort/-/jss-props-sort-6.0.0.tgz#9105101a3b5071fab61e2d85ea74cc22e9b16323" - integrity sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g== - -jss-vendor-prefixer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz#0166729650015ef19d9f02437c73667231605c71" - integrity sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA== - dependencies: - css-vendor "^0.3.8" - -jss@10.8.2, jss@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.2.tgz#4b2a30b094b924629a64928236017a52c7c97505" - integrity sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ== - dependencies: - "@babel/runtime" "^7.3.1" - csstype "^3.0.2" - is-in-browser "^1.1.3" - tiny-warning "^1.0.2" - -jss@^9.8.7: - version "9.8.7" - resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.7.tgz#ed9763fc0f2f0260fc8260dac657af61e622ce05" - integrity sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ== - dependencies: - is-in-browser "^1.1.3" - symbol-observable "^1.1.0" - warning "^3.0.0" - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -loader-runner@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@~0.2.2: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash@^4.17.11, lodash@^4.17.14: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loglevel@^1.6.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== - -loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memory-fs@^0.4.1, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mini-create-react-context@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.3.tgz#b1b2bc6604d3a6c5d9752bad7692615410ebb38e" - integrity sha512-TtF6hZE59SGmS4U8529qB+jJFeW6asTLDIpPgvPLSCsooAwJS7QprHIFTqv9/Qh3NdLwQxFYgiHX5lqb6jqzPA== - dependencies: - "@babel/runtime" "^7.12.1" - tiny-warning "^1.0.3" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-libs-browser@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-scroll-left@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz#6b79691ba79eb5fb107fa5edfbdc06b55caee2aa" - integrity sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -popper.js@^1.14.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - -portfinder@^1.0.20: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.6.0, prop-types@^15.6.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-event-listener@^0.6.2: - version "0.6.6" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" - integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== - dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - warning "^4.0.1" - -react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-router-dom@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== - dependencies: - "@babel/runtime" "^7.1.2" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.1.2" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== - dependencies: - "@babel/runtime" "^7.1.2" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-transition-group@^2.2.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== - dependencies: - dom-helpers "^3.4.0" - loose-envify "^1.4.0" - prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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" - -readable-stream@^3.0.6, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -"recompose@0.28.0 - 0.30.0": - version "0.30.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" - integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== - dependencies: - "@babel/runtime" "^7.0.0" - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - react-lifecycles-compat "^3.0.2" - symbol-observable "^1.0.4" - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.4: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== - dependencies: - node-forge "^0.10.0" - -semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - 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" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs-client@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" - integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-loader@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.3.tgz#d4b0c8cd47d54edce3e6bfa0f523f452b5b0e521" - integrity sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw== - dependencies: - async "^2.5.0" - loader-utils "~0.2.2" - source-map "~0.6.1" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - 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" - -spdy@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - 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" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -symbol-observable@1.2.0, symbol-observable@^1.0.4, symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -terser-webpack-plugin@^1.1.0: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -tiny-invariant@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== - -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse@^1.4.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.0.1, uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache@^2.0.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= - dependencies: - loose-envify "^1.0.0" - -warning@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.5.0: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-cli@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.2.tgz#aed2437b0db0a7faa2ad28484e166a5360014a91" - integrity sha512-FLkobnaJJ+03j5eplxlI0TUxhGCOdfewspIGuvDVtpOlrAuKMFC57K42Ukxqs1tn8947/PM6tP95gQc0DCzRYA== - dependencies: - chalk "^2.4.1" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.0" - findup-sync "^2.0.0" - global-modules "^1.0.0" - import-local "^2.0.0" - interpret "^1.1.0" - loader-utils "^1.1.0" - supports-color "^5.5.0" - v8-compile-cache "^2.0.2" - yargs "^12.0.5" - -webpack-dev-middleware@^3.7.0: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.4.1.tgz#a5fd8dec95dec410098e7d9a037ff9405395d51a" - integrity sha512-CRqZQX2ryMtrg0r3TXQPpNh76eM1HD3Wmu6zDBxIKi/d2y+4aa28Ia8weNT0bfgWpY6Vs3Oq/K8+DjfbR+tWYw== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.6" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.0" - html-entities "^1.2.1" - http-proxy-middleware "^0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - killable "^1.0.1" - loglevel "^1.6.1" - opn "^5.5.0" - portfinder "^1.0.20" - schema-utils "^1.0.0" - selfsigned "^1.10.4" - semver "^6.0.0" - serve-index "^1.9.1" - sockjs "0.3.19" - sockjs-client "1.3.0" - spdy "^4.0.0" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.0" - webpack-log "^2.0.0" - yargs "12.0.5" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-sources@^1.3.0, webpack-sources@^1.4.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@4.32.2: - version "4.32.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.32.2.tgz#3639375364a617e84b914ddb2c770aed511e5bc8" - integrity sha512-F+H2Aa1TprTQrpodRAWUMJn7A8MgDx82yQiNvYMaj3d1nv3HetKU0oqEulL9huj8enirKi8KvEXQ3QtuHF89Zg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.0.5" - acorn-dynamic-import "^4.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^1.0.0" - tapable "^1.1.0" - terser-webpack-plugin "^1.1.0" - watchpack "^1.5.0" - webpack-sources "^1.3.0" - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-fetch@>=0.10.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.14, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@12.0.5, yargs@^12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" diff --git a/build.sbt b/build.sbt index 427c9b2..8a9dcdf 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,7 @@ ThisBuild / versionScheme := Some("early-semver") // For all Sonatype accounts created on or after February 2021 ThisBuild / sonatypeCredentialHost := "s01.oss.sonatype.org" +ThisBuild / scalaVersion := "3.3.0" inThisBuild( List( @@ -22,36 +23,7 @@ inThisBuild( resolvers += Resolver.sonatypeRepo("releases") val playJson = "2.10.0-RC5" -val sttp = "3.5.0" - -val consoleDisabledOptions = Seq("-Xfatal-warnings", "-Ywarn-unused", "-Ywarn-unused-import") - -// Used only by the server -// TODO: Reuse it in all projects -lazy val baseServerSettings: Project => Project = { - _.settings( - scalacOptions ++= Seq( - "-Werror", - "-unchecked", - "-deprecation", - "-feature", - "-target:jvm-1.8", - "-encoding", - "UTF-8", - "-Xsource:3", - "-Wconf:src=src_managed/.*:silent", - "-Xlint:missing-interpolator", - "-Xlint:adapted-args", - "-Ywarn-dead-code", - "-Ywarn-numeric-widen", - "-Ywarn-value-discard", - "-Ywarn-unused" - ), - Compile / doc / scalacOptions ++= Seq("-no-link-warnings"), - // Some options are very noisy when using the console and prevent us using it smoothly, let's disable them - Compile / console / scalacOptions ~= (_.filterNot(consoleDisabledOptions.contains)) - ) -} +val stMaterialUi = "5.11.16" // Used only by the lib projects lazy val baseLibSettings: Project => Project = _.settings( @@ -60,24 +32,10 @@ lazy val baseLibSettings: Project => Project = _.settings( "-encoding", "UTF-8", "-feature", - "-language:implicitConversions" - // disabled during the migration - // "-Xfatal-warnings" - ) ++ - (CrossVersion.partialVersion(scalaVersion.value) match { - case Some((3, _)) => - Seq( - "-unchecked", - "-source:3.0-migration" - ) - case _ => - Seq( - "-deprecation", - "-Xfatal-warnings", - "-Wunused:imports,privates,locals", - "-Wvalue-discard" - ) - }) + "-language:implicitConversions", + "-unchecked", + "-source:3.0-migration" + ) }, libraryDependencies ++= Seq( "org.scalatest" %%% "scalatest" % "3.2.15" % Test @@ -93,140 +51,23 @@ lazy val baseWebSettings: Project => Project = "-encoding", "UTF-8", "-feature", - "-language:implicitConversions" - // disabled during the migration - // "-Xfatal-warnings" - ) ++ - (CrossVersion.partialVersion(scalaVersion.value) match { - case Some((3, _)) => - Seq( - "-unchecked", - "-source:3.0-migration" - ) - case _ => - Seq( - "-deprecation", - "-Xfatal-warnings", - "-Wunused:imports,privates,locals", - "-Wvalue-discard", - "-Ymacro-annotations" - ) - }) + "-language:implicitConversions", + "-unchecked", + "-source:3.0-migration" + ) }, libraryDependencies ++= Seq( "io.github.cquiroz" %%% "scala-java-time" % "2.3.0", "org.scala-js" %%% "scala-js-macrotask-executor" % "1.1.1", - "com.alexitc" %%% "sjs-material-ui-facade" % "0.2.0" + "com.olvind.st-material-ui" %%% "st-material-ui-icons-slinky" % stMaterialUi ) ) -// specify versions for all of reacts dependencies -lazy val reactNpmDeps: Project => Project = - _.settings( - stTypescriptVersion := "3.9.3", - stIgnore += "react-proxy", - Compile / npmDependencies ++= Seq( - "react" -> "16.13.1", - "react-dom" -> "16.13.1", - "@types/react" -> "16.9.42", - "@types/react-dom" -> "16.9.8", - "csstype" -> "2.6.11", - "@types/prop-types" -> "15.7.3", - "react-proxy" -> "1.1.8" - ) - ) - -lazy val withCssLoading: Project => Project = - _.settings( - /* custom webpack file to include css */ - Compile / webpackConfigFile := Some((ThisBuild / baseDirectory).value / "custom.webpack.config.js"), - Test / webpackConfigFile := None, // it is important to avoid the custom webpack config in tests to get them passing - Compile / npmDevDependencies ++= Seq( - "webpack-merge" -> "4.2.2", - "css-loader" -> "3.4.2", - "style-loader" -> "1.1.3", - "file-loader" -> "5.1.0", - "url-loader" -> "3.0.0" - ) - ) - -lazy val bundlerSettings: Project => Project = - _.settings( - Compile / fastOptJS / webpackExtraArgs += "--mode=development", - Compile / fullOptJS / webpackExtraArgs += "--mode=production", - Compile / fastOptJS / webpackDevServerExtraArgs += "--mode=development", - Compile / fullOptJS / webpackDevServerExtraArgs += "--mode=production" - ) - -// Used only by play-based projects -lazy val playSettings: Project => Project = { - _.enablePlugins(PlayScala) - .disablePlugins(PlayLayoutPlugin) - .settings( - // docs are huge and unnecessary - Compile / doc / sources := Nil, - Compile / doc / scalacOptions ++= Seq( - "-no-link-warnings" - ), - // remove play noisy warnings - play.sbt.routes.RoutesKeys.routesImport := Seq.empty, - libraryDependencies ++= Seq( - evolutions, - "com.typesafe.play" %% "play-jdbc" % "2.8.19", - "com.google.inject" % "guice" % "5.1.0" - ), - // test - libraryDependencies ++= Seq( - "org.scalatestplus.play" %% "scalatestplus-play" % "5.1.0" % Test, - "org.mockito" %% "mockito-scala" % "1.17.14" % Test, - "org.mockito" %% "mockito-scala-scalatest" % "1.17.14" % Test - ) - ) -} - -lazy val scalablytypedFacades = (project in file("scalablytyped-facades")) - .configure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin, ScalablyTypedConverterGenSourcePlugin)) - .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.2.2"), - name := "scalablytyped-facades", - useYarn := true, - Test / requireJsDomEnv := true, - stTypescriptVersion := "3.9.3", - stOutputPackage := "net.wiringbits.facades", - // material-ui is provided by a pre-packaged library - stIgnore ++= List( - "@material-ui/core", - "@material-ui/styles", - "@material-ui/icons", - "react-router", - "react-router-dom" - ), - Compile / npmDependencies ++= Seq( - "@material-ui/core" -> "3.9.4", // note: version 4 is not supported yet - "@material-ui/styles" -> "3.0.0-alpha.10", // note: version 4 is not supported yet - "@material-ui/icons" -> "3.0.2", - "@types/classnames" -> "2.2.10", - "react-router" -> "5.1.2", - "react-router-dom" -> "5.1.2" - ), - stFlavour := Flavour.Slinky, - stReactEnableTreeShaking := Selection.All, - stUseScalaJsDom := true, - stMinimize := Selection.AllExcept("@types/classnames"), - // docs are huge and unnecessary - Compile / doc / sources := Nil, - // disabled because it somehow triggers many warnings - scalaJSLinkerConfig ~= (_.withSourceMap(false)) - ) - /** The common stuff for the server/client modules */ lazy val webappCommon = (crossProject(JSPlatform, JVMPlatform) in file("webapp-common")) .configure(baseLibSettings) .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.2.2"), name := "webapp-common" ) .jsConfigure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) @@ -246,112 +87,53 @@ lazy val webappCommon = (crossProject(JSPlatform, JVMPlatform) in file("webapp-c ) ) -/** Just the API side for the admin-data-explorer modules - */ -lazy val adminDataExplorerApi = (crossProject(JSPlatform, JVMPlatform) in file("admin-data-explorer-api")) - .configure(baseLibSettings) - .dependsOn(webappCommon) - .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.2.2"), - name := "admin-data-explorer-api" - ) - .jsConfigure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) - .jvmSettings( - libraryDependencies ++= Seq( - "com.typesafe.play" %% "play-json" % playJson, - "com.softwaremill.sttp.client3" %% "core" % sttp - ) - ) - .jsSettings( - stUseScalaJsDom := true, - Test / fork := false, // sjs needs this to run tests - Compile / stMinimize := Selection.All, - libraryDependencies ++= Seq( - "com.typesafe.play" %%% "play-json" % playJson, - "com.softwaremill.sttp.client3" %%% "core" % sttp - ) - ) - /** Utils specific to slinky */ lazy val slinkyUtils = (project in file("slinky-utils")) .configure(baseLibSettings, baseWebSettings) - .configure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) - .dependsOn(webappCommon.js, scalablytypedFacades) + .configure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin, ScalablyTypedConverterPlugin)) + .dependsOn(webappCommon.js) .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.2.2"), name := "slinky-utils", - Test / fork := false // sjs needs this to run tests - ) - -// shared on the ui only -lazy val adminDataExplorerWeb = (project in file("admin-data-explorer-web")) - .dependsOn(adminDataExplorerApi.js) - .configure(bundlerSettings, baseLibSettings) - .configure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin)) - .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8", "3.2.2"), - name := "admin-data-explorer-web", Test / fork := false, // sjs needs this to run tests - libraryDependencies ++= Seq( - "com.github.japgolly.scalajs-react" %%% "core" % "2.1.1", - "io.github.nafg.scalajs-facades" %%% "simplefacade" % "0.16.0", - "org.scala-js" %%% "scala-js-macrotask-executor" % "1.1.1" + stTypescriptVersion := "3.9.3", + useYarn := true, + stFlavour := Flavour.Slinky, + Compile / stMinimize := Selection.All, + stIgnore ++= List( + "react-proxy", + "@mui/material", + "@mui/icons-material", + "@mui/joy", + "@emotion/react", + "@emotion/styled", + "react-router", + "react-router-dom" ), Compile / npmDependencies ++= Seq( - "react" -> "17.0.0", - "react-dom" -> "17.0.0", - "react-scripts" -> "5.0.0", - "react-admin" -> "4.1.0", - "ra-ui-materialui" -> "4.1.0", - "ra-data-simple-rest" -> "4.1.0", - "ra-i18n-polyglot" -> "4.1.0", - "ra-language-english" -> "4.1.0", - "ra-core" -> "4.1.0", - "@mui/material" -> "5.8.1", - "@emotion/styled" -> "11.8.1" - ) - ) - -/** Includes the specific stuff to run the data explorer server side (play-specific) - */ -lazy val adminDataExplorerPlayServer = (project in file("admin-data-explorer-play-server")) - .dependsOn(adminDataExplorerApi.jvm, webappCommon.jvm) - .configure(baseServerSettings, playSettings) - .settings( - scalaVersion := "2.13.8", - crossScalaVersions := Seq("2.13.8"), - name := "admin-data-explorer-play-server", - fork := true, - Test / fork := true, // allows for graceful shutdown of containers once the tests have finished running - libraryDependencies ++= Seq( - "org.playframework.anorm" %% "anorm" % "2.7.0", - "com.typesafe.play" %% "play" % "2.8.19", - "com.typesafe.play" %% "play-json" % "2.9.4", - "org.postgresql" % "postgresql" % "42.6.0", - "com.github.jwt-scala" %% "jwt-core" % "9.2.0", - "de.svenkubiak" % "jBCrypt" % "0.4.3", - "commons-validator" % "commons-validator" % "1.7", - "com.dimafeng" %% "testcontainers-scala-scalatest" % "0.40.15" % "test", - "com.dimafeng" %% "testcontainers-scala-postgresql" % "0.40.15" % "test", - "com.softwaremill.sttp.client3" %% "core" % sttp % "test", - "com.softwaremill.sttp.client3" %% "async-http-client-backend-future" % sttp % "test" + "react" -> "18.2.0", + "react-dom" -> "18.2.0", + "csstype" -> "2.6.11", + "react-proxy" -> "1.1.8", + "@mui/material" -> "5.11.16", + "@mui/icons-material" -> "5.11.16", + "@mui/joy" -> "5.0.0-alpha.74", + "@emotion/react" -> "11.10.6", + "@emotion/styled" -> "11.10.6", + "react-router" -> "5.1.2", + "react-router-dom" -> "5.1.2" + ), + Compile / npmDevDependencies ++= Seq( + "@types/react" -> "18.0.33", + "@types/react-dom" -> "18.0.11", ) ) lazy val root = (project in file(".")) .aggregate( - scalablytypedFacades, webappCommon.jvm, webappCommon.js, - adminDataExplorerApi.jvm, - adminDataExplorerApi.js, - slinkyUtils, - adminDataExplorerWeb, - adminDataExplorerPlayServer + slinkyUtils ) .settings( name := "wiringbits-webapp-utils", diff --git a/project/plugins.sbt b/project/plugins.sbt index eb583ee..7661d38 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -10,6 +10,6 @@ addSbtPlugin("org.scalablytyped.converter" % "sbt-converter" % "1.0.0-beta37") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.1") addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12") diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/Utils.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/Utils.scala new file mode 100644 index 0000000..d649b62 --- /dev/null +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/Utils.scala @@ -0,0 +1,8 @@ +package net.wiringbits.webapp.utils.slinkyUtils + +import com.olvind.mui.muiMaterial.stylesCreateThemeMod.Theme +import com.olvind.mui.muiSystem.styleFunctionSxStyleFunctionSxMod.SystemCssProperties + +object Utils { + type CSSPropertiesUtils = SystemCssProperties[Theme] +} diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AlertDialog.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AlertDialog.scala index 602e2a0..9a7a1f0 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AlertDialog.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AlertDialog.scala @@ -1,6 +1,6 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core -import com.alexitc.materialui.facade.materialUiCore.{components => mui, materialUiCoreStrings => muiStrings} +import com.olvind.mui.muiMaterial.components as mui import slinky.core.{FunctionalComponent, KeyAddingStage} object AlertDialog { @@ -19,14 +19,13 @@ object AlertDialog { val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => mui .Dialog(props.visible) - .onClose(_ => props.onClose())( + .onClose((_, _) => props.onClose())( mui.DialogTitle(props.title), mui.DialogContent(mui.DialogContentText(props.message)), mui.DialogActions( - mui - .Button() - .variant(muiStrings.contained) - .color(muiStrings.primary) + mui.Button.normal + .variant("contained") + .color("primary") .onClick(_ => props.onClose())(props.closeText) ) ) diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AsyncComponent.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AsyncComponent.scala index c3d5a9c..13172dc 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AsyncComponent.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/AsyncComponent.scala @@ -1,11 +1,10 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core -import com.alexitc.materialui.facade.materialUiCore.{components => mui} -import slinky.core.FunctionalComponent +import com.olvind.mui.muiMaterial.components as mui +import org.scalajs.macrotaskexecutor.MacrotaskExecutor.Implicits.* import slinky.core.facade.{Hooks, ReactElement} -import slinky.web.html._ +import slinky.core.{FunctionalComponent, KeyAddingStage} -import org.scalajs.macrotaskexecutor.MacrotaskExecutor.Implicits._ import scala.concurrent.Future import scala.util.{Failure, Success} @@ -55,6 +54,28 @@ object AsyncComponent { watchedObjects: Iterable[Any] = List("") ) + def apply[D]( + fetch: () => Future[D], + render: D => ReactElement, + onDataLoaded: D => Unit = (_: D) => (), + progressIndicator: () => ReactElement = () => loader, + progressIndicatorWhileReloadingData: Boolean = false, + retryLabel: String = "Retry", + watchedObjects: Iterable[Any] = List("") + ): KeyAddingStage = { + component[D]( + Props( + fetch, + render, + onDataLoaded, + progressIndicator, + progressIndicatorWhileReloadingData, + retryLabel, + watchedObjects + ) + ) + } + /** @tparam D * The data to fetch and render * @return @@ -95,17 +116,17 @@ object AsyncComponent { } private def loader: ReactElement = { - div( + mui.Box( mui.CircularProgress() ) } private def error[D](msg: String, props: Props[D], reload: () => Unit): ReactElement = { - div( + mui.Box( mui .Typography() - .color(com.alexitc.materialui.facade.materialUiCore.mod.PropTypes.Color.secondary)(msg), - mui.Button.onClick(_ => reload())(props.retryLabel) + .color("secondary")(msg), + mui.Button.normal.onClick(_ => reload())(props.retryLabel) ) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ConfirmDialog.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ConfirmDialog.scala index d06aa84..f1015cf 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ConfirmDialog.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ConfirmDialog.scala @@ -1,7 +1,6 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core -import com.alexitc.materialui.facade.materialUiCore.mod.PropTypes -import com.alexitc.materialui.facade.materialUiCore.{components => mui} +import com.olvind.mui.muiMaterial.components as mui import slinky.core.{FunctionalComponent, KeyAddingStage} object ConfirmDialog { @@ -41,14 +40,13 @@ object ConfirmDialog { val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => mui .Dialog(props.visible) - .onClose(_ => props.onCancel())( + .onClose((_, _) => props.onCancel())( mui.DialogTitle(props.title), mui.DialogContent(mui.DialogContentText(props.message)), mui.DialogActions( - mui.Button().color(PropTypes.Color.secondary).onClick(_ => props.onCancel())(props.cancelText), - mui - .Button() - .color(PropTypes.Color.primary) + mui.Button.normal.color("secondary").onClick(_ => props.onCancel())(props.cancelText), + mui.Button.normal + .color("primary") .onClick(_ => props.onConfirm())(props.confirmText) ) ) diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorBoundaryInfo.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorBoundaryInfo.scala index 785d789..cd220b8 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorBoundaryInfo.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorBoundaryInfo.scala @@ -1,19 +1,12 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core -import com.alexitc.materialui.facade.csstype.mod.FlexDirectionProperty -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiIcons.{components => muiIcons} -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} -import org.scalablytyped.runtime.StringDictionary +import com.olvind.mui.csstype.mod.DataType.{ContentPosition, DisplayInside, SelfPosition} +import com.olvind.mui.csstype.mod.Property.FlexDirection +import com.olvind.mui.muiIconsMaterial.components as muiIcons +import com.olvind.mui.muiMaterial.components as mui +import com.olvind.mui.muiMaterial.stylesCreateTypographyMod.Variant +import net.wiringbits.webapp.utils.slinkyUtils.Utils.CSSPropertiesUtils import slinky.core.{FunctionalComponent, KeyAddingStage} -import slinky.web.html.{className, div, h1} object ErrorBoundaryInfo { case class Props(error: scala.scalajs.js.Error) @@ -22,42 +15,44 @@ object ErrorBoundaryInfo { component(Props(error)) } - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "errorBoundaryInfo" -> CSSProperties() - .setFlex("auto") - .setDisplay("flex") - .setFlexDirection(FlexDirectionProperty.column) - .setAlignItems("center") - .setJustifyContent("center"), - "content" -> CSSProperties() - .setDisplay("flex") - .setFlexDirection(FlexDirectionProperty.column), - "icon" -> CSSProperties() - .setDisplay("flex") - .setJustifyContent("center") - .set( - "& svg ", - CSSProperties() - .setFontSize("4em") - ) - ) - makeStyles(stylesCallback, WithStylesOptions()) + private val errorBoundaryInfoCss = new CSSPropertiesUtils { + flex = "auto" + display = DisplayInside.flex + flexDirection = FlexDirection.column + alignItems = SelfPosition.center + justifyContent = ContentPosition.center + alignItems = ContentPosition.center + justifyContent = ContentPosition.center } + private val contentCss = new CSSPropertiesUtils { + display = DisplayInside.flex + flexDirection = FlexDirection.column + } + + private val iconCss = new CSSPropertiesUtils { + display = DisplayInside.flex + justifyContent = ContentPosition.center + }.set( + "& svg", + new CSSPropertiesUtils { + fontSize = "4em" + } + ) + val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) val e = props.error - div( - className := classes("errorBoundaryInfo"), - div( - className := classes("content"), - div(className := classes("icon"), muiIcons.Warning()), - h1("You hit an unexpected error"), - div(e.toString) + mui + .Box( + mui + .Box( + mui.Box(muiIcons.Warning()).sx(iconCss), + mui.Typography("You hit an unexpected error").variant(Variant.h1), + mui.Box(e.toString) + ) + .sx(contentCss) ) - ) + .sx(errorBoundaryInfoCss) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorLabel.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorLabel.scala index 98a1f15..4a441fc 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorLabel.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/ErrorLabel.scala @@ -1,46 +1,29 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiCore.{components => mui, materialUiCoreStrings => muiStrings} -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} +import com.olvind.mui.muiMaterial.components as mui +import com.olvind.mui.muiMaterial.stylesCreateTypographyMod.Variant +import net.wiringbits.webapp.utils.slinkyUtils.Utils.CSSPropertiesUtils import org.scalablytyped.runtime.StringDictionary import slinky.core.facade.Fragment import slinky.core.{FunctionalComponent, KeyAddingStage} object ErrorLabel { - - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "errorLabel" -> CSSProperties() - .setColor("#f44336") - ) - - makeStyles(stylesCallback, WithStylesOptions()) - } case class Props(text: String) def apply(text: String): KeyAddingStage = { component(Props(text)) } - val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) + private val errorLabelCss = new CSSPropertiesUtils { + color = "#f44336" + } + val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => if (props.text.nonEmpty) { - Fragment( - mui - .Typography(props.text) - .className(classes("errorLabel")) - .variant(muiStrings.body2) - ) + mui + .Typography(props.text) + .variant(Variant.body2) + .sx(errorLabelCss) } else { Fragment() } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/InfoCard.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/InfoCard.scala index ae7813b..e54853b 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/InfoCard.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/InfoCard.scala @@ -1,17 +1,9 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core -import com.alexitc.materialui.facade.csstype.mod.FlexDirectionProperty -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiCore.{components => mui} -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} -import org.scalablytyped.runtime.StringDictionary +import com.olvind.mui.csstype.mod.DataType.{ContentPosition, DisplayInside} +import com.olvind.mui.csstype.mod.Property.{FlexDirection, OverflowInline} +import com.olvind.mui.muiMaterial.components as mui +import net.wiringbits.webapp.utils.slinkyUtils.Utils.CSSPropertiesUtils import slinky.core.{FunctionalComponent, KeyAddingStage, TagMod} import slinky.web.html.div @@ -22,41 +14,32 @@ object InfoCard { component(Props(message = message, icon = icon, child = child)) } - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - /* If you don't need direct access to theme, this could be `StyleRules[Props, String]` */ - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "infoCard" -> CSSProperties() - .setMinHeight(200) - .setDisplay("flex") - .setFlexDirection(FlexDirectionProperty.column) - .setAlignItems("center") - .setJustifyContent("center") - .setFontSize("1.5em") - .setBorderRadius(8) - .setPadding(16) - .setOverflow("hidden") - .setColor("#616161") - .set( - "& svg", - CSSProperties() - .setFontSize("2em") - .setMarginBottom(16) - ) - ) - - makeStyles(stylesCallback, WithStylesOptions()) - } + private val infoCardCss = new CSSPropertiesUtils { + minHeight = 200 + display = DisplayInside.flex + flexDirection = FlexDirection.column + alignItems = ContentPosition.center + justifyContent = ContentPosition.center + fontSize = "1.5em" + borderRadius = 8 + padding = 16 + overflow = OverflowInline.hidden + color = "#616161" + }.set( + "& svg", + new CSSPropertiesUtils { + fontSize = "2em" + marginBottom = 16 + } + ) val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) - mui.Paper - .className(classes("infoCard")) .elevation(0)( props.icon, props.message, props.child.getOrElse("") ) + .sx(infoCardCss) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/CircularLoader.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/CircularLoader.scala index 7402e03..c9f2f24 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/CircularLoader.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/CircularLoader.scala @@ -1,16 +1,7 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core.widgets -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiCore.{components => mui} -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} -import org.scalablytyped.runtime.StringDictionary +import com.olvind.mui.muiMaterial.components as mui +import net.wiringbits.webapp.utils.slinkyUtils.Utils.CSSPropertiesUtils import slinky.core.{FunctionalComponent, KeyAddingStage} object CircularLoader { @@ -20,20 +11,13 @@ object CircularLoader { component(Props(size = size)) } - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "circularLoader" -> CSSProperties() - .setDisplay("flex") - ) - makeStyles(stylesCallback, WithStylesOptions()) + private val circularLoaderCss = new CSSPropertiesUtils { + display = "flex" } val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) - mui - .CircularProgress() - .className(classes("circularLoader")) + mui.CircularProgress + .sx(circularLoaderCss) .size(props.size) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Container.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Container.scala index bcb8143..653ced4 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Container.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Container.scala @@ -1,19 +1,11 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core.widgets -import com.alexitc.materialui.facade.csstype.mod.BoxSizingProperty -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} -import org.scalablytyped.runtime.StringDictionary +import com.olvind.mui.csstype.mod.DataType.DisplayInside +import com.olvind.mui.csstype.mod.Property.{BoxSizing, FlexDirection} +import com.olvind.mui.muiMaterial.components as mui +import net.wiringbits.webapp.utils.slinkyUtils.Utils.CSSPropertiesUtils import slinky.core.facade.ReactElement import slinky.core.{FunctionalComponent, KeyAddingStage} -import slinky.web.html.{className, div, style} import scala.scalajs.js @@ -60,13 +52,6 @@ object Container { ) } - sealed trait FlexDirection extends Product with Serializable - - object FlexDirection { - case object column extends FlexDirection - case object row extends FlexDirection - } - sealed trait Alignment extends Product with Serializable object Alignment extends Enumeration { @@ -92,39 +77,29 @@ object Container { def vertical(value: Int): EdgeInsets = EdgeInsets(value, 0, value, 0) } - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "container" -> CSSProperties() - .setDisplay("flex") - .setBoxSizing(BoxSizingProperty.`border-box`) - .setWidth("auto") - ) - makeStyles(stylesCallback, WithStylesOptions()) - } - val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) - - val borderRadius = props.borderRadius.getOrElse("0px") - val minWidth = props.minWidth.getOrElse("0") - val maxWidth = props.maxWidth.getOrElse("auto") - - val flex = props.flex.getOrElse("none") - - val containerStyle = js.Dynamic.literal( - margin = props.margin.value(), - padding = props.padding.value(), - borderRadius = borderRadius, - minWidth = minWidth, - maxWidth = maxWidth, - flex = flex.toString, - flexDirection = props.flexDirection.toString, - alignItems = parseAlignment(props.alignItems), + val borderRadius_ = props.borderRadius.getOrElse("0px") + val minWidth_ = props.minWidth.getOrElse("0") + val maxWidth_ = props.maxWidth.getOrElse("auto") + + val flex_ = props.flex.map(_.toString).getOrElse("none") + + val containerCss = new CSSPropertiesUtils { + display = DisplayInside.flex + boxSizing = BoxSizing.`border-box` + width = "auto" + margin = props.margin.value() + padding = props.padding.value() + borderRadius = borderRadius_ + minWidth = minWidth_ + maxWidth = maxWidth_ + flex = flex_ + flexDirection = props.flexDirection + alignItems = parseAlignment(props.alignItems) justifyContent = parseAlignment(props.justifyContent) - ) + } - div(className := classes("container"), style := containerStyle)(props.child) + mui.Box(props.child).sx(containerCss) } private def parseAlignment(alignment: Alignment): String = { diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/NavLinkButton.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/NavLinkButton.scala index 6290fba..c7b9be6 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/NavLinkButton.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/NavLinkButton.scala @@ -1,21 +1,14 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core.widgets -import com.alexitc.materialui.facade.csstype.mod.TextAlignProperty -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiCore.mod.PropTypes.Color -import com.alexitc.materialui.facade.materialUiCore.{components => mui, materialUiCoreStrings => muiStrings} -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} +import com.olvind.mui.csstype.mod.Property.{TextAlign, TextDecorationStyle} +import com.olvind.mui.muiMaterial.components as mui +import com.olvind.mui.muiMaterial.stylesCreateTypographyMod.Variant +import com.olvind.mui.react.mod.CSSProperties import net.wiringbits.webapp.utils.slinkyUtils.facades.reactrouterdom.NavLink -import org.scalablytyped.runtime.StringDictionary import slinky.core.{FunctionalComponent, KeyAddingStage} -import slinky.web.html.{className, onClick} +import slinky.web.html.{onClick, style} + +import scala.scalajs.js object NavLinkButton { case class Props(path: String, text: String, onClick: () => Unit) @@ -24,28 +17,22 @@ object NavLinkButton { component(Props(path = path, text = text, onClick = onClick)) } - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "navLinkButton" -> CSSProperties() - .setMargin("0 8px") - .setPadding("2px 4px") - .setColor("inherit") - .setTextAlign(TextAlignProperty.inherit) - .setTextDecoration("none"), - "navLinkButtonActive" -> CSSProperties() - ) - makeStyles(stylesCallback, WithStylesOptions()) + private val navLinkButtonCss = new CSSProperties { + margin = "0 8px" + padding = "2px 4px" + color = "inherit" + textAlign = TextAlign.inherit + textDecoration = TextDecorationStyle.inherit } - val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) + private val navLinkButtonActiveCss = CSSProperties() - val text = mui.Typography()(props.text).variant(muiStrings.h6).color(Color.inherit) + val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => + val text = mui.Typography()(props.text).variant(Variant.h6).color("inherit") - NavLink(className := classes("navLinkButton"), onClick := (_ => props.onClick()))( + NavLink(onClick := (_ => props.onClick()), style := navLinkButtonCss)( to = props.path, - activeClassName = s"${classes("navLinkButton")} ${classes("navLinkButtonActive")}", + activeStyle = navLinkButtonActiveCss, exact = true )(text) } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Scaffold.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Scaffold.scala index 87ba1b7..701c67f 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Scaffold.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Scaffold.scala @@ -1,19 +1,10 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core.widgets -import com.alexitc.materialui.facade.csstype.mod.FlexDirectionProperty -import com.alexitc.materialui.facade.materialUiCore.createMuiThemeMod.Theme -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod.{ - CSSProperties, - StyleRulesCallback, - Styles, - WithStylesOptions -} -import org.scalablytyped.runtime.StringDictionary +import com.olvind.mui.csstype.mod.Property.FlexDirection +import com.olvind.mui.muiMaterial.components as mui +import net.wiringbits.webapp.utils.slinkyUtils.Utils.CSSPropertiesUtils import slinky.core.facade.{Fragment, ReactElement} import slinky.core.{FunctionalComponent, KeyAddingStage} -import slinky.web.html.{className, div} object Scaffold { case class Props(appbar: Option[ReactElement] = None, body: ReactElement, footer: Option[ReactElement] = None) @@ -26,42 +17,37 @@ object Scaffold { component(Props(appbar = appbar, body = body, footer = footer)) } - private lazy val useStyles: StylesHook[Styles[Theme, Unit, String]] = { - val stylesCallback: StyleRulesCallback[Theme, Unit, String] = theme => - StringDictionary( - "scaffold" -> CSSProperties() - .setFlex("auto") - .setDisplay("flex") - .setFlexDirection(FlexDirectionProperty.column), - "scaffoldAppbar" -> CSSProperties(), - "scaffoldBody" -> CSSProperties() - .setMinHeight("100vh") - .setFlex("auto") - .setDisplay("flex") - .setFlexDirection(FlexDirectionProperty.column) - .setPadding("1em"), - "scaffoldFooter" -> CSSProperties() - ) - makeStyles(stylesCallback, WithStylesOptions()) + private val scaffoldCss = new CSSPropertiesUtils { + flex = "auto" + display = "flex" + flexDirection = FlexDirection.column } - val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val classes = useStyles(()) + private val scaffoldBodyCss = new CSSPropertiesUtils { + minHeight = "100vh" + flex = "auto" + display = "flex" + flexDirection = FlexDirection.column + padding = "1em" + } - val appbar = props.appbar match { - case Some(e) => Fragment(div(className := classes("scaffoldAppbar"))(e)) + val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => + val appbar: ReactElement = props.appbar match { + case Some(e) => mui.Box(e) case None => Fragment() } - val footer = props.footer match { - case Some(e) => Fragment(div(className := classes("scaffoldFooter"))(e)) + val footer: ReactElement = props.footer match { + case Some(e) => mui.Box(e) case None => Fragment() } - div(className := classes("scaffold"))( - appbar, - div(className := classes("scaffoldBody"))(props.body), - footer - ) + mui + .Box( + appbar, + mui.Box(props.body).sx(scaffoldBodyCss), + footer + ) + .sx(scaffoldCss) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Subtitle.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Subtitle.scala index 49c75fc..ee079ec 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Subtitle.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Subtitle.scala @@ -1,7 +1,8 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core.widgets -import com.alexitc.materialui.facade.materialUiCore.mod.PropTypes.Color -import com.alexitc.materialui.facade.materialUiCore.{typographyTypographyMod, components => mui} +import com.olvind.mui.csstype.mod.Property.Color +import com.olvind.mui.muiMaterial.components as mui +import com.olvind.mui.muiMaterial.stylesCreateTypographyMod.Variant import slinky.core.{FunctionalComponent, KeyAddingStage} object Subtitle { @@ -12,11 +13,11 @@ object Subtitle { } val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val color = props.color.getOrElse(Color.inherit) + val color = props.color.getOrElse("inherit") mui .Typography() .color(color) - .variant(typographyTypographyMod.Style.h6)(props.text) + .variant(Variant.h6)(props.text) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Title.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Title.scala index 7d3d7b3..1e944f5 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Title.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/components/core/widgets/Title.scala @@ -1,7 +1,8 @@ package net.wiringbits.webapp.utils.slinkyUtils.components.core.widgets -import com.alexitc.materialui.facade.materialUiCore.mod.PropTypes.Color -import com.alexitc.materialui.facade.materialUiCore.{typographyTypographyMod, components => mui} +import com.olvind.mui.csstype.mod.DataType.Color +import com.olvind.mui.muiMaterial.components as mui +import com.olvind.mui.muiMaterial.stylesCreateTypographyMod.Variant import slinky.core.{FunctionalComponent, KeyAddingStage} object Title { @@ -12,11 +13,11 @@ object Title { } val component: FunctionalComponent[Props] = FunctionalComponent[Props] { props => - val color = props.color.getOrElse(Color.inherit) + val color = props.color.getOrElse("inherit") mui .Typography() .color(color) - .variant(typographyTypographyMod.Style.h4)(props.text) + .variant(Variant.h4)(props.text) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/MediaQueryHooks.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/MediaQueryHooks.scala index 47fc3d3..00c412d 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/MediaQueryHooks.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/MediaQueryHooks.scala @@ -1,23 +1,23 @@ package net.wiringbits.webapp.utils.slinkyUtils.core -import com.alexitc.materialui.facade.materialUiCore.useMediaQueryMod.unstableUseMediaQuery +import com.olvind.mui.muiMaterial.useMediaQueryMod object MediaQueryHooks { - def useIsLaptop() = { - unstableUseMediaQuery("(min-width: 769px)") + def useIsLaptop(): Boolean = { + useMediaQueryMod.default("(min-width: 769px)") } - def useIsTablet() = { - unstableUseMediaQuery("(min-width: 426px) and (max-width: 768px)") + def useIsTablet(): Boolean = { + useMediaQueryMod.default("(min-width: 426px) and (max-width: 768px)") } - def useIsMobile() = { - unstableUseMediaQuery("(max-width: 425px)") + def useIsMobile(): Boolean = { + useMediaQueryMod.default("(max-width: 425px)") } - def useIsMobileOrTablet() = { - unstableUseMediaQuery("(max-width: 768px)") + def useIsMobileOrTablet(): Boolean = { + useMediaQueryMod.default("(max-width: 768px)") } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/StyleBuilder.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/StyleBuilder.scala deleted file mode 100644 index 4bbe7e5..0000000 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/core/StyleBuilder.scala +++ /dev/null @@ -1,48 +0,0 @@ -package net.wiringbits.webapp.utils.slinkyUtils.core - -import com.alexitc.materialui.facade.materialUiStyles.makeStylesMod.StylesHook -import com.alexitc.materialui.facade.materialUiStyles.mod.makeStyles -import com.alexitc.materialui.facade.materialUiStyles.withStylesMod._ -import org.scalablytyped.runtime.StringDictionary - -import scala.scalajs.js - -/* This is an example of a scala facade on top of the generated code. - * Note that you can do all this without casting, but type inference is not perfect. - */ -object StyleBuilder { - - @inline def apply[Theme, Props <: js.Object]: StyleBuilder[Theme, Props] = - new StyleBuilder[Theme, Props](_ => StringDictionary.empty) -} - -@inline final class StyleBuilder[T, P] private (val f: StyleRulesCallback[T, P, String]) extends AnyVal { - - @inline def add(key: String, value: CSSProperties): StyleBuilder[T, P] = - new StyleBuilder[T, P]({ theme => - val ret = f(theme) - ret.update(key, value) - ret - }) - - @inline def add(key: String, withTheme: T => CSSProperties): StyleBuilder[T, P] = - new StyleBuilder[T, P]({ theme => - val ret = this.f(theme) - ret.update(key, withTheme(theme)) - ret - }) - - @inline def add(key: String, withThemeProps: (T, P) => CSSProperties): StyleBuilder[T, P] = - new StyleBuilder[T, P]({ theme => - val ret: StyleRules[P, String] = this.f(theme) - val x: js.Function1[P, CSSProperties] = (props: P) => withThemeProps(theme, props) - ret.update(key, x) - ret - }) - - @inline def hook: StylesHook[Styles[T, P, String]] = - makeStyles[Styles[T, P, String]](f) - - @inline def hook(opts: WithStylesOptions): StylesHook[Styles[T, P, String]] = - makeStyles[Styles[T, P, String]](f, opts) -} diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/facades/reactrouterdom/NavLink.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/facades/reactrouterdom/NavLink.scala index 1f527eb..477f8e4 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/facades/reactrouterdom/NavLink.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/facades/reactrouterdom/NavLink.scala @@ -1,12 +1,12 @@ package net.wiringbits.webapp.utils.slinkyUtils.facades.reactrouterdom +import com.olvind.mui.react.mod.CSSProperties import slinky.core.facade.ReactElement import slinky.core.{ExternalComponentWithAttributes, TagMod} import slinky.web.html.a import scala.scalajs.js import scala.scalajs.js.annotation.JSImport -import scala.scalajs.js.| @JSImport("react-router-dom", "NavLink") @js.native @@ -15,17 +15,17 @@ private object NavLinkComponent extends js.Object object NavLink extends ExternalComponentWithAttributes[a.tag.type] { case class Props( to: String, - activeClassName: js.UndefOr[String] = js.undefined, - exact: Boolean = false, + activeStyle: js.UndefOr[CSSProperties] = js.undefined, + exact: Boolean, children: ReactElement ) override val component: String | js.Object = NavLinkComponent def apply(mods: TagMod[a.tag.type]*)( to: String, - activeClassName: js.UndefOr[String] = js.undefined, + activeStyle: js.UndefOr[CSSProperties] = js.undefined, exact: Boolean = false )(children: ReactElement): ReactElement = { - apply(Props(to = to, activeClassName = activeClassName, exact = exact, children = children))(mods: _*) + apply(Props(to = to, activeStyle = activeStyle, exact = exact, children = children))(mods: _*) } } diff --git a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/forms/StatefulFormData.scala b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/forms/StatefulFormData.scala index 52ef1f4..0680c60 100644 --- a/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/forms/StatefulFormData.scala +++ b/slinky-utils/src/main/scala/net/wiringbits/webapp/utils/slinkyUtils/forms/StatefulFormData.scala @@ -1,7 +1,7 @@ package net.wiringbits.webapp.utils.slinkyUtils.forms case class StatefulFormData[D <: FormData[_]](data: D, state: StatefulFormData.State = StatefulFormData.State.Filling) { - import StatefulFormData._ + import StatefulFormData.* def firstValidationError: Option[String] = { state.submissionError.orElse(data.formValidationErrors.headOption) diff --git a/slinky-utils/yarn.lock b/slinky-utils/yarn.lock index 199caf1..362be2b 100644 --- a/slinky-utils/yarn.lock +++ b/slinky-utils/yarn.lock @@ -2,104 +2,283 @@ # yarn lockfile v1 -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.8.3": +"@babel/code-frame@^7.0.0": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/helper-module-imports@^7.16.7": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1": version "7.16.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== dependencies: regenerator-runtime "^0.13.4" -"@emotion/hash@^0.7.1": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831" - integrity sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A== - -"@material-ui/core@3.9.4": - version "3.9.4" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-3.9.4.tgz#5297fd4ad9e739a87da4a6d34fc4af5396886e13" - integrity sha512-r8QFLSexcYZbnqy/Hn4v8xzmAJV41yaodUVjmbGLi1iGDLG3+W941hEtEiBmxTRRqv2BdK3r4ijILcqKmDv/Sw== - dependencies: - "@babel/runtime" "^7.2.0" - "@material-ui/system" "^3.0.0-alpha.0" - "@material-ui/utils" "^3.0.0-alpha.2" - "@types/jss" "^9.5.6" - "@types/react-transition-group" "^2.0.8" - brcast "^3.0.1" - classnames "^2.2.5" - csstype "^2.5.2" - debounce "^1.1.0" - deepmerge "^3.0.0" - dom-helpers "^3.2.1" - hoist-non-react-statics "^3.2.1" - is-plain-object "^2.0.4" - jss "^9.8.7" - jss-camel-case "^6.0.0" - jss-default-unit "^8.0.2" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-vendor-prefixer "^7.0.0" - normalize-scroll-left "^0.1.2" - popper.js "^1.14.1" - prop-types "^15.6.0" - react-event-listener "^0.6.2" - react-transition-group "^2.2.1" - recompose "0.28.0 - 0.30.0" - warning "^4.0.1" - -"@material-ui/icons@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-3.0.2.tgz#d67a6dd1ec8312d3a88ec97944a63daeef24fe10" - integrity sha512-QY/3gJnObZQ3O/e6WjH+0ah2M3MOgLOzCy8HTUoUx9B6dDrS18vP7Ycw3qrDEKlB6q1KNxy6CZHm5FCauWGy2g== - dependencies: - "@babel/runtime" "^7.2.0" - recompose "0.28.0 - 0.30.0" - -"@material-ui/styles@3.0.0-alpha.10": - version "3.0.0-alpha.10" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-3.0.0-alpha.10.tgz#4c28a6d6dacb1fb71aff4642f92b63232a3f298d" - integrity sha512-qJ5eiupBPRCNlMCDZ2G5h8auBtBtm8uT/oCUAJ/FqhO5oC7POLmmvDN1Cq1cgAmqQnaL6uN5mAM1Gc90GpKr9A== - dependencies: - "@babel/runtime" "^7.2.0" - "@emotion/hash" "^0.7.1" - "@material-ui/utils" "^3.0.0-alpha.2" - classnames "^2.2.5" - deepmerge "^3.0.0" - hoist-non-react-statics "^3.2.1" - jss "^10.0.0-alpha.7" - jss-plugin-camel-case "^10.0.0-alpha.7" - jss-plugin-default-unit "^10.0.0-alpha.7" - jss-plugin-global "^10.0.0-alpha.7" - jss-plugin-nested "^10.0.0-alpha.7" - jss-plugin-props-sort "^10.0.0-alpha.7" - jss-plugin-rule-value-function "^10.0.0-alpha.7" - jss-plugin-vendor-prefixer "^10.0.0-alpha.7" - prop-types "^15.6.0" - warning "^4.0.1" - -"@material-ui/system@^3.0.0-alpha.0": - version "3.0.0-alpha.2" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-3.0.0-alpha.2.tgz#096e80c8bb0f70aea435b9e38ea7749ee77b4e46" - integrity sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA== - dependencies: - "@babel/runtime" "^7.2.0" - deepmerge "^3.0.0" - prop-types "^15.6.0" - warning "^4.0.1" - -"@material-ui/utils@^3.0.0-alpha.2": - version "3.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz#836c62ea46f5ffc6f0b5ea05ab814704a86908b1" - integrity sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng== - dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - react-is "^16.6.3" - -"@types/classnames@2.2.10": - version "2.2.10" - resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.10.tgz#cc658ca319b6355399efc1f5b9e818f1a24bf999" - integrity sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/types@^7.22.5": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" + integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@emotion/babel-plugin@^11.10.6": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" + 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" + +"@emotion/cache@^11.10.5", "@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff" + 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" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@11.10.6": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11" + integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/cache" "^11.10.5" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.1", "@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51" + 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" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@11.10.6": + version "11.10.6" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.6.tgz#d886afdc51ef4d66c787ebde848f3cc8b117ebba" + integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.6" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.0", "@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.0", "@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@mui/base@5.0.0-alpha.124": + version "5.0.0-alpha.124" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.124.tgz#164068642e41ba655fd2b9eaf881526909a41201" + integrity sha512-I6M+FrjRCybQCr8I8JTu6L2MkUobSQFgNIpOJyDNKL5zq/73LvZIQXvsKumAzthVGvI1PYaarM9vGDrDYbumKA== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/is-prop-valid" "^1.2.0" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.13" + "@popperjs/core" "^2.11.7" + clsx "^1.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/core-downloads-tracker@^5.11.16": + version "5.14.7" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.7.tgz#95bed2487bf59632125a13b8eb8f4c21e460afec" + integrity sha512-sCWTUNElBPgB30iLvWe3PU7SIlTKZNf6/E/sko85iHVeHCM6WPkDw+y89CrZYjhFNmPqt2fIQM/pZu+rP2lFLA== + +"@mui/icons-material@5.11.16": + version "5.11.16" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-5.11.16.tgz#417fa773c56672e39d6ccfed9ac55591985f0d38" + integrity sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A== + dependencies: + "@babel/runtime" "^7.21.0" + +"@mui/joy@5.0.0-alpha.74": + version "5.0.0-alpha.74" + resolved "https://registry.yarnpkg.com/@mui/joy/-/joy-5.0.0-alpha.74.tgz#dc722067e4895732d85e57eb931a1d9569f7bc99" + integrity sha512-qtrkVZ7fz6qL+m2KI/ULwHpMSdagB8xlbMRLtWNSno4KTLNuixlYkk1eGzMrTQVPCBhm69l4gprWa3OEPElcEg== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/base" "5.0.0-alpha.124" + "@mui/core-downloads-tracker" "^5.11.16" + "@mui/system" "^5.11.16" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.13" + clsx "^1.2.1" + csstype "^3.1.2" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/material@5.11.16": + version "5.11.16" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.11.16.tgz#958cb7bcfa71d889c2585516f012ab3363af843c" + integrity sha512-++glQqbZ3rMzOWB77yOvqRG+k8+scYTUKVWZpWff+GWsf6L10g9L2wgRhhAS8bDLuxCbXZlPNbSZowXDDw6z6Q== + dependencies: + "@babel/runtime" "^7.21.0" + "@mui/base" "5.0.0-alpha.124" + "@mui/core-downloads-tracker" "^5.11.16" + "@mui/system" "^5.11.16" + "@mui/types" "^7.2.3" + "@mui/utils" "^5.11.13" + "@types/react-transition-group" "^4.4.5" + 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@^5.14.7": + version "5.14.7" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.7.tgz#c9fec31e59bf66b12959e724b0e8ec3bb4a3d923" + integrity sha512-Y86+hmDnJab2Ka42PgxKpK3oL7EiacbeeX3X/lG9LGO0wSc45wZjHeTfIlVSkkUCkexiMKEJp5NlSjZhr27NRQ== + dependencies: + "@babel/runtime" "^7.22.10" + "@mui/utils" "^5.14.7" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.14.7": + version "5.14.7" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.7.tgz#aaacec6c87bcc9a180b2da062c613213af10f2e3" + integrity sha512-hKBETEDsIAkL8/mBwPiQj/vw28OeIhMXC3Tvj4J2bb9snxAKpiZioR1PwqP+6P41twsC/GKBd0Vr9oaWYaHuMg== + dependencies: + "@babel/runtime" "^7.22.10" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/system@^5.11.16": + version "5.14.7" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.7.tgz#b08e23f9151d38186ab12dd618906abd4d73d203" + integrity sha512-jeZtHglc+Pi6qjGoopT6O4RqYXVBMqHVOsjMGP0hxGSSPm1T4gsAu7jU8eqGx9YwwjvvJ0eotTjFqw7iJ6qE2Q== + dependencies: + "@babel/runtime" "^7.22.10" + "@mui/private-theming" "^5.14.7" + "@mui/styled-engine" "^5.14.7" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.7" + clsx "^2.0.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/types@^7.2.3", "@mui/types@^7.2.4": + version "7.2.4" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== + +"@mui/utils@^5.11.13", "@mui/utils@^5.14.7": + version "5.14.7" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.7.tgz#3677bcabe032f1185e151f57d8c1a166df3ae0a1" + integrity sha512-RtheP/aBoPogVdi8vj8Vo2IFnRa4mZVmnD0RGlVZ49yF60rZs+xP4/KbpIrTr83xVs34QmHQ2aQ+IX7I0a0dDw== + dependencies: + "@babel/runtime" "^7.22.10" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^18.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@popperjs/core@^2.11.7": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@types/glob@^7.1.1": version "7.2.0" @@ -109,19 +288,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/history@*": - version "4.7.9" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" - integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== - -"@types/jss@^9.5.6": - version "9.5.8" - resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.8.tgz#258391f42211c042fc965508d505cbdc579baa5b" - integrity sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA== - dependencies: - csstype "^2.0.0" - indefinite-observable "^1.0.1" - "@types/minimatch@*": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" @@ -132,40 +298,39 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.10.tgz#2e3ad0a680d96367103d3e670d41c2fed3da61ae" integrity sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prop-types@*": version "15.7.4" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== -"@types/react-router-dom@5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.2.tgz#853f229f1f297513c0be84f7c914a08b778cfdf5" - integrity sha512-kRx8hoBflE4Dp7uus+j/0uMHR5uGTAvQtc4A3vOTWKS+epe0leCuxEx7HNT7XGUd1lH53/moWM51MV2YUyhzAg== - dependencies: - "@types/history" "*" - "@types/react" "*" - "@types/react-router" "*" +"@types/prop-types@^15.7.5": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== -"@types/react-router@*": - version "5.1.17" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.17.tgz#087091006213b11042f39570e5cd414863693968" - integrity sha512-RNSXOyb3VyRs/EOGmjBhhGKTbnN6fHWvy5FNLzWfOWOGjgVUKqJZXfpKzLmgoU8h6Hj8mpALj/mbXQASOb92wQ== +"@types/react-dom@18.0.11": + version "18.0.11" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33" + integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw== dependencies: - "@types/history" "*" "@types/react" "*" -"@types/react-router@5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.2.tgz#41e5e6aa333a7b9a2bfdac753c04e1ca4b3e0d21" - integrity sha512-euC3SiwDg3NcjFdNmFL8uVuAFTpZJm0WMFUw+4eXMUnxa7M9RGFEG0szt0z+/Zgk4G2k9JBFhaEnY64RBiFmuw== +"@types/react-is@^18.2.1": + version "18.2.1" + resolved "https://registry.yarnpkg.com/@types/react-is/-/react-is-18.2.1.tgz#61d01c2a6fc089a53520c0b66996d458fdc46863" + integrity sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw== dependencies: - "@types/history" "*" "@types/react" "*" -"@types/react-transition-group@^2.0.8": - version "2.9.2" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.9.2.tgz#c48cf2a11977c8b4ff539a1c91d259eaa627028d" - integrity sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA== +"@types/react-transition-group@^4.4.5": + version "4.4.6" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== dependencies: "@types/react" "*" @@ -178,6 +343,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@18.0.33": + version "18.0.33" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.33.tgz#a1575160cb4376787c2f5fe0312302f824baa61e" + integrity sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -467,11 +641,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -512,6 +681,15 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -641,11 +819,6 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" -brcast@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.2.tgz#55c41a7a077ff4e7ac784c2060e544d4c39ad477" - integrity sha512-f5XwwFCCuvgqP2nMH/hJ74FqnGmb4X3D+NC//HphxJzzhsZvSZa+Hk/syB7j3ZHpPDLMoYU8oBgviRWfNvEfKA== - brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -795,12 +968,17 @@ call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -chalk@^2.4.1: +chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -809,11 +987,6 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" - integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= - chokidar@^2.1.6, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -876,11 +1049,6 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -890,6 +1058,16 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +clsx@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" @@ -999,6 +1177,11 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== +convert-source-map@^1.5.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -1026,16 +1209,22 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" + 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" + create-ecdh@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" @@ -1095,41 +1284,26 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-vendor@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-0.3.8.tgz#6421cfd3034ce664fe7673972fd0119fc28941fa" - integrity sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo= - dependencies: - is-in-browser "^1.0.2" - -css-vendor@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" - integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== - dependencies: - "@babel/runtime" "^7.8.3" - is-in-browser "^1.0.2" - -csstype@^2.0.0, csstype@^2.5.2: - version "2.6.19" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" - integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== +csstype@2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" + integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== csstype@^3.0.2: version "3.0.10" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== +csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -debounce@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1173,11 +1347,6 @@ deep-equal@^1.0.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deepmerge@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -1285,12 +1454,13 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -dom-helpers@^3.2.1, dom-helpers@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" - integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: - "@babel/runtime" "^7.1.2" + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" domain-browser@^1.1.1: version "1.2.0" @@ -1340,13 +1510,6 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1370,6 +1533,13 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -1380,6 +1550,11 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-scope@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -1557,19 +1732,6 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" -fbjs@^0.8.1: - version "0.8.18" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.18.tgz#9835e0addb9aca2eff53295cd79ca1cfc7c9662a" - integrity sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA== - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -1619,6 +1781,11 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -1899,12 +2066,7 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.3.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.1: +hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -1999,11 +2161,6 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -2011,13 +2168,6 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -2028,6 +2178,14 @@ iferr@^0.1.5: resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -2041,13 +2199,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indefinite-observable@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-1.0.2.tgz#0a328793ab2385d4b9dca23eaab4afe6936a73f8" - integrity sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA== - dependencies: - symbol-observable "1.2.0" - infer-owner@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -2136,6 +2287,11 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -2155,6 +2311,13 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -2237,11 +2400,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -2288,7 +2446,7 @@ is-regex@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-stream@^1.0.1, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -2330,15 +2488,7 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -2348,6 +2498,11 @@ json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -2370,121 +2525,6 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -jss-camel-case@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jss-camel-case/-/jss-camel-case-6.1.0.tgz#ccb1ff8d6c701c02a1fed6fb6fb6b7896e11ce44" - integrity sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ== - dependencies: - hyphenate-style-name "^1.0.2" - -jss-default-unit@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/jss-default-unit/-/jss-default-unit-8.0.2.tgz#cc1e889bae4c0b9419327b314ab1c8e2826890e6" - integrity sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg== - -jss-global@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jss-global/-/jss-global-3.0.0.tgz#e19e5c91ab2b96353c227e30aa2cbd938cdaafa2" - integrity sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q== - -jss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jss-nested/-/jss-nested-6.0.1.tgz#ef992b79d6e8f63d939c4397b9d99b5cbbe824ca" - integrity sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA== - dependencies: - warning "^3.0.0" - -jss-plugin-camel-case@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz#8d7f915c8115afaff8cbde08faf610ec9892fba6" - integrity sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA== - dependencies: - "@babel/runtime" "^7.3.1" - hyphenate-style-name "^1.0.3" - jss "10.8.2" - -jss-plugin-default-unit@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz#c66f12e02e0815d911b85c02c2a979ee7b4ce69a" - integrity sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-global@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz#1a35632a693cf50113bcc5ffe6b51969df79c4ec" - integrity sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-nested@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz#79f3c7f75ea6a36ae72fe52e777035bb24d230c7" - integrity sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - tiny-warning "^1.0.2" - -jss-plugin-props-sort@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz#e25a7471868652c394562b6dc5433dcaea7dff6f" - integrity sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-rule-value-function@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz#55354b55f1b2968a15976729968f767f02d64049" - integrity sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - tiny-warning "^1.0.2" - -jss-plugin-vendor-prefixer@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz#ebb4a482642f34091e454901e21176441dd5f475" - integrity sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg== - dependencies: - "@babel/runtime" "^7.3.1" - css-vendor "^2.0.8" - jss "10.8.2" - -jss-props-sort@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/jss-props-sort/-/jss-props-sort-6.0.0.tgz#9105101a3b5071fab61e2d85ea74cc22e9b16323" - integrity sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g== - -jss-vendor-prefixer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz#0166729650015ef19d9f02437c73667231605c71" - integrity sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA== - dependencies: - css-vendor "^0.3.8" - -jss@10.8.2, jss@^10.0.0-alpha.7: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.2.tgz#4b2a30b094b924629a64928236017a52c7c97505" - integrity sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ== - dependencies: - "@babel/runtime" "^7.3.1" - csstype "^3.0.2" - is-in-browser "^1.1.3" - tiny-warning "^1.0.2" - -jss@^9.8.7: - version "9.8.7" - resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.7.tgz#ed9763fc0f2f0260fc8260dac657af61e622ce05" - integrity sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ== - dependencies: - is-in-browser "^1.1.3" - symbol-observable "^1.1.0" - warning "^3.0.0" - killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -2521,6 +2561,11 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + loader-runner@^2.3.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -2553,7 +2598,7 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash@^4.17.11, lodash@^4.17.14: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.6.1: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2563,7 +2608,7 @@ loglevel@^1.6.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== -loose-envify@^1.0.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -2855,14 +2900,6 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -2909,11 +2946,6 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-scroll-left@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz#6b79691ba79eb5fb107fa5edfbdc06b55caee2aa" - integrity sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg== - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -2926,7 +2958,7 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -3072,6 +3104,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" @@ -3083,6 +3122,16 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -3128,6 +3177,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -3140,6 +3194,11 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -3185,11 +3244,6 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" -popper.js@^1.14.1: - version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" - integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== - portfinder@^1.0.20: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -3219,14 +3273,7 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@^15.6.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -3235,6 +3282,15 @@ prop-types@^15.6.0, prop-types@^15.6.2: object-assign "^4.1.1" react-is "^16.8.1" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -3350,24 +3406,36 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -react-event-listener@^0.6.2: - version "0.6.6" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" - integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== +react-deep-force-update@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" + integrity sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA== + +react-dom@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - warning "^4.0.1" + loose-envify "^1.1.0" + scheduler "^0.23.0" -react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-proxy@1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" + integrity sha512-46GkBpZD97R/vV+iw+u6aFACzIHOst9gCl41d5K5vepPBz2i2gqHmXQJWKXsrUsSOdylKahN3sd9taswFN8Wzw== + dependencies: + lodash "^4.6.1" + react-deep-force-update "^1.0.0" react-router-dom@5.1.2: version "5.1.2" @@ -3398,15 +3466,22 @@ react-router@5.1.2: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-transition-group@^2.2.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" - integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== dependencies: - dom-helpers "^3.4.0" + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" loose-envify "^1.4.0" prop-types "^15.6.2" - react-lifecycles-compat "^3.0.4" + +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" @@ -3446,23 +3521,16 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -"recompose@0.28.0 - 0.30.0": - version "0.30.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" - integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== - dependencies: - "@babel/runtime" "^7.0.0" - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - react-lifecycles-compat "^3.0.2" - symbol-observable "^1.0.4" - regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -3529,6 +3597,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-pathname@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" @@ -3539,6 +3612,15 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@^1.19.0: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -3583,11 +3665,18 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -3683,7 +3772,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -3811,10 +3900,10 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== -source-map@^0.5.6: +source-map@^0.5.6, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" @@ -3953,6 +4042,11 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -3967,10 +4061,10 @@ supports-color@^6.1.0: dependencies: has-flag "^3.0.0" -symbol-observable@1.2.0, symbol-observable@^1.0.4, symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tapable@^1.0.0, tapable@^1.1.0: version "1.1.3" @@ -4026,7 +4120,7 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== -tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3: +tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -4036,6 +4130,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -4096,11 +4195,6 @@ typescript@3.9.3: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -4225,20 +4319,6 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w= - dependencies: - loose-envify "^1.0.0" - -warning@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" @@ -4388,11 +4468,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-fetch@>=0.10.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -4440,6 +4515,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"