From e5c3802e92bb2466b7d54aa1c9a7ddd7a88bcb33 Mon Sep 17 00:00:00 2001 From: Rohan Sircar Date: Tue, 29 Dec 2020 12:27:37 +0530 Subject: [PATCH] Many changes Added odin logger Used macwire and tagging for DI JS libs now embedded with webpack instead of server from CDN Refactored the application into components and pages Added Chartjs and Fusejs demo with scalablytyped typings --- assets/app/index.html | 7 - build.sbt | 44 ++- src/main/scala/outwatchapp/AppTypes.scala | 12 + src/main/scala/outwatchapp/MainApp.scala | 50 +++ src/main/scala/outwatchapp/OutwatchApp.scala | 304 ++---------------- src/main/scala/outwatchapp/Page.scala | 9 + src/main/scala/outwatchapp/Router.scala | 117 +++++++ .../outwatchapp/components/CounterDemo.scala | 22 ++ .../outwatchapp/components/RequestDemo.scala | 113 +++++++ .../outwatchapp/components/todo/Chartjs.scala | 151 +++++++++ .../components/todo/ChartjsDemo.scala | 111 +++++++ .../outwatchapp/components/todo/Fusejs.scala | 19 ++ .../components/todo/TodoListStore.scala | 4 + .../scala/outwatchapp/pages/HomePage.scala | 41 +++ .../util/reactive/store/Store.scala | 20 +- webpack.config.dev.js | 65 ++-- yarn.lock | 268 ++++++++++++++- 17 files changed, 1023 insertions(+), 334 deletions(-) create mode 100644 src/main/scala/outwatchapp/AppTypes.scala create mode 100644 src/main/scala/outwatchapp/MainApp.scala create mode 100644 src/main/scala/outwatchapp/Page.scala create mode 100644 src/main/scala/outwatchapp/Router.scala create mode 100644 src/main/scala/outwatchapp/components/CounterDemo.scala create mode 100644 src/main/scala/outwatchapp/components/RequestDemo.scala create mode 100644 src/main/scala/outwatchapp/components/todo/Chartjs.scala create mode 100644 src/main/scala/outwatchapp/components/todo/ChartjsDemo.scala create mode 100644 src/main/scala/outwatchapp/components/todo/Fusejs.scala create mode 100644 src/main/scala/outwatchapp/pages/HomePage.scala diff --git a/assets/app/index.html b/assets/app/index.html index 2ac9b89..396b535 100644 --- a/assets/app/index.html +++ b/assets/app/index.html @@ -5,15 +5,8 @@ Outwatch App - - - - - - - diff --git a/build.sbt b/build.sbt index b348fb9..517c9f9 100644 --- a/build.sbt +++ b/build.sbt @@ -24,33 +24,43 @@ libraryDependencies ++= Seq( "com.softwaremill.sttp.client" %%% "circe" % "2.2.5", // "com.softwaremill.sttp.client" %%% "async-http-client-backend-monix" % "2.2.5", // "com.softwaremill.sttp.client3" %%% "httpclient-backend-monix" % "2.2.5", - // "com.softwaremill.macwire" %%% "util" % "2.3.7", + // "com.softwaremill.macwire" %% "util" % "2.3.7" % "provided", + "com.softwaremill.common" %%% "tagging" % "2.2.1", "com.softwaremill.macwire" %% "macros" % "2.3.7" % "provided", // "com.softwaremill.macwire" %%% "macrosakka" % "2.3.6" % "provided", "com.softwaremill.quicklens" %%% "quicklens" % "1.6.1", // "com.typesafe.scala-logging" %%% "scala-logging" % "3.9.2", // "io.circe" %%% "circe-config" % "0.8.0", "org.akka-js" %%% "shocon" % "1.0.0", - "com.beachape" %%% "enumeratum-circe" % "1.6.1" + "com.beachape" %%% "enumeratum-circe" % "1.6.1", + "com.github.valskalla" %%% "odin-core" % "0.7.0+95-ab4381ae+20201227-1831-SNAPSHOT" // "com.clovellytech" %%% "outwatch-router" % "0.0.9+7-5be0b1a2+20201227-2019-SNAPSHOT" ) Compile / npmDependencies ++= Seq( - // "jquery" -> "1.9.1", - // "popper.js" -> "1.16.1", + "jquery" -> "3.3.1", + "popper.js" -> "1.16.1", // // "@popperjs/core" -> "2.6.0", - // "blk-design-system" -> "1.0.2", - // "bootstrap" -> "4.5.3" - "snabbdom" -> "git://github.com/outwatch/snabbdom.git#semver:0.7.5" + "blk-design-system" -> "1.0.2", + "bootstrap" -> "4.5.3", + "@types/chart.js" -> "2.9.11", + "chart.js" -> "2.9.3", + "snabbdom" -> "git://github.com/outwatch/snabbdom.git#semver:0.7.5", + "fuse.js" -> "6.4.3" ) -// Compile / npmDevDependencies ++= Seq( -// "css-loader" -> "5.0.1", -// "style-loader" -> "2.0.0" -// ) +Compile / npmDevDependencies ++= Seq( + "css-loader" -> "5.0.1", + "style-loader" -> "2.0.0", + "webpack-merge" -> "4.1", + "file-loader" -> "3.0.1", + "url-loader" -> "1.1.2" +) -// stIgnore ++= List("jquery", "blk-design-system", "bootstrap") +stIgnore ++= List("jquery", "blk-design-system", "bootstrap") stIgnore ++= List("snabbdom") +stStdlib := List("es6") +stUseScalaJsDom := false enablePlugins(ScalaJSBundlerPlugin) enablePlugins(ScalablyTypedConverterPlugin) @@ -59,7 +69,11 @@ requireJsDomEnv in Test := true scalaJSUseMainModuleInitializer := true // configure Scala.js to emit a JavaScript module instead of a top-level script -scalaJSLinkerConfig ~= (_.withModuleKind(ModuleKind.CommonJSModule)) +scalaJSLinkerConfig ~= ( + /*hmm*/ + _.withSourceMap(false) + .withModuleKind(ModuleKind.CommonJSModule) + ) scalacOptions ++= Seq( "-encoding", @@ -113,8 +127,8 @@ copyFastOptJS := { val outDir = (crossTarget in (Compile, fastOptJS)).value / "dev" val files = Seq( name.value.toLowerCase + "-fastopt-loader.js", - name.value.toLowerCase + "-fastopt.js", - name.value.toLowerCase + "-fastopt.js.map" + name.value.toLowerCase + "-fastopt.js" + // name.value.toLowerCase + "-fastopt.js.map" ) map { p => (inDir / p, outDir / p) } IO.copy( files, diff --git a/src/main/scala/outwatchapp/AppTypes.scala b/src/main/scala/outwatchapp/AppTypes.scala new file mode 100644 index 0000000..41043ef --- /dev/null +++ b/src/main/scala/outwatchapp/AppTypes.scala @@ -0,0 +1,12 @@ +package outwatchapp + +import java.nio.ByteBuffer + +import monix.reactive.Observable +import sttp.client.SttpBackend + +object AppTypes { + type Backend = SttpBackend[monix.eval.Task, Observable[ + ByteBuffer + ], sttp.client.NothingT] +} diff --git a/src/main/scala/outwatchapp/MainApp.scala b/src/main/scala/outwatchapp/MainApp.scala new file mode 100644 index 0000000..0d7c6c7 --- /dev/null +++ b/src/main/scala/outwatchapp/MainApp.scala @@ -0,0 +1,50 @@ +package outwatchapp + +import com.softwaremill.macwire._ +import monix.bio.Task +import org.scalajs.dom.raw.Element +import outwatch._ +import outwatch.dsl._ +import outwatch.router._ +import outwatchapp.components.CounterDemo +import outwatchapp.components.RequestDemo +import outwatchapp.components.todo.ChartjsDemo +import outwatchapp.pages.HomePage +import nova.monadic_sfx.ui.components.todo.TodoListStore + +class MainApp(el: Element)(implicit + backend: AppTypes.Backend, + store: RouterStore[Page] +) { + def run: Task[Unit] = for { + resolver <- resolver + _ <- OutWatch.renderInto[Task](el, Router(resolver)) + } yield () + + def resolver: Task[PartialFunction[Page, VDomModifier]] = + Task.deferAction(implicit s => + for { + counterDemo <- CounterDemo() + chartDemo <- ChartjsDemo() + todoStore <- TodoListStore() + requestDemo <- RequestDemo(todoStore) + resolver: PartialFunction[Page, VDomModifier] = { + case Page.Home => wire[HomePage].render + case Page.SomePage => + div( + div(cls := "title", "SomePage"), + // RequestDemo(todoStore), + requestDemo, + div(cls := "slider") + ) + case Page.UserHome(id) => + div(div(cls := "title", "UserHome"), s"User id: $id") + case Page.NotFound => + div( + div(cls := "title", "NotFound"), + p(cls := "profile-description", "notfound") + ) + } + } yield resolver + ) +} diff --git a/src/main/scala/outwatchapp/OutwatchApp.scala b/src/main/scala/outwatchapp/OutwatchApp.scala index 36954cf..61961ef 100644 --- a/src/main/scala/outwatchapp/OutwatchApp.scala +++ b/src/main/scala/outwatchapp/OutwatchApp.scala @@ -1,290 +1,44 @@ package outwatchapp -import scala.concurrent.duration._ - import cats.effect.ExitCode -import cats.implicits._ -import colibri.ext.monix._ import monix.bio._ -import monix.eval.Coeval -import monix.reactive.Observable -import monix.{eval => me} -import nova.monadic_sfx.ui.components.todo.Todo -import nova.monadic_sfx.ui.components.todo.TodoListStore -import outwatch._ -import outwatch.dsl._ -import outwatch.reactive.handlers.monix._ -import outwatch.router.AppRouter -import outwatch.router.dsl._ -import outwatchapp.implicits._ -import sttp.client._ +import org.scalajs.dom.raw.Element import sttp.client.impl.monix.FetchMonixBackend +import org.scalajs.dom.document +import scala.scalajs.js.annotation.JSImport +import scalajs.js + +@JSImport("bootstrap/dist/css/bootstrap.min.css", JSImport.Namespace) +@js.native +object BootstrapBundleCss extends js.Object +@JSImport("bootstrap", JSImport.Namespace) +@js.native +object BootstrapBundleJs extends js.Object + +@JSImport( + "blk-design-system/assets/css/blk-design-system.min.css", + JSImport.Namespace +) +@js.native +object BlkDesignSys extends js.Object object OutwatchApp extends BIOApp { - val counter2 = Observable.interval(1.second) - val counter = div( - "Hmm", - button( - onClick - .useScan(0)(_ + 1) - .handled(source => VDomModifier("Counter: ", source)) - ) - ) - - implicit val backend = FetchMonixBackend() - - val handlerTask = Handler.createF[Task, String]("empty") - - def request(query: String) = basicRequest - .get( - uri"https://jsonplaceholder.typicode.com/todos/${query.toIntOption.getOrElse(0)}" - ) - .send() - .flatMap { - _.body match { - case Right(value) => - me.Task(println(value)) >> - me.Task(value) - case Left(error) => - me.Task(println(error)) >> - me.Task(error) - - } - } - val component = Task.deferAction(implicit s => - for { - handler <- handlerTask - todoContent <- Handler.createF[Task, String] - todoStore <- TodoListStore() - res <- Task( - div( - // cls := "col-lg-8 bd-example", - div(cls := "alert alert-danger", "Some Error Occured!"), - div( - form( - h4(cls := "form-title", "User Finder"), - div( - cls := "form-group", - label( - color := "hsla(0,0%,100%,0.8)", - forId := "httpInput", - "Enter an id: " - ), - input( - idAttr := "httpInput", - typ := "text", - cls := "form-control", - placeholder := "0", - onInput.value --> handler - ), - label( - color := "hsla(0,0%,100%,0.8)", - "Enter content for todo" - ), - small(cls := "form-text text-muted", "default is 0") - ), - div( - cls := "form-group", - input( - cls := "form-control", - onInput.value --> todoContent - ), - button( - cls := "btn", - cls := "btn-info form-control", - "Add Todo", - onClick.preventDefault( - todoContent.map(TodoListStore.Add) - ) --> todoStore.sink - ) - ) - ) - ), - div( - p( - cls := "profile-description", - handler - .doOnNext(str => me.Task(println(str))) - .mapEval(request) - .map(div(_)), - div( - "Todos: ", - todoStore.doOnNextF { case (a, s) => Coeval(println(s)) }.map { - case (a, s) => div(renderTodos(s.todos)) - } - ) - ) - ) - ) - ) - } yield res - ) - - def renderTodos(todos: Seq[Todo]) = div( - ul( - todos.map(todo => li(div(s"id: ${todo.id} content: ${todo.content}"))) - ) - ) - - sealed trait Page - case object Home extends Page - case object SomePage extends Page - case class UserHome(id: Int) extends Page - case object NotFound extends Page - - val router = AppRouter.create[Task, Page](NotFound) { - case Root => Home - case Root / "user" / IntVar(id) => UserHome(id) - case Root / "some-page" => SomePage - } - val counterComponent = - Task.deferAction(implicit s => - Task(div(p(cls := "profile-description", "count: ", counter2))) - ) - - def resolver: PartialFunction[Page, VDomModifier] = { - case Home => - div( - div(cls := "title", "Home"), - div( - cls := "card", - div( - cls := "card-body", - counterComponent, - p( - cls := "profile-description", - div( - "hm", - htmlTag("blockQuote")( - cls := "blockquote", - p( - cls := "mb-0", - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante." - ), - footer( - cls := "blockquote-footer", - "Someone famous in ", - cite(title := "Source Title", "Source Title") - ) - ) - ) - ) - ) - ) - ) - case SomePage => - div(div(cls := "title", "SomePage"), component, div(cls := "slider")) - case UserHome(id) => div(div(cls := "title", "UserHome"), s"User id: $id") - case NotFound => - div( - div(cls := "title", "NotFound"), - p(cls := "profile-description", "notfound") - ) - } + val router = Router.router + def app(el: Element) = for { + store <- router.store + backend = FetchMonixBackend() + } yield new MainApp(el)(backend, store) def run(args: List[String]): UIO[ExitCode] = { -// div(h1("Hello World"), counterComponent, Task(1)) - import org.scalajs.dom.document - val el = - document.createElement("div") + BootstrapBundleCss + BootstrapBundleJs + BlkDesignSys + val el = document.createElement("div") el.setAttribute("id", "#app") document.body.appendChild(el) - router.store - .flatMap(implicit store => - OutWatch - .renderInto( - el, - div( - htmlTag("nav")( - cls := "navbar navbar-expand-lg bg-primary ", - attr("color-on-scroll") := "100", - div( - cls := "container", - div( - cls := "navbar-translate", - a( - cls := "navbar-brand", - href := "https://demos.creative-tim.com/blk-design-system/index.html", - rel := "tooltip", - title := "", - attr("data-placement") := "bottom", - target := "_blank", - div("OutwatchApp") - ), - button( - cls := "navbar-toggler navbar-toggler toggled collapsed", - attr("data-toggle") := "collapse", - attr("data-target") := "#navigation", - attr("aria-controls") := "navigation-index", - attr("aria-expanded") := "false", - attr("aria-label") := "Toggle navigation", - div(cls := "navbar-toggler-bar bar1"), - div(cls := "navbar-toggler-bar bar2"), - div(cls := "navbar-toggler-bar bar3") - ) - ), - div( - cls := "navbar-collapse justify-content-end collapse", - idAttr := "navigation", - div( - cls := "navbar-collapse-header", - div( - cls := "row", - div( - cls := "col-6 collapse-brand", - a("BLK•") - ), - div( - cls := "col-6 collapse-close text-right", - button( - `type` := "button", - cls := "navbar-toggler collapsed", - attr("data-toggle") := "collapse", - attr("data-target") := "#navigation", - attr("aria-controls") := "navigation-index", - attr("aria-expanded") := "false", - attr("aria-label") := "Toggle navigation", - i(cls := "tim-icons icon-simple-remove") - ) - ) - ) - ), - ul( - cls := "navbar-nav", - li( - cls := "nav-item active", - router.link("/")( - cls := "nav-link", - "Home", - div(cls := "sr-only", "(current)") - ) - ), - li( - cls := "nav-item", - router - .link("/some-page")(cls := "nav-link", "SomePage") - ), - li( - cls := "nav-item", - router.link("/user/1")(cls := "nav-link", "User Home") - ), - li( - cls := "nav-item", - router.link("/todomvc")(cls := "nav-link", "TodoMvc") - ) - ) - ) - ) - ), - div( - cls := "container", - router.render(resolver), - router.watch() - ) - ) - ) - ) + app(el) + .flatMap(_.run) .onErrorHandle(ex => UIO(ex.printStackTrace())) .as(ExitCode.Success) } diff --git a/src/main/scala/outwatchapp/Page.scala b/src/main/scala/outwatchapp/Page.scala new file mode 100644 index 0000000..cfb6bab --- /dev/null +++ b/src/main/scala/outwatchapp/Page.scala @@ -0,0 +1,9 @@ +package outwatchapp + +sealed trait Page +object Page { + case object Home extends Page + case object SomePage extends Page + case class UserHome(id: Int) extends Page + case object NotFound extends Page +} diff --git a/src/main/scala/outwatchapp/Router.scala b/src/main/scala/outwatchapp/Router.scala new file mode 100644 index 0000000..9a6cab5 --- /dev/null +++ b/src/main/scala/outwatchapp/Router.scala @@ -0,0 +1,117 @@ +package outwatchapp +import colibri.ext.monix._ +import monix.bio.Task +import monix.eval.Coeval +import outwatch._ +import outwatch.dsl._ +import outwatch.router.AppRouter +import outwatch.router._ +import outwatch.router.dsl._ +import outwatchapp.components.todo.FusejsDemo + +import Page._ + +object Router { + val router = AppRouter.create[Task, Page](NotFound) { + case Root => Home + case Root / "user" / IntVar(id) => UserHome(id) + case Root / "some-page" => SomePage + } + + def apply(resolver: PartialFunction[Page, VDomModifier])(implicit + store: RouterStore[Page] + ) = div( + htmlTag("nav")( + cls := "navbar navbar-expand-lg bg-primary ", + attr("color-on-scroll") := "100", + div( + cls := "container", + div( + cls := "navbar-translate", + a( + cls := "navbar-brand", + href := "https://demos.creative-tim.com/blk-design-system/index.html", + rel := "tooltip", + title := "", + attr("data-placement") := "bottom", + target := "_blank", + div("OutwatchApp") + ), + button( + cls := "navbar-toggler navbar-toggler toggled collapsed", + attr("data-toggle") := "collapse", + attr("data-target") := "#navigation", + attr("aria-controls") := "navigation-index", + attr("aria-expanded") := "false", + attr("aria-label") := "Toggle navigation", + div(cls := "navbar-toggler-bar bar1"), + div(cls := "navbar-toggler-bar bar2"), + div(cls := "navbar-toggler-bar bar3") + ) + ), + div( + cls := "navbar-collapse justify-content-end collapse", + idAttr := "navigation", + div( + cls := "navbar-collapse-header", + div( + cls := "row", + div( + cls := "col-6 collapse-brand", + a("BLK•") + ), + div( + cls := "col-6 collapse-close text-right", + button( + tpe := "button", + cls := "navbar-toggler collapsed", + attr("data-toggle") := "collapse", + attr("data-target") := "#navigation", + attr("aria-controls") := "navigation-index", + attr("aria-expanded") := "false", + attr("aria-label") := "Toggle navigation", + i(cls := "tim-icons icon-simple-remove") + ) + ) + ) + ), + ul( + cls := "navbar-nav", + li( + cls := "nav-item active", + router.link("/")( + cls := "nav-link", + "Home", + div(cls := "sr-only", "(current)") + ) + ), + li( + cls := "nav-item", + router + .link("/some-page")(cls := "nav-link", "SomePage") + ), + li( + cls := "nav-item", + router.link("/user/1")(cls := "nav-link", "User Home") + ), + li( + cls := "nav-item", + router.link("/todomvc")(cls := "nav-link", "TodoMvc") + ) + ) + ) + ) + ), + div( + cls := "container", + Coeval( + println("Result = " + FusejsDemo.y.toString()) + ) >> Coeval( + FusejsDemo.y.foreach(o => println(o.item)) + ) >> Coeval(div()), + router.render(resolver), + router.watch() + ) + ) + +} diff --git a/src/main/scala/outwatchapp/components/CounterDemo.scala b/src/main/scala/outwatchapp/components/CounterDemo.scala new file mode 100644 index 0000000..710a17f --- /dev/null +++ b/src/main/scala/outwatchapp/components/CounterDemo.scala @@ -0,0 +1,22 @@ +package outwatchapp.components + +import scala.concurrent.duration._ + +import colibri.ext.monix._ +import com.softwaremill.tagging._ +import monix.bio._ +import monix.reactive.Observable +import outwatch.HtmlVNode +import outwatch.dsl._ + +sealed trait CounterDemo +object CounterDemo { + val counter2 = Observable.interval(1.second) + def apply(): Task[HtmlVNode @@ CounterDemo] = + Task.deferAction(implicit s => + Task( + div(p(cls := "profile-description", "count: ", counter2)) + .taggedWith[CounterDemo] + ) + ) +} diff --git a/src/main/scala/outwatchapp/components/RequestDemo.scala b/src/main/scala/outwatchapp/components/RequestDemo.scala new file mode 100644 index 0000000..91ec769 --- /dev/null +++ b/src/main/scala/outwatchapp/components/RequestDemo.scala @@ -0,0 +1,113 @@ +package outwatchapp.components + +import colibri.ext.monix._ +import com.softwaremill.tagging._ +import monix.bio._ +import monix.eval.Coeval +import monix.{eval => me} +import nova.monadic_sfx.ui.components.todo.Todo +import nova.monadic_sfx.ui.components.todo.TodoListStore +import outwatch._ +import outwatch.dsl._ +import outwatch.reactive.handlers.monix._ +import outwatchapp.AppTypes +import outwatchapp.implicits._ +import sttp.client._ +import nova.monadic_sfx.util.reactive.store.Store + +sealed trait RequestDemo +object RequestDemo { + def request(query: String)(implicit backend: AppTypes.Backend) = basicRequest + .get( + uri"https://jsonplaceholder.typicode.com/todos/${query.toIntOption.getOrElse(0)}" + ) + .send() + .flatMap { + _.body match { + case Right(value) => + me.Task(println(value)) >> me.Task(value) + case Left(error) => + me.Task(println(error)) >> me.Task(error) + + } + } + def apply(todoStore: Store[TodoListStore.Action, TodoListStore.State])( + implicit backend: AppTypes.Backend + ): Task[HtmlVNode @@ RequestDemo] = + Task.deferAction(implicit s => + for { + requestSub <- Handler.createF[Task, String]("empty") + todoContent <- Handler.createF[Task, String] + } yield div( + // cls := "col-lg-8 bd-example", + div(cls := "alert alert-danger", "Some Error Occured!"), + div( + form( + h4(cls := "form-title", "User Finder"), + div( + cls := "form-group", + label( + color := "hsla(0,0%,100%,0.8)", + forId := "httpInput", + "Enter an id: " + ), + input( + idAttr := "httpInput", + typ := "text", + cls := "form-control", + placeholder := "0", + onInput.value --> requestSub + ), + label( + color := "hsla(0,0%,100%,0.8)", + "Enter content for todo" + ), + small(cls := "form-text text-muted", "default is 0") + ), + div( + cls := "form-group", + input( + cls := "form-control", + onInput.value --> todoContent + ), + button( + cls := "btn", + cls := "btn-info form-control", + "Add Todo", + onClick.preventDefault.foreachSync(_ => + Coeval(println("Clicked")) + ), + onClick( + todoContent + .map(TodoListStore.Add) + ) --> todoStore.sink + ) + ) + ) + ), + div( + p( + cls := "profile-description", + requestSub + .doOnNext(str => me.Task(println(str))) + .mapEval(request) + .map(div(_)), + div( + "Todos: ", + todoStore + .map { case (a, s) => s.todos } + // .doOnNextF { case (a, s) => Coeval(println(s)) } + .distinctUntilChanged + .map(renderTodos) + ) + ) + ) + ).taggedWith[RequestDemo] + ) + + def renderTodos(todos: Seq[Todo]) = div( + ul( + todos.map(todo => li(div(s"id: ${todo.id} content: ${todo.content}"))) + ) + ) +} diff --git a/src/main/scala/outwatchapp/components/todo/Chartjs.scala b/src/main/scala/outwatchapp/components/todo/Chartjs.scala new file mode 100644 index 0000000..c6143ab --- /dev/null +++ b/src/main/scala/outwatchapp/components/todo/Chartjs.scala @@ -0,0 +1,151 @@ +// package outwatchapp.components.todo + +// import typings.chartJs.mod.{^ => Chart, _} +// import typings.moment.mod.Moment +// import typings.std.global.document +// import typings.std.{ +// stdStrings, +// Date, +// HTMLButtonElement, +// HTMLCanvasElement, +// HTMLDivElement, +// MouseEvent +// } + +// import scala.scalajs.js +// import scala.scalajs.js.| +// import scala.util.Random + +// object Chartjs { +// val random = new Random() + +// // def main(argv: scala.Array[String]): Unit = { +// // val section = document.createElement_section(stdStrings.section) +// // section.className = "w" +// // section.append( +// // chart(chartConfig(ChartType.bar, randomData(100, random.nextInt()))), +// // chart(chartConfig(ChartType.pie, randomData(100, random.nextInt()))), +// // chart( +// // chartConfig(ChartType.polarArea, randomData(100, random.nextInt())) +// // ), +// // chart(chartConfig(ChartType.line, randomData(100, random.nextInt()))) +// // ) + +// // document.body.append(section) + +// // } + +// def chartConfig( +// tpe: ChartType, +// Data: js.Array[js.UndefOr[ChartPoint | Double | Null]] +// ): ChartConfiguration = +// ChartConfiguration() +// .setType(tpe) +// .setData( +// ChartData() +// .setLabels(Labels) +// .setDatasets( +// js.Array( +// ChartDataSets() +// .setLabel("Dataset 1") +// .setData(Data) +// .setBorderWidth(1) +// .setBackgroundColor(BackgroundColor) +// .setBorderColor(BorderColor) +// ) +// ) +// ) +// .setOptions(ChartOptions().setResponsive(true)) + +// def chart( +// divElem: HTMLDivElement, +// canvas: HTMLCanvasElement, +// config: ChartConfiguration +// ): HTMLDivElement = { +// val div2: HTMLDivElement = document.createElement_div(stdStrings.div) +// // val canvas: HTMLCanvasElement = +// // document.createElement_canvas(stdStrings.canvas) +// val chart: Chart = new Chart(canvas, config) + +// def dataSetsU: js.UndefOr[js.Array[ChartDataSets]] = +// config.data.flatMap(_.datasets) + +// val randomizeBtn = button("Randomize Data") { (_, _) => +// dataSetsU.foreach( +// _.foreach(dataset => dataset.data = randomData(100, random.nextInt())) +// ) +// chart.update() +// } + +// val addDataSet = button("Add Dataset") { (_, _) => +// val newDataset = ChartDataSets() +// .setLabel("Dataset " + dataSetsU.fold(0)(_.length + 1)) +// .setData(randomData(100, random.nextInt())) +// .setBorderWidth(1) +// .setBackgroundColor(BackgroundColor) +// .setBorderColor(BorderColor) + +// dataSetsU.foreach(_.push(newDataset)) +// chart.update() +// } + +// val removeDataset = button("Remove dataset") { (_, _) => +// dataSetsU.foreach(_.splice(0, 1)) +// chart.update() +// } + +// divElem.append(canvas, randomizeBtn, addDataSet, removeDataset) +// divElem +// } + +// def button(title: String)( +// onClick: js.ThisFunction1[HTMLButtonElement, MouseEvent, Unit] +// ): HTMLButtonElement = { +// val btn = document.createElement_button(stdStrings.button) +// btn.textContent = title +// btn.addEventListener_click(stdStrings.click, onClick) +// btn +// } + +// def randomData( +// max: Int, +// seed: Int +// ): js.Array[js.UndefOr[ChartPoint | Double | scala.Null]] = { +// val random = new Random(seed) +// js.Array[js.UndefOr[ChartPoint | Double | Null]]( +// random.nextInt(max), +// random.nextInt(max), +// random.nextInt(max), +// random.nextInt(max), +// random.nextInt(max), +// random.nextInt(max) +// ) +// } + +// val Labels: js.Array[ +// String | js.Array[Date | Double | Moment | String] | Double | Date | Moment +// ] = +// js.Array("Red", "Blue", "Yellow", "Green", "Purple", "Orange") + +// val BackgroundColor: ChartColor = +// js.Array( +// color(54, 162, 235, 0.2), +// color(255, 206, 86, 0.2), +// color(75, 192, 192, 0.2), +// color(153, 102, 255, 0.2), +// color(255, 159, 64, 0.2) +// ) + +// val BorderColor: ChartColor = +// js.Array( +// color(255, 99, 132, 1), +// color(54, 162, 235, 1), +// color(255, 206, 86, 1), +// color(75, 192, 192, 1), +// color(153, 102, 255, 1), +// color(255, 159, 64, 1) +// ) + +// def color(r: Int, g: Int, b: Int, a: Double): String = +// s"rgba($r, $g, $b, $a)" +// } diff --git a/src/main/scala/outwatchapp/components/todo/ChartjsDemo.scala b/src/main/scala/outwatchapp/components/todo/ChartjsDemo.scala new file mode 100644 index 0000000..d400f0f --- /dev/null +++ b/src/main/scala/outwatchapp/components/todo/ChartjsDemo.scala @@ -0,0 +1,111 @@ +package outwatchapp.components.todo +import scala.scalajs.js.| +import scala.util.Random + +import colibri.ext.monix._ +import com.softwaremill.tagging._ +import monix.bio.Task +import monix.eval.Coeval +import outwatch.HtmlVNode +import outwatch.dsl._ +import outwatch.reactive.handlers.monix._ +import typings.chartJs.mod._ +import typings.chartJs.mod.{^ => Chart} +import typings.moment.mod.Moment +import typings.std.Date +import typings.std.HTMLCanvasElement + +import scalajs.js + +sealed trait ChartjsDemo +object ChartjsDemo { + val random = new Random() + def apply(): Task[HtmlVNode @@ ChartjsDemo] = Task.deferAction(implicit s => + for { + canvasH <- Handler.createF[Task, HTMLCanvasElement] + } yield div( + canvas( + onDomMount.asHtml.map(a => + a.asInstanceOf[HTMLCanvasElement] + ) --> canvasH + ), + div( + canvasH + .doOnNextF(el => + Coeval( + new Chart( + el, + chartConfig(ChartType.bar, randomData(100, random.nextInt())) + ) + ) >> Coeval.unit + ) + .map(_ => div()) + ) + ).taggedWith[ChartjsDemo] + ) + + def randomData( + max: Int, + seed: Int + ): js.Array[js.UndefOr[ChartPoint | Double | scala.Null]] = { + val random = new Random(seed) + js.Array[js.UndefOr[ChartPoint | Double | Null]]( + random.nextInt(max), + random.nextInt(max), + random.nextInt(max), + random.nextInt(max), + random.nextInt(max), + random.nextInt(max) + ) + } + + def chartConfig( + tpe: ChartType, + Data: js.Array[js.UndefOr[ChartPoint | Double | Null]] + ): ChartConfiguration = + ChartConfiguration() + .setType(tpe) + .setData( + ChartData() + .setLabels(Labels) + .setDatasets( + js.Array( + ChartDataSets() + .setLabel("Dataset 1") + .setData(Data) + .setBorderWidth(1) + .setBackgroundColor(BackgroundColor) + .setBorderColor(BorderColor) + ) + ) + ) + .setOptions(ChartOptions().setResponsive(true)) + + val Labels: js.Array[ + String | js.Array[Date | Double | Moment | String] | Double | Date | Moment + ] = + js.Array("Red", "Blue", "Yellow", "Green", "Purple", "Orange") + + val BackgroundColor: ChartColor = + js.Array( + color(54, 162, 235, 0.2), + color(255, 206, 86, 0.2), + color(75, 192, 192, 0.2), + color(153, 102, 255, 0.2), + color(255, 159, 64, 0.2) + ) + + val BorderColor: ChartColor = + js.Array( + color(255, 99, 132, 1), + color(54, 162, 235, 1), + color(255, 206, 86, 1), + color(75, 192, 192, 1), + color(153, 102, 255, 1), + color(255, 159, 64, 1) + ) + + def color(r: Int, g: Int, b: Int, a: Double): String = + s"rgba($r, $g, $b, $a)" + +} diff --git a/src/main/scala/outwatchapp/components/todo/Fusejs.scala b/src/main/scala/outwatchapp/components/todo/Fusejs.scala new file mode 100644 index 0000000..0c815f0 --- /dev/null +++ b/src/main/scala/outwatchapp/components/todo/Fusejs.scala @@ -0,0 +1,19 @@ +package outwatchapp.components.todo + +import nova.monadic_sfx.ui.components.todo.Todo +import typings.fuseJs.mod.Fuse.IFuseOptions +import typings.fuseJs.mod._ +import typings.fuseJs.mod.{default => FuseC} + +import scalajs.js + +object FusejsDemo { + val x: Fuse[Todo] = new FuseC[Todo]( + js.Array(Todo(1, "fuse")), + IFuseOptions().setKeys(js.Array("id", "content")) + ) + val y = x.search[Todo]("fuse") + val mySeq = Seq(1, 2, 3) + val jsArr = js.Array(mySeq: _*) + val seq2 = jsArr.toSeq +} diff --git a/src/main/scala/outwatchapp/components/todo/TodoListStore.scala b/src/main/scala/outwatchapp/components/todo/TodoListStore.scala index d7422a3..9b2fdb3 100644 --- a/src/main/scala/outwatchapp/components/todo/TodoListStore.scala +++ b/src/main/scala/outwatchapp/components/todo/TodoListStore.scala @@ -1,5 +1,7 @@ package nova.monadic_sfx.ui.components.todo +import scala.scalajs.js.annotation.JSExportAll + import cats.kernel.Eq import com.softwaremill.quicklens._ import io.circe.generic.JsonCodec @@ -7,9 +9,11 @@ import monix.bio.Task import nova.monadic_sfx.util.reactive.store.Reducer import nova.monadic_sfx.util.reactive.store.Store +@JSExportAll case class Todo(id: Int, content: String) object Todo { implicit val eqForTodo = Eq.fromUniversalEquals[Todo] + } object TodoListStore { diff --git a/src/main/scala/outwatchapp/pages/HomePage.scala b/src/main/scala/outwatchapp/pages/HomePage.scala new file mode 100644 index 0000000..7efaef9 --- /dev/null +++ b/src/main/scala/outwatchapp/pages/HomePage.scala @@ -0,0 +1,41 @@ +package outwatchapp.pages +import com.softwaremill.tagging._ +import outwatch._ +import outwatch.dsl._ +import outwatchapp.components.CounterDemo +import outwatchapp.components.todo.ChartjsDemo + +class HomePage( + counterDemo: VNode @@ CounterDemo, + chartDemo: VNode @@ ChartjsDemo +) { + def render = div( + div(cls := "title", "Home"), + div( + cls := "card", + div( + cls := "card-body", + counterDemo, + chartDemo, + p( + cls := "profile-description", + div( + "hm", + htmlTag("blockQuote")( + cls := "blockquote", + p( + cls := "mb-0", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante." + ), + footer( + cls := "blockquote-footer", + "Someone famous in ", + cite(title := "Source Title", "Source Title") + ) + ) + ) + ) + ) + ) + ) +} diff --git a/src/main/scala/outwatchapp/util/reactive/store/Store.scala b/src/main/scala/outwatchapp/util/reactive/store/Store.scala index 5fb6e13..f77ab1e 100644 --- a/src/main/scala/outwatchapp/util/reactive/store/Store.scala +++ b/src/main/scala/outwatchapp/util/reactive/store/Store.scala @@ -4,6 +4,7 @@ import monix.bio.Task import monix.eval.Coeval import monix.reactive.OverflowStrategy import monix.reactive.subjects.ConcurrentSubject +import monix.reactive.Observer object Store { def createL[A, M]( @@ -18,15 +19,14 @@ object Store { Task { val subject = ConcurrentSubject.publish[A](overflowStrategy) - val fold: ((A, M), A) => Coeval[(A, M)] = { - case ((_, state), action) => - Coeval { - val (newState, effects) = reducer(state, action) + val fold: ((A, M), A) => Coeval[(A, M)] = { case ((_, state), action) => + Coeval { + val (newState, effects) = reducer(state, action) - effects.subscribe(subject.onNext _) + effects.subscribe(subject.onNext _) - action -> newState - } + action -> newState + } } val obs = subject @@ -35,13 +35,15 @@ object Store { )(fold) val res = middlewares - .foldLeft(obs) { - case (obs, middleware) => middleware(obs) + .foldLeft(obs) { case (obs, middleware) => + middleware(obs) } .doOnNextF(i => Coeval(println(s"Emitted item 1: $i"))) .behavior(initialAction -> initialState) .refCount + res.subscribe(Observer.empty) + // .doOnNextF(i => Coeval(println(s"Emitted item 2: $i"))) MonixProSubject.from( diff --git a/webpack.config.dev.js b/webpack.config.dev.js index d8d44d3..dcb9cf1 100644 --- a/webpack.config.dev.js +++ b/webpack.config.dev.js @@ -1,25 +1,46 @@ var webpack = require('webpack'); - -module.exports = require('./scalajs.webpack.config'); - -const Path = require('path'); +var merge = require('webpack-merge'); +var generated = require('./scalajs.webpack.config'); +var Path = require('path'); const rootDir = Path.resolve(__dirname, '../../../..'); -// module.exports.module = { -// ...module.exports.module, -// rules: module.exports.module.rules.concat([ -// { -// test: /\.css$/i, -// use: ['style-loader', 'css-loader'], -// }, -// ]), -// }; -module.exports.devServer = { - contentBase: [ - Path.resolve(__dirname, 'dev'), // fastOptJS output - Path.resolve(rootDir, 'assets') // project root containing index.html - ], - watchContentBase: true, - hot: false, - hotOnly: false, // only reload when build is successful - inline: true // live reloading + +var local = { + module: { + rules: [ + { + test: /\.css$/, + use: ['style-loader', 'css-loader'] + }, + { + test: /\.(ttf|eot|woff|png|glb|jpeg|jpg|mp4|jsn)$/, + use: 'file-loader' + }, + { + test: /\.(eot)$/, + use: 'url-loader' + } + ] + }, + devServer: { + contentBase: [ + Path.resolve(__dirname, 'dev'), // fastOptJS output + Path.resolve(rootDir, 'assets') // project root containing index.html + ], + watchContentBase: true, + hot: false, + hotOnly: false, // only reload when build is successful + inline: true, // live reloading + watchOptions: { + poll: 1000, + ignored: ["node_modules"] + } + }, + plugins: [ + new webpack.ProvidePlugin({ + $: 'jquery/src/jquery', + jquery: 'jquery/src/jquery' + }) + ] }; + +module.exports = merge(generated, local); diff --git a/yarn.lock b/yarn.lock index 7fe06ed..384fb34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,13 @@ # yarn lockfile v1 +"@types/chart.js@2.9.11": + version "2.9.11" + resolved "https://registry.yarnpkg.com/@types/chart.js/-/chart.js-2.9.11.tgz#2b73fe59e78dfe31c2f8d6c6d0c169e98e65c16b" + integrity sha512-xuDh5pZWci1Z5DUkiGTTLIBymxUe8KMfo1JYM5HTY7LXURSCej458uMrD4eYn4v+BTYTZfKlTRNIk8jW4nTaOg== + dependencies: + moment "^2.10.2" + "@types/glob@^7.1.1": version "7.1.3" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" @@ -10,6 +17,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -193,12 +205,12 @@ ajv-errors@^1.0.0: 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, ajv-keywords@^3.4.1: +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.2: +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -403,6 +415,11 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +blk-design-system@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/blk-design-system/-/blk-design-system-1.0.2.tgz#516a1fdf8eff7f08e04e66bdb88fa848ab243534" + integrity sha512-vhqb6s4qbPh/AXsd1vNwRMKvLToH/K3l+BK8RC6h1Lkn50kg8494NM+NDQr+F8q8LSwwHklBOChQLFjNf9k0eQ== + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -446,6 +463,11 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" +bootstrap@4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6" + integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -631,6 +653,11 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -640,6 +667,29 @@ chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chart.js@2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.3.tgz#ae3884114dafd381bc600f5b35a189138aac1ef7" + integrity sha512-+2jlOobSk52c1VU6fzkh3UwqHMdSlgH1xFv9FKMqHiNCpXsGPQa/+81AFa+i3jZ253Mq9aAycPwDjnn1XbRNNw== + dependencies: + chartjs-color "^2.1.0" + moment "^2.10.2" + +chartjs-color-string@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz#1df096621c0e70720a64f4135ea171d051402f71" + integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A== + dependencies: + color-name "^1.0.0" + +chartjs-color@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chartjs-color/-/chartjs-color-2.4.1.tgz#6118bba202fe1ea79dd7f7c0f9da93467296c3b0" + integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w== + dependencies: + chartjs-color-string "^0.6.0" + color-convert "^1.9.3" + chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -735,7 +785,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: 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== @@ -747,6 +797,16 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@^1.0.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== + commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -922,6 +982,29 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +css-loader@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.1.tgz#9e4de0d6636a6266a585bd0900b422c85539d25f" + integrity sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw== + dependencies: + camelcase "^6.2.0" + cssesc "^3.0.0" + icss-utils "^5.0.0" + loader-utils "^2.0.0" + postcss "^8.1.4" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.2" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" @@ -1371,6 +1454,14 @@ figgy-pudding@^3.5.1: resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== +file-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + 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" @@ -1508,6 +1599,11 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +fuse.js@6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.4.3.tgz#aadd6ac34aab5b1d6e6c60462fcb4d1c3f53bb01" + integrity sha512-JNgngolukIrqwayWnvy6NLH63hmwKPhm63o0uyBg51jPD0j09IvAzlV1rTXfAsgxpghI7khAo6Mv+EmvjDWXig== + 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" @@ -1776,6 +1872,11 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-utils@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -1799,6 +1900,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + infer-owner@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -2084,6 +2190,11 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +jquery@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" + integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== + 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" @@ -2111,6 +2222,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -2152,7 +2270,7 @@ loader-runner@^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, loader-utils@^1.2.3: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -2161,6 +2279,15 @@ loader-utils@^1.1.0, loader-utils@^1.2.3: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + loader-utils@~0.2.2: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" @@ -2179,7 +2306,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.17.5: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== @@ -2196,6 +2323,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -2321,6 +2455,11 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.0.3: + version "2.4.7" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.7.tgz#962aed9be0ed19c91fd7dc2ece5d7f4e89a90d74" + integrity sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA== + mime@^2.4.4: version "2.4.6" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" @@ -2384,6 +2523,11 @@ mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5: dependencies: minimist "^1.2.5" +moment@^2.10.2: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -2429,6 +2573,11 @@ nan@^2.12.1: resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== +nanoid@^3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -2793,6 +2942,11 @@ pkg-dir@^3.0.0: dependencies: find-up "^3.0.0" +popper.js@1.16.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.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -2807,6 +2961,58 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" + integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@^8.1.4: + version "8.2.1" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.1.tgz#eabc5557c4558059b9d9e5b15bce7ffa9089c2a8" + integrity sha512-RhsqOOAQzTgh1UB/IZdca7F9WDb7SUCR2Vnv1x7DbvuuggQIpoDwjK+q0rzoPffhYvWNKX5JSwS4so4K3UC6vA== + dependencies: + colorette "^1.2.1" + nanoid "^3.1.20" + source-map "^0.6.1" + 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" @@ -3119,6 +3325,15 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" + integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + dependencies: + "@types/json-schema" "^7.0.6" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -3141,6 +3356,13 @@ semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.2: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -3512,6 +3734,14 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +style-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + 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" @@ -3655,6 +3885,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -3699,6 +3934,15 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-loader@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" + integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" + url-parse@^1.4.3: version "1.4.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" @@ -3720,7 +3964,7 @@ use@^3.1.0: 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: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, 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= @@ -3864,6 +4108,13 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" +webpack-merge@4.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.5.tgz#2be31e846c20767d1bef56bdca64c328a681190a" + integrity sha512-sVcM+MMJv6DO0C0GLLltx8mUlGMKXE0zBsuMqZ9jz2X9gsekALw6Rs0cAfTWc97VuWS6NpVUa78959zANnMMLQ== + dependencies: + lodash "^4.17.5" + webpack-sources@^1.4.0, webpack-sources@^1.4.1: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" @@ -3985,6 +4236,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"