From d0b00b0b52af49577d092e203b5b9d95442e6281 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 10 Dec 2021 21:35:06 +0100 Subject: [PATCH 001/245] Update sbt to 1.5.6 (#334) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 10fd9eee0..bb3a9b7dc 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.5.6 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 10fd9eee0..bb3a9b7dc 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.5.6 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 10fd9eee0..bb3a9b7dc 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.5.6 diff --git a/project/build.properties b/project/build.properties index 10fd9eee0..bb3a9b7dc 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.5 +sbt.version=1.5.6 From 35858a20fcbe59d74b56706675e07e8c2753aa3e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 11 Dec 2021 07:45:04 +0100 Subject: [PATCH 002/245] Update sbt-protoc to 1.0.5 (#336) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index b5fb6dbc6..f4d3b43ec 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,6 @@ ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") -addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.4") +addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.5") libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.6" From ef3c9bea8b3992607c2ab9f897ad46aa4cbcef3c Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 12 Dec 2021 22:47:01 +0100 Subject: [PATCH 003/245] Update compilerplugin, scalapb-runtime, ... to 0.11.7 (#337) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index f4d3b43ec..c2f0d001d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.5") -libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.6" +libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") From d4a77ab857f43034edf441ab3d5d0f8a83e4bb41 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 15 Dec 2021 03:07:02 +0100 Subject: [PATCH 004/245] Update zio, zio-streams, zio-test, ... to 1.0.13 (#338) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 196bc77ed..6a0108192 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "1.0.12" + val zio = "1.0.13" val grpc = "1.41.0" } From cb57f31719bb2b2cc6c5767e535cd79964070b18 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 16 Dec 2021 04:06:36 +0100 Subject: [PATCH 005/245] Update sbt to 1.5.7 (#339) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index bb3a9b7dc..baf5ff3ec 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.6 +sbt.version=1.5.7 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index bb3a9b7dc..baf5ff3ec 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.6 +sbt.version=1.5.7 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index bb3a9b7dc..baf5ff3ec 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.6 +sbt.version=1.5.7 diff --git a/project/build.properties b/project/build.properties index bb3a9b7dc..baf5ff3ec 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.6 +sbt.version=1.5.7 From 5f58a2486def8bc85d27a1c48c5bbc856b5a6db3 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 21 Dec 2021 19:05:17 +0100 Subject: [PATCH 006/245] Update sbt to 1.5.8 (#340) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index baf5ff3ec..e64c208ff 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.7 +sbt.version=1.5.8 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index baf5ff3ec..e64c208ff 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.7 +sbt.version=1.5.8 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index baf5ff3ec..e64c208ff 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.7 +sbt.version=1.5.8 diff --git a/project/build.properties b/project/build.properties index baf5ff3ec..e64c208ff 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.7 +sbt.version=1.5.8 From e4efb7e5b97a44fddd40cad5a26adde51aeb0209 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 27 Dec 2021 03:30:53 +0100 Subject: [PATCH 007/245] Update sbt to 1.6.0 (#344) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index e64c208ff..1e70b0c1c 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.8 +sbt.version=1.6.0 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index e64c208ff..1e70b0c1c 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.8 +sbt.version=1.6.0 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index e64c208ff..1e70b0c1c 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.8 +sbt.version=1.6.0 diff --git a/project/build.properties b/project/build.properties index e64c208ff..1e70b0c1c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.5.8 +sbt.version=1.6.0 From 68faf84022099130e667ee14da40c1e68909ba23 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 29 Dec 2021 21:33:53 +0100 Subject: [PATCH 008/245] Update sbt to 1.6.1 (#345) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 1e70b0c1c..3161d2146 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.0 +sbt.version=1.6.1 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 1e70b0c1c..3161d2146 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.0 +sbt.version=1.6.1 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 1e70b0c1c..3161d2146 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.0 +sbt.version=1.6.1 diff --git a/project/build.properties b/project/build.properties index 1e70b0c1c..3161d2146 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.0 +sbt.version=1.6.1 From 4ff0eecc3140979f5aaa11a08d33390f02f1299e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 7 Jan 2022 13:27:53 +0100 Subject: [PATCH 009/245] Update sbt-protoc to 1.0.6 (#347) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index c2f0d001d..64ff6989b 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,6 @@ ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") -addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.5") +addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" From 7ef3b4e955a3638d09798f95af4b1875bd85beae Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 7 Jan 2022 18:51:43 +0100 Subject: [PATCH 010/245] Update compilerplugin, scalapb-runtime, ... to 0.11.8 (#348) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 64ff6989b..148df8d8e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" +libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.8" addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") From f973563fe67967067dbd9338ac7c9ecd5fb7eb97 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Thu, 2 Sep 2021 22:19:02 -0700 Subject: [PATCH 011/245] Initial upgrade to ZIO 2 (#299) --- .github/workflows/ci.yml | 2 +- .scalafmt.conf | 13 ++- build.sbt | 42 +++---- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 45 ++++---- .../scalapb/zio_grpc/CallOptionsMethods.scala | 4 +- .../main/scala/scalapb/zio_grpc/CanBind.scala | 8 +- .../src/main/scala/scalapb/zio_grpc/GIO.scala | 5 +- .../scala/scalapb/zio_grpc/SafeMetadata.scala | 6 +- .../zio_grpc/TransformableService.scala | 59 +++++----- .../scalapb/zio_grpc/ZBindableService.scala | 22 ++-- .../scalapb/zio_grpc/ZClientInterceptor.scala | 7 +- .../scalapb/zio_grpc/ZGeneratedService.scala | 3 +- .../scala/scalapb/zio_grpc/ZTransform.scala | 47 +++++--- .../main/scala/scalapb/zio_grpc/package.scala | 3 +- .../scalajs/scalapb/zio_grpc/ZChannel.scala | 5 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 4 +- .../scalapb/zio_grpc/client/ZClientCall.scala | 4 +- .../zio_grpc/server/ZServerCallHandler.scala | 9 +- .../scalajvm/scalapb/zio_grpc/Server.scala | 109 +++--------------- .../scalapb/zio_grpc/ServerMain.scala | 8 +- .../scalapb/zio_grpc/ServiceList.scala | 21 ++-- .../scalapb/zio_grpc/ServiceModule.scala | 4 +- .../scalajvm/scalapb/zio_grpc/ZChannel.scala | 9 +- .../scalapb/zio_grpc/ZManagedChannel.scala | 4 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 27 +++-- .../client/StreamingClientCallListener.scala | 12 +- .../client/UnaryClientCallListener.scala | 30 +++-- .../scalapb/zio_grpc/client/ZClientCall.scala | 25 ++-- .../scalapb/zio_grpc/server/CallDriver.scala | 22 ++-- .../scalapb/zio_grpc/server/ZServerCall.scala | 8 +- .../zio_grpc/server/ZServerCallHandler.scala | 23 ++-- docs/basics.md | 2 +- docs/context.md | 24 ++-- docs/deadlines.md | 6 +- docs/decorating.md | 4 +- docs/generated-code.md | 10 +- docs/quickstart.md | 4 +- .../zio_grpc/BindableServiceSpec.scala | 37 +++--- .../scalapb/zio_grpc/CallDriverSpec.scala | 13 ++- .../scalapb/zio_grpc/ClientCallsSpec.scala | 4 +- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 32 ++--- .../scalapb/zio_grpc/MetadataTests.scala | 42 +++---- .../scalapb/zio_grpc/TestServiceImpl.scala | 53 ++++----- .../scalapb/zio_grpc/TestServiceSpec.scala | 93 ++++++++------- .../client/src/main/scala/ExampleClient.scala | 7 +- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 28 +++-- .../scala/ExampleServerWithMetadata.scala | 14 +-- .../webapp/src/main/scala/WebappMain.scala | 11 +- examples/helloworld/project/plugins.sbt | 4 +- .../helloworld/GreeterWithDatabase.scala | 2 +- .../helloworld/HelloWorldClient.scala | 2 +- .../helloworld/HelloWorldClientMetadata.scala | 10 +- .../helloworld/HelloWorldServer.scala | 2 +- .../routeguide/RouteGuideClientApp.scala | 14 +-- project/Versions.scala | 4 +- project/plugins.sbt | 2 +- 57 files changed, 474 insertions(+), 542 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b384c27c..3c340b84d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: - name: Examples run: | cd examples - for d in */ ; do cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test && cd ../ ; done + # for d in */ ; do cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test && cd ../ ; done # Single final job for mergify. ci-passed: diff --git a/.scalafmt.conf b/.scalafmt.conf index 18c958d34..dce291292 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,13 @@ -version = "2.7.5" +version = "3.3.1" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 -align = most +align.preset = most +runner.dialect = scala213source3 +fileOverride { + "glob:**/e2e/target/jvm-3/src_managed/main/**" { + runner.dialect = scala3 + } + "glob:**/code-gen/target/jvm-3/src_managed/main/**" { + runner.dialect = scala3 + } +} diff --git a/build.sbt b/build.sbt index 3f772c41f..265e8950e 100644 --- a/build.sbt +++ b/build.sbt @@ -1,12 +1,12 @@ import Settings.stdSettings -val Scala3 = "3.0.1" +val Scala3 = "3.1.0" -val Scala213 = "2.13.6" +val Scala213 = "2.13.7" val Scala212 = "2.12.15" -val ScalaVersions = Seq(Scala212, Scala213) +val ScalaVersions = Seq(Scala212, Scala213, Scala3) ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") @@ -17,11 +17,11 @@ sonatypeProfileName := "com.thesamet" inThisBuild( List( organization := "com.thesamet.scalapb.zio-grpc", - homepage := Some(url("https://github.com/scalapb/zio-grpc")), - licenses := List( + homepage := Some(url("https://github.com/scalapb/zio-grpc")), + licenses := List( "Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0") ), - developers := List( + developers := List( Developer( "thesamet", "Nadav Samet", @@ -73,9 +73,9 @@ lazy val codeGen = projectMatrix .enablePlugins(BuildInfoPlugin) .settings(stdSettings) .settings( - buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion), + buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion), buildInfoPackage := "scalapb.zio_grpc", - name := "zio-grpc-codegen", + name := "zio-grpc-codegen", libraryDependencies ++= Seq( "com.thesamet.scalapb" %% "compilerplugin" % scalapb.compiler.Version.scalapbVersion ) @@ -86,8 +86,8 @@ lazy val codeGenJVM212 = codeGen.jvm(Scala212) lazy val protocGenZio = protocGenProject("protoc-gen-zio", codeGenJVM212) .settings( - Compile / mainClass := Some("scalapb.zio_grpc.ZioCodeGenerator"), - scalaVersion := Scala212, + Compile / mainClass := Some("scalapb.zio_grpc.ZioCodeGenerator"), + scalaVersion := Scala212, assembly / assemblyMergeStrategy := { case PathList("scala", "annotation", "nowarn.class" | "nowarn$.class") => MergeStrategy.first @@ -105,8 +105,8 @@ lazy val e2e = .jvmPlatform(ScalaVersions) .settings(stdSettings) .settings( - crossScalaVersions := Seq(Scala212, Scala213), - publish / skip := true, + crossScalaVersions := Seq(Scala212, Scala213), + publish / skip := true, libraryDependencies ++= Seq( "dev.zio" %% "zio-test" % Version.zio % "test", "dev.zio" %% "zio-test-sbt" % Version.zio % "test", @@ -119,8 +119,8 @@ lazy val e2e = "scalapb.zio_grpc.ZioCodeGenerator$" ) -> (Compile / sourceManaged).value ), - PB.protocVersion := "3.13.0", - codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value, + PB.protocVersion := "3.13.0", + codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value, testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") ) @@ -129,11 +129,11 @@ lazy val docs = project .in(file("zio-grpc-docs")) .dependsOn(core.jvm(Scala213)) .settings( - crossScalaVersions := Seq(Scala213), - scalaVersion := Scala213, - publish / skip := true, - moduleName := "zio-grpc-docs", - mdocVariables := Map( + crossScalaVersions := Seq(Scala213), + scalaVersion := Scala213, + publish / skip := true, + moduleName := "zio-grpc-docs", + mdocVariables := Map( "sbtProtocVersion" -> "1.0.2", "grpcVersion" -> "1.41.0", "zioGrpcVersion" -> "0.5.0", @@ -144,12 +144,12 @@ lazy val docs = project "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ), libraryDependencySchemes += "com.thesamet.scalapb" %% "scalapb-runtime" % "always", - Compile / PB.targets := Seq( + Compile / PB.targets := Seq( scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, genModule( "scalapb.zio_grpc.ZioCodeGenerator$" ) -> (Compile / sourceManaged).value ), - codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value + codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value ) .enablePlugins(MdocPlugin, DocusaurusPlugin) diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index 30ae12eea..5a645fefe 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -58,7 +58,7 @@ class ZioFilePrinter( val Channel = "io.grpc.Channel" val CallOptions = "io.grpc.CallOptions" val ClientCalls = "scalapb.zio_grpc.client.ClientCalls" - val Duration = "zio.duration.Duration" + val Duration = "zio.Duration" val SafeMetadata = "scalapb.zio_grpc.SafeMetadata" val Status = "io.grpc.Status" val Deadline = "io.grpc.Deadline" @@ -67,7 +67,6 @@ class ZioFilePrinter( val ZClientCall = "scalapb.zio_grpc.client.ZClientCall" val ZManagedChannel = "scalapb.zio_grpc.ZManagedChannel" val ZChannel = "scalapb.zio_grpc.ZChannel" - val ZBindableService = "scalapb.zio_grpc.ZBindableService" val Nanos = "java.util.concurrent.TimeUnit.NANOSECONDS" val serverServiceDef = "_root_.io.grpc.ServerServiceDefinition" private val OuterObject = @@ -144,7 +143,8 @@ class ZioFilePrinter( def clientMethodSignature( method: MethodDescriptor, inEnvType: String, - outEnvType: String + outEnvType: String, + implicitViews: String = "" ): String = { val reqType = methodInType(method, inEnvType) val scalaOutType = method.outputType.scalaType @@ -153,11 +153,11 @@ class ZioFilePrinter( case StreamType.Unary => s"(request: $reqType): ${io(scalaOutType, outEnvType)}" case StreamType.ClientStreaming => - s"[${inEnvType}](request: $reqType): ${io(scalaOutType, outEnvType + " with " + inEnvType)}" + s"[${inEnvType}${implicitViews}](request: $reqType): ${io(scalaOutType, outEnvType + " with " + inEnvType)}" case StreamType.ServerStreaming => s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" case StreamType.Bidirectional => - s"[${inEnvType}](request: $reqType): ${stream(scalaOutType, outEnvType + " with " + inEnvType)}" + s"[${inEnvType}${implicitViews}](request: $reqType): ${stream(scalaOutType, outEnvType + " with " + inEnvType)}" }) } @@ -282,7 +282,7 @@ class ZioFilePrinter( .add( s"type ${traitName.name} = ${ztraitName.name}[Any, Any]", s"type R${traitName.name}[R] = ${ztraitName.name}[R, Any]", - s"type RC${traitName.name}[R] = ${ztraitName.name}[R, zio.Has[$RequestContext]]" + s"type RC${traitName.name}[R] = ${ztraitName.name}[R, $RequestContext]" ) .add("") .add(s"object ${ztraitName.name} {") @@ -294,12 +294,14 @@ class ZioFilePrinter( ) .indented( _.add( - s"""def bind[R, C](serviceImpl: ${ztraitName.fullName}[R, C], env: zio.Has[$RequestContext] => R with C): zio.URIO[R, $serverServiceDef] =""" + s"""def bind[R](serviceImpl: ${ztraitName.fullName}[R, $RequestContext]): zio.URIO[R, $serverServiceDef] =""" ).indent - .add("zio.ZIO.runtime[Any].map {") + .add("zio.ZIO.runtime[Any].flatMap {") .indent .add("runtime =>") .indent + .add("zio.ZIO.environmentWith[R] { (env: zio.ZEnvironment[R]) => ") + .indent .add( s"""$serverServiceDef.builder(${service.grpcDescriptor.fullName})""" ) @@ -308,6 +310,8 @@ class ZioFilePrinter( ) .add(".build()") .outdent + .add("}") + .outdent .outdent .add("}") .outdent @@ -317,12 +321,12 @@ class ZioFilePrinter( .add("}") .add("") .add( - s"type ${clientServiceName.name} = _root_.zio.Has[${clientServiceName.name}.Service]" + s"type ${clientServiceName.name} = ${clientServiceName.name}.Service" ) .add("") .add("// accessor methods") .add( - s"class ${accessorsClassName.name}[Context: zio.Tag](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsClassName.name}[Context]] {" + s"class ${accessorsClassName.name}[Context: zio.Tag: zio.IsNotIntersection](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsClassName.name}[Context]] {" ) .indented( _.add(s"def this() = this(zio.ZIO.succeed($CallOptions.DEFAULT))") @@ -386,7 +390,7 @@ class ZioFilePrinter( .add("}") .add("") .add( - s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, zio.Has[${clientServiceName.name}.ZService[Any, Context]]] = zio.ZLayer.fromFunctionManaged((r: R) => managed[Any, Context](managedChannel.map(_.provide(r)), options, headers))" + s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = zio.ZLayer.fromFunctionManaged((r: zio.ZEnvironment[R]) => managed[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers))" ) .outdent .add("}") @@ -399,16 +403,17 @@ class ZioFilePrinter( clientMethodSignature( method, inEnvType = "R0", - outEnvType = s"zio.Has[${clientServiceName.name}.ZService[Any, Context]] with Context" + outEnvType = s"${clientServiceName.name}.ZService[Any, Context] with Context", + implicitViews = ": zio.Tag" ) + " = " - val innerCall = s"_.get.withCallOptionsM(callOptions).${method.name}(request)" + val innerCall = s"_.withCallOptionsM(callOptions).${method.name}(request)" val clientCall = method.streamType match { - case StreamType.Unary => s"_root_.zio.ZIO.accessM($innerCall)" - case StreamType.ClientStreaming => s"_root_.zio.ZIO.accessM($innerCall)" + case StreamType.Unary => s"_root_.zio.ZIO.serviceWithZIO($innerCall)" + case StreamType.ClientStreaming => s"_root_.zio.ZIO.serviceWithZIO($innerCall)" case StreamType.ServerStreaming => - s"_root_.zio.stream.ZStream.accessStream($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" case StreamType.Bidirectional => - s"_root_.zio.stream.ZStream.accessStream($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" } fp.add(sigWithoutContext + clientCall) } @@ -426,9 +431,9 @@ class ZioFilePrinter( case StreamType.Unary => s"headers.zip(options).flatMap" case StreamType.ClientStreaming => s"headers.zip(options).flatMap" case StreamType.ServerStreaming => - s"zio.stream.ZStream.fromEffect(headers.zip(options)).flatMap" + s"zio.stream.ZStream.fromZIO(headers.zip(options)).flatMap" case StreamType.Bidirectional => - s"zio.stream.ZStream.fromEffect(headers.zip(options)).flatMap" + s"zio.stream.ZStream.fromZIO(headers.zip(options)).flatMap" } fp.add( clientMethodSignature( @@ -464,7 +469,7 @@ class ZioFilePrinter( s"${method.grpcDescriptor.fullName}," ) .add( - s"$CH.$serverCall(runtime, (t: ${methodInType(method, inEnvType = "Any")})=>serviceImpl.${method.name}(t).provideSome(env))" + s"$CH.$serverCall(runtime, (t: ${methodInType(method, inEnvType = "Any")})=>serviceImpl.${method.name}(t).provideSomeEnvironment((rc: zio.ZEnvironment[$RequestContext]) => env.union[$RequestContext](rc)))" ) .outdent .add(")") diff --git a/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala b/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala index 7a16db069..6063e7dd8 100644 --- a/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala +++ b/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala @@ -4,7 +4,7 @@ import io.grpc.CallOptions import io.grpc.Status import java.util.concurrent.TimeUnit import zio.ZIO -import zio.duration.Duration +import zio.Duration import io.grpc.Deadline trait CallOptionsMethods[Repr] { @@ -13,6 +13,6 @@ trait CallOptionsMethods[Repr] { def withCallOptions(callOptions: CallOptions): Repr = mapCallOptionsM(_ => ZIO.succeed(callOptions)) def withDeadline(deadline: Deadline): Repr = mapCallOptionsM(co => ZIO.succeed(co.withDeadline(deadline))) def withTimeout(duration: Duration): Repr = - mapCallOptionsM(co => ZIO.effectTotal(co.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))) + mapCallOptionsM(co => ZIO.succeed(co.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))) def withTimeoutMillis(millis: Long): Repr = withTimeout(Duration.fromMillis(millis)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/CanBind.scala b/core/src/main/scala/scalapb/zio_grpc/CanBind.scala index 8d5c98908..53453eaf0 100644 --- a/core/src/main/scala/scalapb/zio_grpc/CanBind.scala +++ b/core/src/main/scala/scalapb/zio_grpc/CanBind.scala @@ -1,17 +1,15 @@ package scalapb.zio_grpc -import zio.Has - // Represents evidence that a service with Context C can be bound (that is, we can // generate a ServerServiceDefinition for it). To be able to bind a service with Context C // we need to be able to convert a RequestContext to C. trait CanBind[C] { - def bind(in: Has[RequestContext]): C + def bind(in: RequestContext): C } trait CanBindLowPriority { - implicit val canBindRC: CanBind[Has[RequestContext]] = identity - implicit val canBindMD: CanBind[Has[SafeMetadata]] = t => Has(t.get.metadata) + implicit val canBindRC: CanBind[RequestContext] = identity + implicit val canBindMD: CanBind[SafeMetadata] = t => t.metadata } object CanBind extends CanBindLowPriority { diff --git a/core/src/main/scala/scalapb/zio_grpc/GIO.scala b/core/src/main/scala/scalapb/zio_grpc/GIO.scala index 9f809179b..fca472003 100644 --- a/core/src/main/scala/scalapb/zio_grpc/GIO.scala +++ b/core/src/main/scala/scalapb/zio_grpc/GIO.scala @@ -7,5 +7,8 @@ object GIO { def fromTask[A](task: Task[A]) = task.mapError(e => Status.INTERNAL.withDescription(e.getMessage).withCause(e)) - def effect[A](effect: => A) = fromTask(Task.effect(effect)) + @deprecated("use attempt", "0.6.0") + def effect[A](effect: => A) = attempt(effect) + + def attempt[A](effect: => A) = fromTask(Task.attempt(effect)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala b/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala index c143e1a9c..99c05d4b7 100644 --- a/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala +++ b/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala @@ -20,7 +20,7 @@ final class SafeMetadata private ( /** Creates an effect from a total side-effecting function of metadata */ def wrap[A](f: Metadata => A): UIO[A] = - wrapM(metadata => ZIO.effectTotal(f(metadata))) + wrapM(metadata => ZIO.succeed(f(metadata))) def wrapM[R, E, A](f: Metadata => ZIO[R, E, A]): ZIO[R, E, A] = sem.withPermit(f(metadata)) @@ -29,8 +29,8 @@ final class SafeMetadata private ( object SafeMetadata { def make: UIO[SafeMetadata] = fromMetadata(new Metadata) - /** Creates a new SafeMetadata by taking ownership of the given metadata. - * The provided metadata should not be used after calling this method. + /** Creates a new SafeMetadata by taking ownership of the given metadata. The provided metadata should not be used + * after calling this method. */ def fromMetadata(metadata: => Metadata): UIO[SafeMetadata] = Semaphore.make(1).map(s => new SafeMetadata(s, metadata)) diff --git a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala index 6dbc8d7a0..18a3c7a24 100644 --- a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala @@ -2,8 +2,11 @@ package scalapb.zio_grpc import io.grpc.Status -import zio.{Has, Tag, TagKK, ZIO} import zio.ZLayer +import zio.ZEnvironment +import izumi.reflect.Tag +import zio.ZIO +import zio.IsNotIntersection trait TransformableService[S[_, _]] { def transform[RIn, ContextIn, ROut, ContextOut]( @@ -11,28 +14,25 @@ trait TransformableService[S[_, _]] { transform: ZTransform[RIn with ContextIn, Status, ROut with ContextOut] ): S[ROut, ContextOut] - def provide[R, Context](s: S[R, Context], r: R)(implicit ev: Has.Union[R, Context]): S[Any, Context] = - transform(s, ZTransform.provideEnv(r)(ev)) + def provideEnvironment[R, Context: Tag](s: S[R, Context], r: ZEnvironment[R]): S[Any, Context] = + transform(s, ZTransform.provideEnvironment[R, Status, Context](r)) - def transformContextM[R, FromContext: Tag, R0 <: R, ToContext: Tag]( - s: S[R, Has[FromContext]], + def transformContextM[R, FromContext: Tag: IsNotIntersection, R0 <: R, ToContext: Tag: IsNotIntersection]( + s: S[R, FromContext], f: ToContext => ZIO[R0, Status, FromContext] - ): S[R0, Has[ToContext]] = - transform[R, Has[FromContext], R0, Has[ToContext]]( - s, - ZTransform.transformContext[R, Status, Has[FromContext], R0, Has[ToContext]](hc2 => f(hc2.get).map(Has(_))) - ) + ): S[R0, ToContext] = + transform[R, FromContext, R0, ToContext](s, ZTransform.transformContext[R, Status, FromContext, R0, ToContext](f)) - def transformContext[R, FromContext: Tag, ToContext: Tag]( - s: S[R, Has[FromContext]], + def transformContext[R, FromContext: Tag: IsNotIntersection, ToContext: Tag: IsNotIntersection]( + s: S[R, FromContext], f: ToContext => FromContext - ): S[R, Has[ToContext]] = + ): S[R, ToContext] = transformContextM[R, FromContext, R, ToContext](s, (hc2: ToContext) => ZIO.succeed(f(hc2))) def toLayer[R, C: Tag]( s: S[R, C] - )(implicit ev1: TagKK[S], ev2: Has.Union[R, C]): ZLayer[R, Nothing, Has[S[Any, C]]] = - ZLayer.fromFunction(provide(s, _)) + )(implicit tagged: Tag[S[Any, C]], notis: IsNotIntersection[S[Any, C]]): ZLayer[R, Nothing, S[Any, C]] = + ZLayer.fromFunction((r: ZEnvironment[R]) => provideEnvironment(s, r)) } object TransformableService { @@ -44,22 +44,21 @@ object TransformableService { )(implicit TS: TransformableService[S]): S[ROut, ContextOut] = TS.transform[R, C, ROut, ContextOut](service, transform) - def transformContextM[C1: Tag, C2: Tag, R0 <: R]( - f: C2 => ZIO[R0, Status, C1] - )(implicit ev: S[R, C] <:< S[R, Has[C1]], TS: TransformableService[S]): S[R0, Has[C2]] = - TS.transformContextM(service, f) + def transformContextM[C2: Tag: IsNotIntersection, R0 <: R]( + f: C2 => ZIO[R0, Status, C] + )(implicit TS: TransformableService[S], cTagged: Tag[C], cNotIs: IsNotIntersection[C]): S[R0, C2] = + TS.transformContextM[R, C, R0, C2](service, f) - def provide[R0, C0]( - r: R - )(implicit TS: TransformableService[S], ev1: Has.Union[R, C], ev2: S[R, C] <:< S[R0, C0]): S[Any, C] = - TS.provide[R, C](service, r) + def provideEnvironment( + r: ZEnvironment[R] + )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[Any, C] = + TS.provideEnvironment[R, C](service, r) - def toLayer[R0, C0](implicit - ev1: S[R, C] <:< S[R0, C0], - ev2: Has.Union[R0, C0], - ev3: Tag[C0], - ev4: TagKK[S], - TS: TransformableService[S] - ): ZLayer[R0, Nothing, Has[S[Any, C0]]] = TS.toLayer[R0, C0](service) + def toLayer(implicit + TS: TransformableService[S], + sTagged: Tag[S[Any, C]], + sNotIs: IsNotIntersection[S[Any, C]], + cTagged: Tag[C] + ): ZLayer[R, Nothing, S[Any, C]] = TS.toLayer[R, C](service) } } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala index b912e984a..e54b81f70 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala @@ -2,7 +2,8 @@ package scalapb.zio_grpc import io.grpc.ServerServiceDefinition import zio.URIO -import zio.ZIO +import izumi.reflect.Tag +import zio.IsNotIntersection /** Provides a way to bind a ZIO gRPC service implementations to a server. */ trait ZBindableService[-R, S] { @@ -19,26 +20,17 @@ object ZBindableService { )(implicit bs: ZBindableService[R, S]): URIO[R, ServerServiceDefinition] = bs.bindService(serviceImpl) - implicit def fromZGeneratedService1[R <: zio.Has[_], C, S[-_, -_], T](implicit + implicit def fromZGeneratedService1[R, C, S[-_, -_], T](implicit ev1: T <:< ZGeneratedService[R, C, S], ev2: T <:< S[R, C], ev3: GenericBindable[S], ev4: CanBind[C], - ev5: zio.Has.Union[R, C] + ev5: TransformableService[S], + ev6: Tag[C], + ev7: IsNotIntersection[C] ): ZBindableService[R, T] = new ZBindableService[R, T] { def bindService(s: T): zio.URIO[R, ServerServiceDefinition] = - ZIO.accessM[R](r => ev3.bind(s, t => ev5.union(r, ev4.bind(t)))) - } - - implicit def fromZGeneratedService2[C, S[-_, -_], T](implicit - ev1: T <:< ZGeneratedService[Any, C, S], - ev2: T <:< S[Any, C], - ev3: GenericBindable[S], - ev4: CanBind[C] - ): ZBindableService[Any, T] = - new ZBindableService[Any, T] { - def bindService(s: T): zio.URIO[Any, ServerServiceDefinition] = - ZIO.accessM[Any](_ => ev3.bind(s, t => ev4.bind(t))) + ev3.bind(ev5.transformContext(s, ev4.bind(_))) } } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala index bc28823f0..dc9570512 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala @@ -5,6 +5,7 @@ import io.grpc.CallOptions import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.client.ZClientCall +import zio.ZEnvironment abstract class ZClientInterceptor[R] { self => @@ -14,14 +15,14 @@ abstract class ZClientInterceptor[R] { clientCall: ZClientCall[R, Req, Res] ): ZClientCall[R, Req, Res] - def provide(r: R): ZClientInterceptor[Any] = + def provideEnvironment(r: => ZEnvironment[R]): ZClientInterceptor[Any] = new ZClientInterceptor[Any] { def interceptCall[Req, Res]( methodDescriptor: MethodDescriptor[Req, Res], call: CallOptions, clientCall: ZClientCall[Any, Req, Res] ): ZClientCall[Any, Req, Res] = - self.interceptCall(methodDescriptor, call, clientCall).provide(r) + self.interceptCall(methodDescriptor, call, clientCall).provideEnvironment(r) } } @@ -59,7 +60,7 @@ object ZClientInterceptor { ): ZClientCall[R, Req, Res] = ZClientCall.headersTransformer( clientCall, - md => effect(methodDescriptor, call, md) *> ZIO.succeed(md) + md => effect(methodDescriptor, call, md).as(md) ) } } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala index 4e83fcdd3..07a34b2f5 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala @@ -1,6 +1,5 @@ package scalapb.zio_grpc -import zio.Has import zio.URIO import io.grpc.ServerServiceDefinition @@ -9,5 +8,5 @@ trait ZGeneratedService[-R, -C, S[-_, -_]] { } trait GenericBindable[S[_, _]] { - def bind[R, C](s: S[R, C], env: Has[RequestContext] => R with C): URIO[R, ServerServiceDefinition] + def bind[R](s: S[R, RequestContext]): URIO[R, ServerServiceDefinition] } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala index 798a6a145..194230a43 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala @@ -2,14 +2,15 @@ package scalapb.zio_grpc import zio.ZIO import zio.stream.ZStream -import zio.Has import zio.Tag +import zio.ZEnvironment +import zio.IsNotIntersection /** Describes a transformation of an effect or a stream. * - * Instances of this class can be used to apply a transformation to all methods of a service - * to generate a new "decorated" service. This can be used for pre- or post-processing of - * requests/responses and also for environment and context transformations. + * Instances of this class can be used to apply a transformation to all methods of a service to generate a new + * "decorated" service. This can be used for pre- or post-processing of requests/responses and also for environment and + * context transformations. */ trait ZTransform[+RIn, E, -ROut] { self => def effect[A](io: ZIO[RIn, E, A]): ZIO[ROut, E, A] @@ -32,33 +33,41 @@ trait ZTransform[+RIn, E, -ROut] { self => object ZTransform { /** Returns a ZTransform that can provide some of the environment of a service */ - def provideSome[RIn, E, ROut](f: ROut => RIn): ZTransform[RIn, E, ROut] = + def provideSomeEnvironment[RIn, E, ROut](f: ZEnvironment[ROut] => ZEnvironment[RIn]): ZTransform[RIn, E, ROut] = new ZTransform[RIn, E, ROut] { - def effect[A](io: ZIO[RIn, E, A]): ZIO[ROut, E, A] = io.provideSome(f) - def stream[A](io: ZStream[RIn, E, A]): ZStream[ROut, E, A] = io.provideSome(f) + def effect[A](io: ZIO[RIn, E, A]): ZIO[ROut, E, A] = io.provideSomeEnvironment(f) + def stream[A](io: ZStream[RIn, E, A]): ZStream[ROut, E, A] = io.provideSomeEnvironment(f) } /** Provides the entire environment of a service (leaving only the context) */ - def provideEnv[R, E, Context]( - env: R - )(implicit union: Has.Union[R, Context]): ZTransform[R with Context, E, Context] = - provideSome(union.union(env, _)) + def provideEnvironment[R, E, Context: Tag]( + env: => ZEnvironment[R] + ): ZTransform[R with Context, E, Context] = + provideSomeEnvironment((ctx: ZEnvironment[Context]) => env.union[Context](ctx)) - /** Changes the Context type of the service from Context1 to Context2, by - * applying an effectful function on the environment + /** Changes the Context type of the service from Context1 to Context2, by applying an effectful function on the + * environment */ - def transformContext[RIn, E, ContextIn <: Has[_]: Tag, ROut <: RIn, ContextOut]( + def transformContext[RIn, E, ContextIn: Tag: IsNotIntersection, ROut <: RIn, ContextOut: Tag: IsNotIntersection]( f: ContextOut => ZIO[ROut, E, ContextIn] - )(implicit ev: RIn with ContextOut <:< RIn with Has[_]): ZTransform[RIn with ContextIn, E, ROut with ContextOut] = + ): ZTransform[RIn with ContextIn, E, ROut with ContextOut] = new ZTransform[RIn with ContextIn, E, ROut with ContextOut] { def effect[A](io: ZIO[RIn with ContextIn, E, A]): ZIO[ROut with ContextOut, E, A] = ZIO - .accessM(f) - .flatMap(nc => io.provideSome(ev(_).union[ContextIn](nc))) + .environmentWithZIO { (env: ZEnvironment[ROut with ContextOut]) => + f(env.get[ContextOut]).map(cin => env.add[ContextIn](cin)) + } + .flatMap { env => + io.provideEnvironment(env) + } def stream[A](io: ZStream[RIn with ContextIn, E, A]): ZStream[ROut with ContextOut, E, A] = ZStream - .fromEffect(ZIO.accessM(f)) - .flatMap(nc => io.provideSome(ev(_).union[ContextIn](nc))) + .fromZIO(ZIO.environmentWithZIO { (env: ZEnvironment[ROut with ContextOut]) => + f(env.get[ContextOut]).map(cin => env.add[ContextIn](cin)) + }) + .flatMap { env => + io.provideEnvironment(env) + } } } diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index 0531b6c05..763ef2b12 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -4,14 +4,13 @@ import io.grpc.Status import zio.IO import zio.stream.Stream import zio.Managed -import zio.Has package object zio_grpc { type GIO[A] = IO[Status, A] type GStream[A] = Stream[Status, A] - type Server = Has[Server.Service] + type Server = Server.Service type ZManagedChannel[R] = Managed[Throwable, ZChannel[R]] } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala b/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala index 887afc519..5bec5ad2d 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala @@ -3,6 +3,7 @@ package scalapb.zio_grpc import zio.ZIO import io.grpc.ManagedChannel import zio.Task +import zio.ZEnvironment class ZChannel[-R]( private[zio_grpc] val channel: ManagedChannel, @@ -10,6 +11,6 @@ class ZChannel[-R]( ) { def shutdown(): Task[Unit] = ZIO.unit - def provide(r: R): ZChannel[Any] = - new ZChannel[Any](channel, interceptors.map(_.provide(r))) + def provideEnvironment(r: ZEnvironment[R]): ZChannel[Any] = + new ZChannel[Any](channel, interceptors.map(_.provideEnvironment(r))) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index fb06572e3..ea1ef5e54 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -19,7 +19,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZIO[R, Status, Res] = - IO.effectAsync { callback => + IO.async { callback => channel.channel.client.rpcCall[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, req, @@ -39,7 +39,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[R, Status, Res] = - Stream.effectAsync[R, Status, Res] { cb => + Stream.async[R, Status, Res] { cb => channel.channel.client .serverStreaming[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala index 17af7dd0e..88a91d652 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala @@ -3,13 +3,13 @@ package scalapb.zio_grpc.client import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.SafeMetadata +import zio.ZEnvironment trait ZClientCall[-R, Req, Res] extends Any { - def provide(r: R): ZClientCall[Any, Req, Res] = ??? + def provideEnvironment(r: => ZEnvironment[R]): ZClientCall[Any, Req, Res] = ??? } object ZClientCall { - // def apply[R, Req, Res](s: io.grpc.ClientCall[Req, Res]): ZClientCall[R, Req, Res] = ??? def apply[R, Req, Res](s: String): ZClientCall[R, Req, Res] = ??? def headersTransformer[R, Req, Res]( diff --git a/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala index f27a23aef..48ed27eeb 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -1,7 +1,6 @@ package scalapb.zio_grpc.server import io.grpc.Status -import zio.Has import zio.Runtime import zio.ZIO import zio.stream.{Stream, ZStream} @@ -13,21 +12,21 @@ trait ServerCallHandler[Req, Res] object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZIO[Has[RequestContext], Status, Res] + impl: Req => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = ??? def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZStream[Has[RequestContext], Status, Res] + impl: Req => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = ??? def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZIO[Has[RequestContext], Status, Res] + impl: Stream[Status, Req] => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = ??? def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZStream[Has[RequestContext], Status, Res] + impl: Stream[Status, Req] => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = ??? } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 170247038..11ba24e5f 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -1,7 +1,6 @@ package scalapb.zio_grpc import zio.{Task, UIO, URIO, ZIO} -import zio.Has import zio.Managed import zio.ZLayer import zio.ZManaged @@ -9,6 +8,7 @@ import zio.Tag import io.grpc.ServerBuilder import io.grpc.ServerServiceDefinition +import zio.IsNotIntersection object Server { trait Service { @@ -22,15 +22,15 @@ object Server { } private[zio_grpc] class ServiceImpl(underlying: io.grpc.Server) extends Service { - def port: Task[Int] = ZIO.effect(underlying.getPort()) + def port: Task[Int] = ZIO.attempt(underlying.getPort()) - def shutdown: Task[Unit] = ZIO.effect(underlying.shutdown()).unit + def shutdown: Task[Unit] = ZIO.attempt(underlying.shutdown()).unit - def start: Task[Unit] = ZIO.effect(underlying.start()).unit + def start: Task[Unit] = ZIO.attempt(underlying.start()).unit - def shutdownNow: Task[Unit] = ZIO.effect(underlying.shutdownNow()).unit + def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit - def toManaged: ZManaged[Any, Throwable, Service] = start.as(this).toManaged(_ => this.shutdown.ignore) + def toManaged: ZManaged[Any, Throwable, Service] = start.as(this).toManagedWith(_ => this.shutdown.ignore) } @deprecated("Use ManagedServer.fromBuilder", "0.4.0") @@ -104,104 +104,27 @@ object Server { ) ) - @deprecated("Use ServerLayer.fromService", "0.4.0") - def zlive[R0, S0: Tag]( - builder: => ServerBuilder[_] - )(implicit - b0: ZBindableService[R0, S0] - ): ZLayer[R0 with Has[S0], Throwable, Server] = - ZLayer.fromServiceManaged((s0: S0) => Server.zmanaged(builder, s0)) - - @deprecated("Use ServerLayer.fromServices", "0.4.0") - def zlive[ - R0, - S0: Tag, - R1, - S1: Tag - ]( - builder: => ServerBuilder[_] - )(implicit - b0: ZBindableService[R0, S0], - b1: ZBindableService[R1, S1] - ): ZLayer[R0 with R1 with Has[S0] with Has[S1], Throwable, Server] = - ZLayer.fromServicesManaged[S0, S1, R0 with R1, Throwable, Server.Service] { (s0: S0, s1: S1) => - Server.zmanaged(builder, s0, s1) - } - - @deprecated("Use ServerLayer.fromServices", "0.4.0") - def zlive[ - R0, - S0: Tag, - R1, - S1: Tag, - R2, - S2: Tag - ]( - builder: => ServerBuilder[_] - )(implicit - b0: ZBindableService[R0, S0], - b1: ZBindableService[R1, S1], - b2: ZBindableService[R2, S2] - ): ZLayer[R0 with R1 with R2 with Has[S0] with Has[S1] with Has[ - S2 - ], Throwable, Server] = - ZLayer.fromServicesManaged[ - S0, - S1, - S2, - R0 with R1 with R2, - Throwable, - Server.Service - ]((s0: S0, s1: S1, s2: S2) => Server.zmanaged(builder, s0, s1, s2)) - - @deprecated("Use ServerLayer.access", "0.4.0") - def live[S0: Tag]( - builder: => ServerBuilder[_] - )(implicit - b0: ZBindableService[Any, S0] - ): ZLayer[Has[S0], Throwable, Server] = - zlive[Any, S0](builder) - - @deprecated("Use ServerLayer.fromServiceList(ServiceList.access[S0].access[S1])", "0.4.0") - def live[S0: Tag, S1: Tag]( - builder: => ServerBuilder[_] - )(implicit - b0: ZBindableService[Any, S0], - b1: ZBindableService[Any, S1] - ): ZLayer[Has[S0] with Has[S1], Throwable, Server] = - zlive[Any, S0, Any, S1](builder) - - @deprecated("Use ServerLayer.fromServiceList(ServiceList.access[S0].access[S1].access[S2])", "0.4.0") - def live[S0: Tag, S1: Tag, S2: Tag]( - builder: => ServerBuilder[_] - )(implicit - b0: ZBindableService[Any, S0], - b1: ZBindableService[Any, S1], - b2: ZBindableService[Any, S2] - ): ZLayer[Has[S0] with Has[S1] with Has[S2], Throwable, Server] = - zlive[Any, S0, Any, S1, Any, S2](builder) - def fromManaged(zm: Managed[Throwable, Service]) = - ZLayer.fromManaged(zm.map(s => Has(s))) + ZLayer.fromManaged(zm) } object ServerLayer { def fromServiceList[R](builder: => ServerBuilder[_], l: ServiceList[R]) = ManagedServer.fromServiceList(builder, l).toLayer - def access[S1: Tag]( + def access[S1: Tag: IsNotIntersection]( builder: => ServerBuilder[_] - )(implicit bs: ZBindableService[Any, S1]): ZLayer[Any with Has[S1], Throwable, Server] = + )(implicit bs: ZBindableService[Any, S1]): ZLayer[Any with S1, Throwable, Server] = fromServiceList(builder, ServiceList.access[S1]) - def accessEnv[R, S1: Tag]( + def accessEnv[R, S1: Tag: IsNotIntersection]( builder: => ServerBuilder[_] - )(implicit bs: ZBindableService[R, S1]): ZLayer[R with Has[S1], Throwable, Server] = + )(implicit bs: ZBindableService[R, S1]): ZLayer[R with S1, Throwable, Server] = fromServiceList(builder, ServiceList.accessEnv[R, S1]) - def fromServiceLayer[R, S1: Tag]( + def fromServiceLayer[R, S1: Tag: IsNotIntersection]( serverBuilder: => ServerBuilder[_] - )(l: ZLayer[R, Throwable, Has[S1]])(implicit bs: ZBindableService[Any, S1]) = + )(l: ZLayer[R, Throwable, S1])(implicit bs: ZBindableService[Any, S1]) = l >>> fromServiceList(serverBuilder, ServiceList.access[S1]) def fromService[R1, S1](builder: => ServerBuilder[_], s1: S1)(implicit @@ -248,7 +171,7 @@ object ManagedServer { def fromServiceList[R]( builder: => ServerBuilder[_], services: URIO[R, List[ServerServiceDefinition]] - ): ZManaged[R, Throwable, Server.Service] = fromServiceList(builder, services.toManaged_) + ): ZManaged[R, Throwable, Server.Service] = fromServiceList(builder, services.toManaged) def fromServiceList[R]( builder: => ServerBuilder[_], @@ -264,9 +187,9 @@ object ManagedServer { services0 <- services serverImpl = new Server.ServiceImpl( services0 - .foldLeft(builder)({ case (b, s) => + .foldLeft(builder) { case (b, s) => b.addService(s) - }) + } .build() ) server <- serverImpl.toManaged diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala index fc721ce28..bf1c72cf6 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala @@ -1,15 +1,15 @@ package scalapb.zio_grpc import zio._ -import zio.console._ +import zio.Console._ import io.grpc.ServerBuilder import io.grpc.protobuf.services.ProtoReflectionService /** Quick-start server app. */ -trait ServerMain extends zio.App { +trait ServerMain extends zio.ZIOAppDefault { def port: Int = 9000 def welcome: ZIO[ZEnv, Throwable, Unit] = - putStrLn("Server is running. Press Ctrl-C to stop.") + printLine("Server is running. Press Ctrl-C to stop.") // Override this to add services. For example // def serviceList = @@ -22,5 +22,5 @@ trait ServerMain extends zio.App { val myAppLogic = welcome *> serverLive.build.useForever - def run(args: List[String]) = myAppLogic.exitCode + def run = myAppLogic.exitCode } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala index 15223587b..b81bef2cf 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala @@ -1,7 +1,9 @@ package scalapb.zio_grpc -import zio.{Has, Tag, ZIO, ZLayer, ZManaged} +import zio.{Tag, ZIO, ZLayer, ZManaged} import io.grpc.ServerServiceDefinition +import zio.IsNotIntersection +import zio.ZEnvironment /** Represents a managed list of services to be added to the a server. * @@ -17,29 +19,26 @@ sealed class ServiceList[-RR] private[scalapb] (val bindAll: ZManaged[RR, Throwa def addM[R1 <: RR, R2 <: RR, S1]( s1: ZIO[R2, Throwable, S1] )(implicit b: ZBindableService[R1, S1]): ServiceList[R1 with R2] = - addManaged[R1, R2, S1](s1.toManaged_) + addManaged[R1, R2, S1](s1.toManaged) def addManaged[R1 <: RR, R2 <: RR, S1](s1: ZManaged[R2, Throwable, S1])(implicit bs: ZBindableService[R1, S1] ): ServiceList[RR with R1 with R2] = new ServiceList(for { l <- bindAll - sd <- s1.mapM(bs.bindService(_)) + sd <- s1.mapZIO(bs.bindService(_)) } yield sd :: l) /** Adds a dependency on a service that will be provided later from the environment or a Layer * */ - def access[B: Tag](implicit bs: ZBindableService[Any, B]): ServiceList[Has[B] with RR] = + def access[B: IsNotIntersection: Tag](implicit bs: ZBindableService[Any, B]): ServiceList[B with RR] = accessEnv[Any, B] - def accessEnv[R, B: Tag](implicit bs: ZBindableService[R, B]): ServiceList[R with Has[B] with RR] = - new ServiceList(ZManaged.accessManaged[R with Has[B] with RR] { r => - bindAll.mapM(ll => bs.bindService(r.get[B]).map(_ :: ll)) + def accessEnv[R, B: IsNotIntersection: Tag](implicit bs: ZBindableService[R, B]): ServiceList[R with B with RR] = + new ServiceList(ZManaged.environmentWithManaged[R with B with RR] { r => + bindAll.mapZIO(ll => bs.bindService(r.get[B]).map(_ :: ll)) }) - def provide(r: RR): ServiceList[Any] = new ServiceList[Any](bindAll.provide(r)) - - def provideLayer[R1 <: RR](layer: ZLayer[Any, Throwable, R1]): ServiceList[Any] = - new ServiceList[Any](bindAll.provideLayer(layer)) + def provideEnvironment(r: => ZEnvironment[RR]): ServiceList[Any] = new ServiceList[Any](bindAll.provideEnvironment(r)) } object ServiceList extends ServiceList(ZManaged.succeed(Nil)) { diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceModule.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceModule.scala index 5d0141ca5..d10cf9e3f 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceModule.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceModule.scala @@ -1,7 +1,5 @@ package scalapb.zio_grpc -import zio.Has - trait ServiceModule { type Service[R] @@ -9,5 +7,5 @@ trait ServiceModule { channel: io.grpc.Channel, options: io.grpc.CallOptions = io.grpc.CallOptions.DEFAULT, headers: => io.grpc.Metadata = new io.grpc.Metadata() - ): Has[Service[Any]] + ): Service[Any] } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala index bdbac8e07..74366596e 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala @@ -5,6 +5,7 @@ import io.grpc.MethodDescriptor import scalapb.zio_grpc.client.ZClientCall import zio.{Task, UIO, ZIO} import io.grpc.ManagedChannel +import zio.ZEnvironment class ZChannel[-R]( private[zio_grpc] val channel: ManagedChannel, @@ -13,14 +14,14 @@ class ZChannel[-R]( def newCall[Req, Res]( methodDescriptor: MethodDescriptor[Req, Res], options: CallOptions - ): UIO[ZClientCall[R, Req, Res]] = ZIO.effectTotal( + ): UIO[ZClientCall[R, Req, Res]] = ZIO.succeed( interceptors.foldLeft[ZClientCall[R, Req, Res]]( ZClientCall(channel.newCall(methodDescriptor, options)) )((call, interceptor) => interceptor.interceptCall(methodDescriptor, options, call)) ) - def shutdown(): Task[Unit] = ZIO.effect(channel.shutdown()).unit + def shutdown(): Task[Unit] = ZIO.attempt(channel.shutdown()).unit - def provide(r: R): ZChannel[Any] = - new ZChannel[Any](channel, interceptors.map(_.provide(r))) + def provideEnvironment(r: ZEnvironment[R]): ZChannel[Any] = + new ZChannel[Any](channel, interceptors.map(_.provideEnvironment(r))) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala index 88d62eb5d..c392432ac 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala @@ -9,12 +9,12 @@ object ZManagedChannel { builder: => ManagedChannelBuilder[_], interceptors: Seq[ZClientInterceptor[R]] = Nil ): ZManagedChannel[R] = - ZManaged.make(ZIO.effect(new ZChannel(builder.build(), interceptors)))( + ZManaged.acquireReleaseWith(ZIO.attempt(new ZChannel(builder.build(), interceptors)))( _.shutdown().ignore ) def apply(builder: ManagedChannelBuilder[_]): ZManagedChannel[Any] = - ZManaged.make(ZIO.effect(new ZChannel(builder.build(), Nil)))( + ZManaged.acquireReleaseWith(ZIO.attempt(new ZChannel(builder.build(), Nil)))( _.shutdown().ignore ) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala index 498647c16..002eaf0f7 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala @@ -14,11 +14,10 @@ object ClientCalls { def anyExitHandler[R, Req, Res]( call: ZClientCall[R, Req, Res] ) = - (_: Any, ex: Exit[Any, Any]) => { - ZIO.when(!ex.succeeded) { + (_: Any, ex: Exit[Any, Any]) => + ZIO.when(!ex.isSuccess) { call.cancel("Interrupted").ignore } - } def unaryCall[R, Req, Res]( channel: ZChannel[R], @@ -36,7 +35,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZIO[R, Status, Res] = - ZIO.bracketExit(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => + ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => call.start(listener, headers) *> call.request(1) *> call.sendMessage(req) *> @@ -52,7 +51,7 @@ object ClientCalls { req: Req ): ZStream[R, Status, Res] = Stream - .fromEffect(channel.newCall(method, options)) + .fromZIO(channel.newCall(method, options)) .flatMap(serverStreamingCall(_, headers, req)) private def serverStreamingCall[R, Req, Res]( @@ -61,12 +60,12 @@ object ClientCalls { req: Req ): ZStream[R, Status, Res] = Stream - .bracketExit( + .acquireReleaseExitWith( StreamingClientCallListener.make[R, Res](call) )(anyExitHandler[R, Req, Res](call)) .flatMap { (listener: StreamingClientCallListener[R, Res]) => Stream - .fromEffect( + .fromZIO( call.start(listener, headers) *> call.request(1) *> call.sendMessage(req) *> @@ -97,9 +96,9 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZIO[R with R0, Status, Res] = - ZIO.bracketExit(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => - val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromEffect(call.halfClose()).drain - val resultStream = ZStream.fromEffect(listener.getValue) + ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => + val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain + val resultStream = ZStream.fromZIO(listener.getValue) call.start(listener, headers) *> call.request(1) *> @@ -117,7 +116,7 @@ object ClientCalls { req: ZStream[R0, Status, Req] ): ZStream[R with R0, Status, Res] = Stream - .fromEffect( + .fromZIO( channel.newCall(method, options) ) .flatMap(bidiCall(_, headers, req)) @@ -128,17 +127,17 @@ object ClientCalls { req: ZStream[R0, Status, Req] ): ZStream[R with R0, Status, Res] = Stream - .bracketExit( + .acquireReleaseExitWith( StreamingClientCallListener.make[R, Res](call) )(anyExitHandler(call)) .flatMap { (listener: StreamingClientCallListener[R, Res]) => val init = Stream - .fromEffect( + .fromZIO( call.start(listener, headers) *> call.request(1) ) val sendRequestStream = (init ++ req.tap(call.sendMessage) ++ Stream - .fromEffect(call.halfClose())).drain + .fromZIO(call.halfClose())).drain sendRequestStream.merge(listener.stream) } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 3b92dec84..2bd578169 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -30,13 +30,11 @@ class StreamingClientCallListener[R, Res]( override def onHeaders(headers: Metadata): Unit = runtime.unsafeRun( - state - .update({ - case Initial => HeadersReceived(headers) - case HeadersReceived(_) => Failure("onHeaders already called") - case f @ Failure(_) => f - }) - .unit + state.update { + case Initial => HeadersReceived(headers) + case HeadersReceived(_) => Failure("onHeaders already called") + case f @ Failure(_) => f + }.unit ) override def onMessage(message: Res): Unit = diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index e0917e035..887a920db 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -29,27 +29,23 @@ class UnaryClientCallListener[Res]( override def onHeaders(headers: Metadata): Unit = runtime.unsafeRun( - state - .update({ - case Initial => HeadersReceived(headers) - case HeadersReceived(_) => Failure("onHeaders already called") - case ResponseReceived(_, _) => Failure("onHeaders already called") - case f @ Failure(_) => f - }) - .unit + state.update { + case Initial => HeadersReceived(headers) + case HeadersReceived(_) => Failure("onHeaders already called") + case ResponseReceived(_, _) => Failure("onHeaders already called") + case f @ Failure(_) => f + }.unit ) override def onMessage(message: Res): Unit = runtime.unsafeRun( - state - .update({ - case Initial => Failure("onMessage called before onHeaders") - case HeadersReceived(headers) => ResponseReceived(headers, message) - case ResponseReceived(_, _) => - Failure("onMessage called more than once for unary call") - case f @ Failure(_) => f - }) - .unit + state.update { + case Initial => Failure("onMessage called before onHeaders") + case HeadersReceived(headers) => ResponseReceived(headers, message) + case ResponseReceived(_, _) => + Failure("onMessage called more than once for unary call") + case f @ Failure(_) => f + }.unit ) override def onClose(status: Status, trailers: Metadata): Unit = diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala index f7dd79dd1..760b52d7e 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala @@ -6,6 +6,7 @@ import scalapb.zio_grpc.GIO import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.SafeMetadata +import zio.ZEnvironment trait ZClientCall[-R, Req, Res] extends Any { self => @@ -22,41 +23,41 @@ trait ZClientCall[-R, Req, Res] extends Any { def sendMessage(message: Req): ZIO[R, Status, Unit] - def provide(r: R): ZClientCall[Any, Req, Res] = + def provideEnvironment(r: => ZEnvironment[R]): ZClientCall[Any, Req, Res] = new ZClientCall[Any, Req, Res] { def start( responseListener: Listener[Res], headers: SafeMetadata ): ZIO[Any, Status, Unit] = - self.start(responseListener, headers).provide(r) + self.start(responseListener, headers).provideEnvironment(r) def request(numMessages: Int): ZIO[Any, Status, Unit] = - self.request(numMessages).provide(r) + self.request(numMessages).provideEnvironment(r) def cancel(message: String): ZIO[Any, Status, Unit] = - self.cancel(message).provide(r) + self.cancel(message).provideEnvironment(r) - def halfClose(): ZIO[Any, Status, Unit] = self.halfClose().provide(r) + def halfClose(): ZIO[Any, Status, Unit] = self.halfClose().provideEnvironment(r) def sendMessage(message: Req): ZIO[Any, Status, Unit] = - self.sendMessage(message).provide(r) + self.sendMessage(message).provideEnvironment(r) } } class ZClientCallImpl[Req, Res](private val call: ClientCall[Req, Res]) extends AnyVal with ZClientCall[Any, Req, Res] { def start(responseListener: Listener[Res], headers: SafeMetadata): GIO[Unit] = - GIO.effect(call.start(responseListener, headers.metadata)) + GIO.attempt(call.start(responseListener, headers.metadata)) def request(numMessages: Int): GIO[Unit] = - GIO.effect(call.request(numMessages)) + GIO.attempt(call.request(numMessages)) def cancel(message: String): GIO[Unit] = - GIO.effect(call.cancel(message, null)) + GIO.attempt(call.cancel(message, null)) - def halfClose(): GIO[Unit] = GIO.effect(call.halfClose()) + def halfClose(): GIO[Unit] = GIO.attempt(call.halfClose()) def sendMessage(message: Req): GIO[Unit] = - GIO.effect(call.sendMessage(message)) + GIO.attempt(call.sendMessage(message)) } object ZClientCall { @@ -92,6 +93,6 @@ object ZClientCall { responseListener: Listener[Res], headers: SafeMetadata ): ZIO[R, Status, Unit] = - updateHeaders(headers) >>= { h => delegate.start(responseListener, h) } + updateHeaders(headers) flatMap { h => delegate.start(responseListener, h) } } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala index 4026661c9..1c31b0f3f 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala @@ -11,10 +11,8 @@ import io.grpc.Metadata * * The listener is returned to grpc-java to feed input into the request. * - * The `run` represents an effect of running the request: it reads the - * input provided to the listener, and writes the response to an output - * channel. It handles interrupts by sending a cancel event through the - * channel. + * The `run` represents an effect of running the request: it reads the input provided to the listener, and writes the + * response to an output channel. It handles interrupts by sending a cancel event through the channel. */ case class CallDriver[R, Req]( listener: Listener[Req], @@ -25,7 +23,7 @@ object CallDriver { def exitToStatus(ex: Exit[Status, Unit]): Status = ex.fold( failed = { cause => - if (cause.interruptedOnly) Status.CANCELLED + if (cause.isInterruptedOnly) Status.CANCELLED else cause.failureOption.getOrElse(Status.INTERNAL) }, completed = _ => Status.OK @@ -63,7 +61,7 @@ object CallDriver { call.request(2) *> completed.await *> call.sendHeaders(new Metadata) *> - request.await >>= writeResponse + request.await flatMap writeResponse ).onExit(ex => call.close(CallDriver.exitToStatus(ex), new Metadata).ignore) .ignore .race(cancelled.await) @@ -71,8 +69,8 @@ object CallDriver { /** Creates a [[CallDriver]] for a request with a unary input. * - * writeResponse: given a request, returns a effects that computes - * the response and writes it through the given ZServerCall. + * writeResponse: given a request, returns a effects that computes the response and writes it through the given + * ZServerCall. */ def makeUnaryInputCallDriver[R, Req, Res]( writeResponse: ( @@ -126,7 +124,9 @@ object CallDriver { (call.request(1) *> call.sendHeaders(new Metadata) *> writeResponse(requestStream)) - .onExit(ex => call.close(CallDriver.exitToStatus(ex), new Metadata).ignore) + .onExit { ex => + call.close(CallDriver.exitToStatus(ex), new Metadata).ignore + } .ignore .race(cancelled.await) } @@ -134,8 +134,8 @@ object CallDriver { /** Creates a [[CallDriver]] for a request with a streaming input. * - * writeResponse: given a request, returns a effects that computes - * the response and writes it through the given ZServerCall. + * writeResponse: given a request, returns a effects that computes the response and writes it through the given + * ZServerCall. */ def makeStreamingInputCallDriver[R, Req, Res]( writeResponse: ( diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala index aaf6e615e..a4b8cf2c2 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala @@ -6,14 +6,14 @@ import scalapb.zio_grpc.GIO /** Wrapper around [[io.grpc.ServerCall]] that lifts its effects into ZIO values */ class ZServerCall[Res](private val call: ServerCall[_, Res]) extends AnyVal { - def request(n: Int): GIO[Unit] = GIO.fromTask(ZIO.effect(call.request(n))) + def request(n: Int): GIO[Unit] = GIO.fromTask(ZIO.attempt(call.request(n))) def sendMessage(message: Res): GIO[Unit] = - GIO.fromTask(ZIO.effect(call.sendMessage(message))) + GIO.fromTask(ZIO.attempt(call.sendMessage(message))) def sendHeaders(headers: Metadata): GIO[Unit] = - GIO.fromTask(ZIO.effect(call.sendHeaders(headers))) + GIO.fromTask(ZIO.attempt(call.sendHeaders(headers))) def close(status: Status, metadata: Metadata): GIO[Unit] = - GIO.fromTask(ZIO.effect(call.close(status, metadata))) + GIO.fromTask(ZIO.attempt(call.close(status, metadata))) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 15b69700c..ab3b373ff 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -21,7 +21,7 @@ class ZServerCallHandler[R, Req, Res]( ): Listener[Req] = { val zioCall = new ZServerCall(call) val runner = for { - driver <- SafeMetadata.fromMetadata(headers) >>= { md => + driver <- SafeMetadata.fromMetadata(headers) flatMap { md => mkDriver(zioCall, RequestContext.fromServerCall(md, call)) } // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener @@ -57,38 +57,41 @@ object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZIO[Has[RequestContext], Status, Res] + impl: Req => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = unaryInput( runtime, - (req, requestContext, call) => impl(req).provide(Has(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) + (req, requestContext, call) => + impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) ) def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZStream[Has[RequestContext], Status, Res] + impl: Req => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = unaryInput( runtime, - (req: Req, metadata: RequestContext, call: ZServerCall[Res]) => - impl(req).provide(Has(metadata)).foreach(call.sendMessage) + (req: Req, requestContext: RequestContext, call: ZServerCall[Res]) => + impl(req).provideEnvironment(ZEnvironment(requestContext)).foreach(call.sendMessage) ) def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZIO[Has[RequestContext], Status, Res] + impl: Stream[Status, Req] => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = streamingInput( runtime, - (req, metadata, call) => impl(req).provide(Has(metadata)).flatMap[Any, Status, Unit](call.sendMessage) + (req, requestContext, call) => + impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) ) def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZStream[Has[RequestContext], Status, Res] + impl: Stream[Status, Req] => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = streamingInput( runtime, - (req, metadata, call) => impl(req).provide(Has(metadata)).foreach(call.sendMessage) + (req, requestContext, call) => + impl(req).provideEnvironment(ZEnvironment(requestContext)).foreach(call.sendMessage) ) } diff --git a/docs/basics.md b/docs/basics.md index ed0812a77..e6638a77b 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -350,7 +350,7 @@ S.example("routeguide/RouteGuideClientApp.scala", "getFeature") We create and populate a request protocol buffer object (in our case `Point`), pass it to the `getFeature()` method on our accessor, and get back an effect that needs a `RouteGuideClient` environment. We chain -the response with a call to `putStrLn` to print the result on the console, +the response with a call to `printLine` to print the result on the console, and we catch the `NOT_FOUND` response and print an error. All other errors are not handled at this level and will "bubble up" up to the program's `exitCode` handler. diff --git a/docs/context.md b/docs/context.md index 4ca6e83d5..71be981ad 100644 --- a/docs/context.md +++ b/docs/context.md @@ -9,11 +9,12 @@ depends on an environment of type `R` and a context of type `Context`. `Context` and `R` can be of any Scala type, however when they are not `Any` they have to be wrapped in an `Has[]`. This allows ZIO gRPC to combine two values (`Context with R`) when providing the values at effect execution time. -For example, we can define a service for which the effects depend on `Console`, and for each request we expect to get a context of type `User`. Note that `Console` is a type-alias to `Has[Console.Service]` so there is no need wrap it once more in an `Has`. +For example, we can define a service for which the effects depend on `Console`, and for each request we expect to get a context of type `User`. ```scala mdoc import zio.{Has, ZIO} -import zio.console._ +import zio.Console +import zio.Console.printLine import scalapb.zio_grpc.RequestContext import myexample.testservice.ZioTestservice.ZSimpleService import myexample.testservice.{Request, Response} @@ -21,11 +22,11 @@ import io.grpc.Status case class User(name: String) -object MyService extends ZSimpleService[Console, Has[User]] { - def sayHello(req: Request): ZIO[Console with Has[User], Status, Response] = +object MyService extends ZSimpleService[Has[Console], Has[User]] { + def sayHello(req: Request): ZIO[Has[Console] with Has[User], Status, Response] = for { user <- ZIO.service[User] - _ <- putStrLn("I am here!").orDie + _ <- printLine("I am here!").orDie } yield Response(s"Hello, ${user.name}") } ``` @@ -92,7 +93,7 @@ object UserDatabase { // accessor def fetchUser(name: String): ZIO[UserDatabase, Status, User] = - ZIO.accessM[UserDatabase](_.get.fetchUser(name)) + ZIO.accessZIO[UserDatabase](_.get.fetchUser(name)) val live = zio.ZLayer.succeed( new Service { @@ -105,8 +106,8 @@ object UserDatabase { Now, The context transformation effect we apply may introduce an additional environmental dependency to our service. For example: ```scala mdoc -import zio.clock._ -import zio.duration._ +import zio.Clock._ +import zio.Duration._ val myServiceAuthWithDatabase = MyService.transformContextM { @@ -132,6 +133,7 @@ a `Has[RequestContext]` context. To use this layer in an app, we can wire it lik ```scala mdoc import scalapb.zio_grpc.ServerLayer +import zio.ZLayer val serverLayer = ServerLayer.fromServiceLayer( @@ -141,10 +143,10 @@ val serverLayer = val ourApp = (UserDatabase.live ++ Console.any) >>> serverLayer -object LayeredApp extends zio.App { - def run(args: List[String]) = ourApp.build.useForever.exitCode +object LayeredApp extends zio.ZIOAppDefault { + def run = ourApp.build.useForever.exitCode } ``` -`serverLayer` wraps around our service layer to produce a server. Then, `ourApp` layer is constructed such that it takes `UserDatabase.live` in conjuction to a passthrough layer for `Console` to satisfy the two input requirements of `serverLayer`. The outcome, `ourApp`, is a `ZLayer` that can produce a `Server` from a `Console`. In the `run` method we build the layer and run it. Note that we are directly using a `zio.App` rather than `ServerMain` which does +`serverLayer` wraps around our service layer to produce a server. Then, `ourApp` layer is constructed such that it takes `UserDatabase.live` in conjuction to a passthrough layer for `Console` to satisfy the two input requirements of `serverLayer`. The outcome, `ourApp`, is a `ZLayer` that can produce a `Server` from a `Console`. In the `run` method we build the layer and run it. Note that we are directly using a `zio.ZioAppDefault` rather than `ServerMain` which does not support this use case yet. diff --git a/docs/deadlines.md b/docs/deadlines.md index c16c3ae22..e2142c51f 100644 --- a/docs/deadlines.md +++ b/docs/deadlines.md @@ -30,7 +30,7 @@ import io.grpc.ManagedChannelBuilder import io.grpc.CallOptions import java.util.concurrent.TimeUnit import zio._ -import zio.console._ +import zio.Console._ val channel = ZManagedChannel( ManagedChannelBuilder @@ -41,14 +41,14 @@ val channel = ZManagedChannel( // create layer: val clientLayer = ServiceNameClient.live( channel, - options=ZIO.effectTotal( + options=ZIO.succeed( CallOptions.DEFAULT.withDeadlineAfter(3000, TimeUnit.MILLISECONDS)), headers=SafeMetadata.make) val myAppLogicNeedsEnv = for { // use layer through accessor methods: res <- ServiceNameClient.unary(Request()) - _ <- putStrLn(res.toString) + _ <- printLine(res.toString) } yield () ``` diff --git a/docs/decorating.md b/docs/decorating.md index c2924f602..7155e3a9d 100644 --- a/docs/decorating.md +++ b/docs/decorating.md @@ -27,10 +27,10 @@ class LoggingTransform[R] extends ZTransform[R, Status, R with Has[RequestContex def accessLog: URIO[Has[RequestContext], Unit] = ??? override def effect[A](io: ZIO[R, Status, A]): ZIO[R with Has[RequestContext], Status, A] = - io.zipLeft(accessLog).tapCause(logCause) + io.zipLeft(accessLog).tapErrorCause(logCause) override def stream[A](io: ZStream[R, Status, A]): ZStream[R with Has[RequestContext], Status, A] = - (io ++ ZStream.fromEffect(accessLog).drain).onError(logCause) + (io ++ ZStream.fromZIO(accessLog).drain).onError(logCause) } ``` diff --git a/docs/generated-code.md b/docs/generated-code.md index a593bb0c5..ea33f2c88 100644 --- a/docs/generated-code.md +++ b/docs/generated-code.md @@ -125,7 +125,7 @@ A single `ZManagedChannel` represent a virtual connection to a conceptual endpoi import myexample.testservice.ZioTestservice.ServiceNameClient import myexample.testservice.{Request, Response} import zio._ -import zio.console._ +import zio.Console._ // create layer: val clientLayer = ServiceNameClient.live(channel) @@ -133,20 +133,20 @@ val clientLayer = ServiceNameClient.live(channel) val myAppLogicNeedsEnv = for { // use layer through accessor methods: res <- ServiceNameClient.unary(Request()) - _ <- putStrLn(res.toString) + _ <- printLine(res.toString) } yield () // myAppLogicNeedsEnv needs access to a ServiceNameClient. We turn it into // a self-contained effect (IO) by providing the layer to it: val myAppLogic1 = myAppLogicNeedsEnv.provideCustomLayer(clientLayer) -object LayeredApp extends zio.App { - def run(args: List[String]): URIO[ZEnv, ExitCode] = myAppLogic1.exitCode +object LayeredApp extends zio.ZIOAppDefault { + def run: URIO[ZEnv, ExitCode] = myAppLogic1.exitCode } ``` Here the application is broken to multiple value assignments so you can see the types. -The first effect `myAppLogicNeedsEnv` uses accessor functions, which makes it depend on an environment of type `ServiceNameClient`. It chains the `unary` RPC with printing the result to the console, and hence the final inferred effect type is `ServiceNameClient with Console`. Once we provide our custom layer, the effect type is `ZEnv`, which we can use with ZIO's run method. +The first effect `myAppLogicNeedsEnv` uses accessor functions, which makes it depend on an environment of type `ServiceNameClient`. It chains the `unary` RPC with printing the result to the console, and hence the final inferred effect type is `ServiceNameClient with Has[Console]`. Once we provide our custom layer, the effect type is `ZEnv`, which we can use with ZIO's `exit` method. ### Using a Managed Client diff --git a/docs/quickstart.md b/docs/quickstart.md index a72756951..987f9bfb1 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -109,9 +109,9 @@ Open `src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala`, and u def myAppLogic = for { r <- GreeterClient.sayHello(HelloRequest("World")) - _ <- putStrLn(r.message) + _ <- printLine(r.message) s <- GreeterClient.sayHelloAgain(HelloRequest("World")) - _ <- putStrLn(s.message) + _ <- printLine(s.message) } yield () ``` diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index b3690198c..e3f45b96b 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -1,9 +1,10 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.ZioTestservice.ZTestService -import zio.{Has, Managed, ZIO} -import zio.clock.Clock -import zio.console.Console +import zio.Clock +import zio.Console +import zio.Managed +import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.testservice.{Request, Response} import zio.stream.ZStream @@ -11,16 +12,20 @@ import io.grpc.ServerBuilder import zio.test._ object BindableServiceSpec extends DefaultRunnableSpec { - implicitly[ZBindableService[Any, ZTestService[Any, Has[RequestContext]]]] - implicitly[ZBindableService[Any, ZTestService[Any, Has[SafeMetadata]]]] + implicitly[ZBindableService[Any, ZTestService[Any, RequestContext]]] + implicitly[ZBindableService[Any, ZTestService[Any, SafeMetadata]]] implicitly[ZBindableService[Any, ZTestService[Any, Any]]] - implicitly[ZBindableService[Clock, ZTestService[Clock, Has[RequestContext]]]] - implicitly[ZBindableService[Clock, ZTestService[Clock, Has[SafeMetadata]]]] + implicitly[ZBindableService[Clock, ZTestService[Clock, RequestContext]]] + implicitly[ZBindableService[Clock, ZTestService[Clock, SafeMetadata]]] implicitly[ZBindableService[Clock, ZTestService[Clock, Any]]] - implicitly[ZBindableService[Clock with Console, ZTestService[Clock with Console, Has[RequestContext]]]] - implicitly[ZBindableService[Clock with Console, ZTestService[Clock with Console, Has[SafeMetadata]]]] + implicitly[ + ZBindableService[Clock with Console, ZTestService[Clock with Console, RequestContext]] + ] + implicitly[ + ZBindableService[Clock with Console, ZTestService[Clock with Console, SafeMetadata]] + ] implicitly[ZBindableService[Clock with Console, ZTestService[Clock with Console, Any]]] class UnimpTestService[P, R, C] extends ZTestService[R, C] { @@ -33,11 +38,11 @@ object BindableServiceSpec extends DefaultRunnableSpec { def bidiStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZStream[R with C, Status, Response] = ??? } - object S1 extends UnimpTestService[Int, Any, Has[RequestContext]] - object S2 extends UnimpTestService[Int, Any, Has[SafeMetadata]] + object S1 extends UnimpTestService[Int, Any, RequestContext] + object S2 extends UnimpTestService[Int, Any, SafeMetadata] object S3 extends UnimpTestService[Int, Any, Any] - object S4 extends UnimpTestService[Int, Clock, Has[SafeMetadata]] - object S5 extends UnimpTestService[Int, Clock, Has[RequestContext]] + object S4 extends UnimpTestService[Int, Clock, SafeMetadata] + object S5 extends UnimpTestService[Int, Clock, RequestContext] object S6 extends UnimpTestService[Int, Clock, Any] object S7 extends UnimpTestService[Int, Console, Any] @@ -68,5 +73,9 @@ object BindableServiceSpec extends DefaultRunnableSpec { val z8 = ServiceList.access[S1.type] val z9 = ServiceList.addManaged(Managed.succeed(S4)) - def spec = suite("BindableServiceSpec")() + def spec: ZSpec[ZTestEnv, scalapb.zio_grpc.BindableServiceSpec.Failure] = suite("BindableServiceSpec")( + test("empty - required to make the compiler happy") { + assertCompletes + } + ) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala index 0f9f36359..8cb9de1b1 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala @@ -4,22 +4,23 @@ import io.grpc.Status import scalapb.zio_grpc.TestUtils._ import scalapb.zio_grpc.server.CallDriver import zio._ -import zio.duration._ +import zio.Clock._ +import zio.Random._ import zio.test.{DefaultRunnableSpec, _} object CallDriverSpec extends DefaultRunnableSpec { def spec = suite("CallDriverSpec")( - testM("exitToStatus prioritizes failures over interrupts") { + test("exitToStatus prioritizes failures over interrupts") { val effectWithInterruptAndFailure = ZIO - .foreachParN_(128)(List.range(0, 16))(i => + .foreachParNDiscard(128)(List.range(0, 16))(i => for { - delay <- random.nextIntBetween(100, 200) - _ <- environment.live(clock.sleep(delay.milliseconds)) + delay <- nextIntBetween(100, 200) + _ <- ClockLive.sleep(delay.milliseconds) _ <- ZIO.fail(Status.INVALID_ARGUMENT.withDescription(s"i=$i")) } yield () ) - assertM(effectWithInterruptAndFailure.run map CallDriver.exitToStatus)( + assertM(effectWithInterruptAndFailure.exit map CallDriver.exitToStatus)( hasStatusCode(Status.INVALID_ARGUMENT) ) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala index ec56a3fdc..2bde39f77 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala @@ -12,7 +12,7 @@ object ClientCallsSpec extends DefaultRunnableSpec { def unarySuite = suite("unaryCall")( - testM("should not fail with 'INTERNAL: already started' on retry") { + test("should not fail with 'INTERNAL: already started' on retry") { for { meta <- SafeMetadata.make res <- ClientCalls @@ -31,7 +31,7 @@ object ClientCallsSpec extends DefaultRunnableSpec { Request(Request.Scenario.DELAY, in = 12) ) .retry(Schedule.recurs(2)) - .run + .exit } yield // There was a bug, when call.start was invoked multiple times, so this test was failing diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index bd563b9f9..2216d8f70 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -9,25 +9,25 @@ import io.grpc.ServerBuilder import io.grpc.Metadata import io.grpc.ManagedChannelBuilder import io.grpc.Status -import zio.console.Console +import zio.Console import zio.stream.ZStream -import zio.clock.Clock +import zio.Clock object EnvSpec extends DefaultRunnableSpec with MetadataTests { case class User(name: String) - val getUser = ZIO.access[Has[User]](_.get) + val getUser = ZIO.environmentWith[User](_.get) - object ServiceWithConsole extends ZTestService[Console with Clock, Has[User]] { - def unary(request: Request): ZIO[Console with Has[User], Status, Response] = + object ServiceWithConsole extends ZTestService[Console with Clock, User] { + def unary(request: Request): ZIO[Console with User, Status, Response] = for { user <- getUser } yield Response(out = user.name) def serverStreaming( request: Request - ): ZStream[Console with Has[User], Status, Response] = - ZStream.accessStream { (u: Has[User]) => + ): ZStream[Console with User, Status, Response] = + ZStream.environmentWithStream { (u: ZEnvironment[User]) => ZStream( Response(u.get.name), Response(u.get.name) @@ -36,12 +36,12 @@ object EnvSpec extends DefaultRunnableSpec with MetadataTests { def clientStreaming( request: zio.stream.ZStream[Any, Status, Request] - ): ZIO[Has[User], Status, Response] = getUser.map(n => Response(n.name)) + ): ZIO[User, Status, Response] = getUser.map(n => Response(n.name)) def bidiStreaming( request: zio.stream.ZStream[Any, Status, Request] - ): ZStream[Has[User], Status, Response] = - ZStream.accessStream { (u: Has[User]) => + ): ZStream[User, Status, Response] = + ZStream.environmentWithStream { (u: ZEnvironment[User]) => ZStream( Response(u.get.name) ) @@ -63,14 +63,14 @@ object EnvSpec extends DefaultRunnableSpec with MetadataTests { val serviceLayer = ServiceWithConsole.transformContextM(parseUser(_)).toLayer - val serverLayer: ZLayer[Has[ZTestService[Any, Has[RequestContext]]], Throwable, Server] = - ServerLayer.access[ZTestService[Any, Has[RequestContext]]](ServerBuilder.forPort(0)) + val serverLayer: ZLayer[ZTestService[Any, RequestContext], Throwable, Server] = + ServerLayer.access[ZTestService[Any, RequestContext]](ServerBuilder.forPort(0)) override def clientLayer( userName: Option[String] - ): ZLayer[Server, Nothing, TestServiceClient] = - ZLayer.fromServiceManaged { (ss: Server.Service) => - ZManaged.fromEffect(ss.port).orDie >>= { (port: Int) => + ): URLayer[Server, TestServiceClient] = + ZManaged.environmentWithManaged { (ss: ZEnvironment[Server.Service]) => + ZManaged.fromZIO(ss.get[Server.Service].port).orDie flatMap { (port: Int) => val ch = ZManagedChannel( ManagedChannelBuilder.forAddress("localhost", port).usePlaintext(), Seq( @@ -81,7 +81,7 @@ object EnvSpec extends DefaultRunnableSpec with MetadataTests { .managed(ch) .orDie } - } + }.toLayer val layers = serviceLayer >>> (serverLayer ++ Annotations.live) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala index ae91e3dc4..615b8619a 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala @@ -1,8 +1,8 @@ package scalapb.zio_grpc +import zio.ZLayer import zio.test._ import zio.test.Assertion._ -import zio._ import zio.stream.Stream import testservice.ZioTestservice.TestServiceClient import testservice._ @@ -29,50 +29,50 @@ trait MetadataTests { def permissionDeniedSuite = suite("unauthorized request fail for")( - testM("unary") { - assertM(unaryEffect.run)(permissionDenied) + test("unary") { + assertM(unaryEffect.exit)(permissionDenied) }, - testM("server streaming") { - assertM(serverStreamingEffect.run)(permissionDenied) + test("server streaming") { + assertM(serverStreamingEffect.exit)(permissionDenied) }, - testM("client streaming") { - assertM(clientStreamingEffect.run)(permissionDenied) + test("client streaming") { + assertM(clientStreamingEffect.exit)(permissionDenied) }, - testM("bidi streaming") { - assertM(bidiEffect.run)(permissionDenied) + test("bidi streaming") { + assertM(bidiEffect.exit)(permissionDenied) } ).provideLayer(unauthClient) def unauthenticatedSuite = suite("authorized request fail for")( - testM("unary") { - assertM(unaryEffect.run)(unauthenticated) + test("unary") { + assertM(unaryEffect.exit)(unauthenticated) }, - testM("server streaming") { - assertM(serverStreamingEffect.run)(unauthenticated) + test("server streaming") { + assertM(serverStreamingEffect.exit)(unauthenticated) }, - testM("client streaming") { - assertM(clientStreamingEffect.run)(unauthenticated) + test("client streaming") { + assertM(clientStreamingEffect.exit)(unauthenticated) }, - testM("bidi streaming") { - assertM(bidiEffect.run)(unauthenticated) + test("bidi streaming") { + assertM(bidiEffect.exit)(unauthenticated) } ).provideLayer(unsetClient) def authenticatedSuite = suite("authorized request fail for")( - testM("unary") { + test("unary") { assertM(unaryEffect)(equalTo(Response("bob"))) }, - testM("server streaming") { + test("server streaming") { assertM(serverStreamingEffect)( equalTo(Seq(Response("bob"), Response("bob"))) ) }, - testM("client streaming") { + test("client streaming") { assertM(clientStreamingEffect)(equalTo(Response("bob"))) }, - testM("bidi streaming") { + test("bidi streaming") { assertM(bidiEffect)(equalTo(Seq(Response("bob")))) } ).provideLayer(authClient) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index b599ffa7b..092059679 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -1,23 +1,18 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.Request -import zio.ZIO +import zio.{Clock, Console, Exit, Promise, ZIO, ZLayer} import scalapb.zio_grpc.testservice.Response import io.grpc.Status import scalapb.zio_grpc.testservice.Request.Scenario -import zio.clock.Clock -import zio.console.Console -import zio.Has -import zio.Promise -import zio.Exit -import zio.ZLayer import zio.stream.{Stream, ZStream} +import zio.ZEnvironment package object server { import zio.Schedule - type TestServiceImpl = Has[TestServiceImpl.Service] + type TestServiceImpl = TestServiceImpl.Service object TestServiceImpl { @@ -25,7 +20,7 @@ package object server { requestReceived: zio.Promise[Nothing, Unit], delayReceived: zio.Promise[Nothing, Unit], exit: zio.Promise[Nothing, Exit[Status, Response]] - )(clock: Clock.Service, console: Console.Service) + )(clock: Clock, console: Console) extends testservice.ZioTestservice.TestService { def unary(request: Request): ZIO[Any, Status, Response] = (requestReceived.succeed(()) *> (request.scenario match { @@ -44,10 +39,10 @@ package object server { request: Request ): ZStream[Any, Status, Response] = ZStream - .bracketExit(requestReceived.succeed(())) { (_, ex) => - ex.foldM( + .acquireReleaseExitWith(requestReceived.succeed(())) { (_, ex) => + ex.foldZIO( failed => - if (failed.interrupted) + if (failed.isInterrupted || failed.isInterruptedOnly) exit.succeed(Exit.fail(Status.CANCELLED)) else exit.succeed(Exit.fail(Status.UNKNOWN)), _ => exit.succeed(Exit.succeed(Response())) @@ -79,7 +74,7 @@ package object server { ): ZIO[Any, Status, Response] = requestReceived.succeed(()) *> request - .foldM(0)((state, req) => + .runFoldZIO(0)((state, req) => req.scenario match { case Scenario.OK => ZIO.succeed(state + req.in) case Scenario.DELAY => delayReceived.succeed(()) *> ZIO.never @@ -95,7 +90,7 @@ package object server { def bidiStreaming( request: Stream[Status, Request] ): Stream[Status, Response] = - ((ZStream.fromEffect(requestReceived.succeed(())).drain ++ + ((ZStream.fromZIO(requestReceived.succeed(())).drain ++ (request.flatMap { r => r.scenario match { case Scenario.OK => @@ -104,13 +99,12 @@ package object server { case Scenario.DELAY => Stream.never case Scenario.DIE => Stream.die(new RuntimeException("FOO")) case Scenario.ERROR_NOW => - // Stream.fromEffect(zio.console.putStrLn("*** Got error now!")).drain ++ Stream.fail(Status.INTERNAL.withDescription("Intentional error")) case _ => Stream.fail(Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}")) } } ++ Stream(Response("DONE")))) .ensuring(exit.succeed(Exit.succeed(Response())))) - .provide(Has(clock) ++ Has(console)) + .provideEnvironment(ZEnvironment(clock, console)) def awaitReceived = requestReceived.await @@ -120,8 +114,8 @@ package object server { } def make( - clock: Clock.Service, - console: Console.Service + clock: Clock, + console: Console ): zio.IO[Nothing, TestServiceImpl.Service] = for { p1 <- Promise.make[Nothing, Unit] @@ -129,26 +123,21 @@ package object server { p3 <- Promise.make[Nothing, Exit[Status, Response]] } yield new Service(p1, p2, p3)(clock, console) + def makeFromEnv: ZIO[Clock with Console, Nothing, Service] = + ZIO.environmentWithZIO[Clock with Console](env => make(env.get[Clock], env.get[Console])) + val live: ZLayer[Clock with Console, Nothing, TestServiceImpl] = - ZLayer.fromServicesM[ - Clock.Service, - Console.Service, - Any, - Nothing, - TestServiceImpl.Service - ] { (clock: Clock.Service, console: Console.Service) => - make(clock, console) - } - - val any: ZLayer[TestServiceImpl, Nothing, TestServiceImpl] = ZLayer.requires + makeFromEnv.toLayer + + val any: ZLayer[TestServiceImpl, Nothing, TestServiceImpl] = ZLayer.environment def awaitReceived: ZIO[TestServiceImpl, Nothing, Unit] = - ZIO.accessM(_.get.awaitReceived) + ZIO.environmentWithZIO(_.get.awaitReceived) def awaitDelayReceived: ZIO[TestServiceImpl, Nothing, Unit] = - ZIO.accessM(_.get.awaitDelayReceived) + ZIO.environmentWithZIO(_.get.awaitDelayReceived) def awaitExit: ZIO[TestServiceImpl, Nothing, Exit[Status, Response]] = - ZIO.accessM(_.get.awaitExit) + ZIO.environmentWithZIO(_.get.awaitExit) } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 1f5b51e6a..41f3ea748 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -6,50 +6,48 @@ import scalapb.zio_grpc.server.TestServiceImpl import scalapb.zio_grpc.testservice.Request.Scenario import scalapb.zio_grpc.testservice.ZioTestservice.TestServiceClient import scalapb.zio_grpc.testservice._ -import zio.duration._ +import zio.{durationInt, Fiber, Queue, URIO, ZIO, ZLayer, ZQueue} import zio.stream.{Stream, ZStream} import zio.test.Assertion._ import zio.test.TestAspect.timeout import zio.test._ -import zio.{Fiber, Queue, URIO, ZIO, ZLayer, ZManaged, ZQueue} object TestServiceSpec extends DefaultRunnableSpec { val serverLayer: ZLayer[TestServiceImpl, Throwable, Server] = ServerLayer.access[TestServiceImpl.Service](ServerBuilder.forPort(0)) - val clientLayer: ZLayer[Server, Nothing, TestServiceClient] = - ZLayer.fromServiceManaged { (ss: Server.Service) => - ZManaged.fromEffect(ss.port).orDie >>= { (port: Int) => - val ch = ZManagedChannel( - ManagedChannelBuilder.forAddress("localhost", port).usePlaintext() - ) - TestServiceClient.managed(ch).orDie - } - } + val clientLayer: ZLayer[Server, Nothing, TestServiceClient] = { + for { + ss <- ZIO.service[Server.Service].toManaged + port <- ss.port.toManaged.orDie + ch = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext() + client <- TestServiceClient.managed(ZManagedChannel(ch)).orDie + } yield client + }.toLayer def unarySuite = suite("unary request")( - testM("returns successful response") { + test("returns successful response") { assertM(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)))( equalTo(Response("Res12")) ) }, - testM("returns successful response when the program is used repeatedly") { + test("returns successful response when the program is used repeatedly") { // Must not capture an instance of ZClientCall, so call.start() should not be invoked twice assertM(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)).repeatN(1))( equalTo(Response("Res12")) ) }, - testM("returns correct error response") { + test("returns correct error response") { assertM( TestServiceClient .unary(Request(Request.Scenario.ERROR_NOW, in = 12)) - .run + .exit )( fails(hasStatusCode(Status.INTERNAL)) ) }, - testM("catches client interrupts") { + test("catches client interrupts") { for { fiber <- TestServiceClient .unary(Request(Request.Scenario.DELAY, in = 12)) @@ -57,20 +55,20 @@ object TestServiceSpec extends DefaultRunnableSpec { _ <- TestServiceImpl.awaitReceived _ <- fiber.interrupt exit <- TestServiceImpl.awaitExit - } yield assert(exit.interrupted)(isTrue) + } yield assert(exit.isInterrupted)(isTrue) }, - testM("returns response on failures") { + test("returns response on failures") { assertM( - TestServiceClient.unary(Request(Request.Scenario.DIE, in = 12)).run + TestServiceClient.unary(Request(Request.Scenario.DIE, in = 12)).exit )( fails(hasStatusCode(Status.INTERNAL)) ) }, - testM("setting deadline interrupts the servers") { + test("setting deadline interrupts the servers") { for { - r <- TestServiceClient.withTimeoutMillis(1000).unary(Request(Request.Scenario.DELAY, in = 12)).run + r <- TestServiceClient.withTimeoutMillis(1000).unary(Request(Request.Scenario.DELAY, in = 12)).exit exit <- TestServiceImpl.awaitExit - } yield assert(r)(fails(hasStatusCode(Status.DEADLINE_EXCEEDED))) && assert(exit.interrupted)(isTrue) + } yield assert(r)(fails(hasStatusCode(Status.DEADLINE_EXCEEDED))) && assert(exit.isInterrupted)(isTrue) } ) @@ -78,7 +76,7 @@ object TestServiceSpec extends DefaultRunnableSpec { zs: ZStream[R, E, A] ): URIO[R, (List[A], Option[E])] = zs.either - .fold((List.empty[A], Option.empty[E])) { + .runFold((List.empty[A], Option.empty[E])) { case ((l, _), Left(e)) => (l, Some(e)) case ((l, e), Right(a)) => (a :: l, e) } @@ -87,7 +85,7 @@ object TestServiceSpec extends DefaultRunnableSpec { def tuple[A, B]( assertionA: Assertion[A], assertionB: Assertion[B] - ): Assertion[(A, B)] = + ): Assertion[(A, B)] = Assertion.assertionDirect("tuple")( Assertion.Render.param(assertionA), Assertion.Render.param(assertionB) @@ -95,7 +93,7 @@ object TestServiceSpec extends DefaultRunnableSpec { def serverStreamingSuite = suite("server streaming request")( - testM("returns successful response") { + test("returns successful response") { assertM( collectWithError( TestServiceClient.serverStreaming( @@ -104,7 +102,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) )(equalTo((List(Response("X1"), Response("X2")), None))) }, - testM("returns correct error response") { + test("returns correct error response") { assertM( collectWithError( TestServiceClient.serverStreaming( @@ -115,7 +113,7 @@ object TestServiceSpec extends DefaultRunnableSpec { tuple(isEmpty, isSome(hasStatusCode(Status.INTERNAL))) ) }, - testM("returns correct error after two response") { + test("returns correct error after two response") { assertM( collectWithError( TestServiceClient.serverStreaming( @@ -129,7 +127,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) ) }, - testM("catches client cancellations") { + test("catches client cancellations") { assertM(for { fb <- TestServiceClient .serverStreaming( @@ -142,7 +140,7 @@ object TestServiceSpec extends DefaultRunnableSpec { exit <- TestServiceImpl.awaitExit } yield exit)(fails(hasStatusCode(Status.CANCELLED))) }, - testM("returns failure when failure") { + test("returns failure when failure") { assertM( collectWithError( TestServiceClient.serverStreaming( @@ -157,7 +155,7 @@ object TestServiceSpec extends DefaultRunnableSpec { def clientStreamingSuite = suite("client streaming request")( - testM("returns successful response") { + test("returns successful response") { assertM( TestServiceClient.clientStreaming( Stream( @@ -168,14 +166,14 @@ object TestServiceSpec extends DefaultRunnableSpec { ) )(equalTo(Response("62"))) }, - testM("returns successful response on empty stream") { + test("returns successful response on empty stream") { assertM( TestServiceClient.clientStreaming( Stream.empty ) )(equalTo(Response("0"))) }, - testM("returns correct error response") { + test("returns correct error response") { assertM( TestServiceClient .clientStreaming( @@ -185,10 +183,10 @@ object TestServiceSpec extends DefaultRunnableSpec { Request(Scenario.ERROR_NOW, in = 33) ) ) - .run + .exit )(fails(hasStatusCode(Status.INTERNAL))) }, - testM("catches client cancellation") { + test("catches client cancellation") { assertM(for { fiber <- TestServiceClient .clientStreaming( @@ -202,9 +200,9 @@ object TestServiceSpec extends DefaultRunnableSpec { _ <- TestServiceImpl.awaitDelayReceived _ <- fiber.interrupt exit <- TestServiceImpl.awaitExit - } yield exit.interrupted)(isTrue) + } yield exit)(isInterrupted) }, - testM("returns response on failures") { + test("returns response on failures") { assertM( TestServiceClient .clientStreaming( @@ -214,16 +212,16 @@ object TestServiceSpec extends DefaultRunnableSpec { Request(Scenario.DIE, in = 33) ) ) - .run + .exit )(fails(hasStatusCode(Status.INTERNAL))) }, - testM("returns response on failures for infinite input") { + test("returns response on failures for infinite input") { assertM( TestServiceClient .clientStreaming( Stream.repeat(Request(Scenario.DIE, in = 33)) ) - .run + .exit )(fails(hasStatusCode(Status.INTERNAL))) } @@ timeout(5.seconds) ) @@ -243,7 +241,7 @@ object TestServiceSpec extends DefaultRunnableSpec { object BidiFixture { def apply[R, Req, Res]( call: Stream[Status, Req] => ZStream[R, Status, Res] - ): zio.URIO[R with zio.console.Console, BidiFixture[Req, Res]] = + ): zio.URIO[R with zio.Console, BidiFixture[Req, Res]] = for { in <- ZQueue.unbounded[Res] out <- ZQueue.unbounded[Option[Req]] @@ -253,7 +251,7 @@ object TestServiceSpec extends DefaultRunnableSpec { def bidiStreamingSuite = suite("bidi streaming request")( - testM("returns successful response") { + test("returns successful response") { assertM(for { bf <- BidiFixture(TestServiceClient.bidiStreaming[Any]) _ <- bf.send(Request(Scenario.OK, in = 1)) @@ -275,14 +273,14 @@ object TestServiceSpec extends DefaultRunnableSpec { ) ) }, - testM("returns correct error response") { + test("returns correct error response") { assertM(for { bf <- BidiFixture(TestServiceClient.bidiStreaming[Any]) _ <- bf.send(Request(Scenario.OK, in = 1)) f1 <- bf.receive(1) _ <- bf.send(Request(Scenario.ERROR_NOW, in = 3)) _ <- bf.halfClose - j <- bf.fiber.join.run + j <- bf.fiber.join.exit } yield (f1, j))( tuple( equalTo(List(Response("1"))), @@ -290,7 +288,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) ) }, - testM("catches client interrupts") { + test("catches client interrupts") { assertM( for { testServiceImpl <- ZIO.environment[TestServiceImpl] @@ -298,7 +296,7 @@ object TestServiceSpec extends DefaultRunnableSpec { TestServiceClient.bidiStreaming[Any]( Stream( Request(Scenario.OK, in = 17) - ) ++ Stream.fromEffect(testServiceImpl.get.awaitReceived).drain + ) ++ Stream.fromZIO(testServiceImpl.get.awaitReceived).drain ++ Stream.fail(Status.CANCELLED) ) ).fork @@ -309,7 +307,7 @@ object TestServiceSpec extends DefaultRunnableSpec { tuple(anything, isSome(hasStatusCode(Status.CANCELLED))) ) }, - testM("returns response on failures") { + test("returns response on failures") { assertM( TestServiceClient .bidiStreaming( @@ -320,7 +318,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) ) .runCollect - .run + .exit )(fails(hasStatusCode(Status.INTERNAL))) } ) @@ -336,4 +334,5 @@ object TestServiceSpec extends DefaultRunnableSpec { clientStreamingSuite, bidiStreamingSuite ).provideCustomLayer(layers.orDie) + } diff --git a/examples/fullapp/client/src/main/scala/ExampleClient.scala b/examples/fullapp/client/src/main/scala/ExampleClient.scala index 4c7a42f66..01e79c94e 100644 --- a/examples/fullapp/client/src/main/scala/ExampleClient.scala +++ b/examples/fullapp/client/src/main/scala/ExampleClient.scala @@ -9,6 +9,7 @@ import zio.Has import io.grpc.Channel import zio.Layer import zio.ZLayer +import zio.Console.printLine object ExampleClient extends zio.App { final def run(args: List[String]) = @@ -24,10 +25,10 @@ object ExampleClient extends zio.App { def myAppLogic = (for { r <- GreeterClient.greet(Request("Hello")) - _ <- putStrLn(r.resp) + _ <- printLine(r.resp) f <- GreeterClient.greet(Request("Bye")) - _ <- putStrLn(f.resp) + _ <- printLine(f.resp) } yield ()) - .onError { c => putStrLn(c.prettyPrint).orDie } + .onError { c => printLine(c.prettyPrint).orDie } .provideLayer(Console.live ++ clientLayer) } diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 03c71d49d..d2df0d1cc 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.1" +val zioGrpcVersion = "0.5.1+32-b05873bc+20220111-2034-SNAPSHOT" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index 5dff3929d..d67b2b572 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -2,16 +2,13 @@ package examples import examples.greeter.ZioGreeter.Greeter import examples.greeter._ -import zio.clock -import zio.clock.Clock -import zio.console.Console -import zio.{App, Schedule, IO, ZIO} -import zio.console -import zio.duration._ +import zio.Clock +import zio.Console +import zio.{ZIOAppDefault, Schedule, IO, ZIO} +import zio.Duration._ import zio.stream.Stream import io.grpc.ServerBuilder -import zio.blocking._ -import zio.console._ +import zio.Blocking._ import io.grpc.Status import zio.Managed import zio.stream.ZSink @@ -21,11 +18,12 @@ import zio.ZLayer import zio.Has import zio.ZManaged import scalapb.zio_grpc.ServerLayer +import zio.Console.{print, printLine} object GreeterService { type GreeterService = Has[Greeter] - class LiveService(clock: Clock.Service) extends Greeter { + class LiveService(clock: Clock) extends Greeter { def greet(req: Request): IO[Status, Response] = clock.sleep(300.millis) *> zio.IO.succeed( Response(resp = "hello " + req.name) @@ -51,15 +49,15 @@ object GreeterService { } } - val live: ZLayer[Clock, Nothing, GreeterService] = + val live: ZLayer[Has[Clock], Nothing, GreeterService] = ZLayer.fromService(new LiveService(_)) } -object ExampleServer extends App { - def serverWait: ZIO[Console with Clock, Throwable, Unit] = +object ExampleServer extends ZIOAppDefault { + def serverWait: ZIO[Has[Console] with Has[Clock], Throwable, Unit] = for { - _ <- putStrLn("Server is running. Press Ctrl-C to stop.") - _ <- (putStr(".") *> ZIO.sleep(1.second)).forever + _ <- printLine("Server is running. Press Ctrl-C to stop.") + _ <- (print(".") *> ZIO.sleep(1.second)).forever } yield () def serverLive(port: Int): Layer[Throwable, Server] = @@ -67,7 +65,7 @@ object ExampleServer extends App { ServerBuilder.forPort(port) ) - def run(args: List[String]) = myAppLogic.exitCode + def run = myAppLogic.exitCode val myAppLogic = serverWait.provideLayer(serverLive(9090) ++ Console.live ++ Clock.live) diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 9721897b3..d8da692e4 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -2,12 +2,11 @@ package examples import examples.greeter.ZioGreeter.{Greeter, ZGreeter} import examples.greeter._ -import zio.clock -import zio.clock.Clock -import zio.console.Console +import zio.Clock +import zio.Console import zio.{App, Schedule, IO, ZIO} import zio.console -import zio.duration._ +import zio.Duration._ import zio.stream.Stream import io.grpc.Metadata import io.grpc.ServerBuilder @@ -25,6 +24,7 @@ import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.RequestContext import zio.URIO import scalapb.zio_grpc.ServerLayer +import zio.Console.{print, printLine} object GreeterServiceWithMetadata { case class User(name: String) @@ -60,10 +60,10 @@ object GreeterServiceWithMetadata { } object ExampleServerWithMetadata extends App { - def serverWait: ZIO[Console with Clock, Throwable, Unit] = + def serverWait: ZIO[Has[Console] with Has[Clock], Throwable, Unit] = for { - _ <- putStrLn("Server is running. Press Ctrl-C to stop.") - _ <- (putStr(".") *> ZIO.sleep(1.second)).forever + _ <- printLine("Server is running. Press Ctrl-C to stop.") + _ <- (print(".") *> ZIO.sleep(1.second)).forever } yield () def serverLive(port: Int): Layer[Throwable, Server] = diff --git a/examples/fullapp/webapp/src/main/scala/WebappMain.scala b/examples/fullapp/webapp/src/main/scala/WebappMain.scala index 9ce2ae59a..974a67128 100644 --- a/examples/fullapp/webapp/src/main/scala/WebappMain.scala +++ b/examples/fullapp/webapp/src/main/scala/WebappMain.scala @@ -9,6 +9,7 @@ import zio.console._ import examples.greeter.Request import scalapb.zio_grpc.ZManagedChannel import io.grpc.Status +import zio.Console.{print, printLine} object WebappMain extends App { val clientLayer = GreeterClient.live( @@ -16,19 +17,19 @@ object WebappMain extends App { ) val appLogic = - putStrLn("Hello!") *> + printLine("Hello!") *> GreeterClient .greet(Request("Foo!")) - .foldM(s => putStrLn(s"error: $s"), s => putStrLn(s"success: $s")) *> + .foldM(s => printLine(s"error: $s"), s => print(s"success: $s")) *> (GreeterClient .points(Request("Foo!")) - .foreach(s => putStrLn(s"success: $s").orDie) + .foreach(s => printLine(s"success: $s").orDie) .catchAll { (s: Status) => - putStrLn(s"Caught: $s") + printLine(s"Caught: $s") }) def run(args: List[String]) = - (appLogic.provideLayer(Console.live ++ clientLayer).ignore *> putStrLn( + (appLogic.provideLayer(Console.live ++ clientLayer).ignore *> printLine( "Done" )).exitCode } diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index d18af94ce..011da0acd 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,9 +4,9 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.0" +val zioGrpcVersion = "0.5.1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" ) diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index 457c846f4..056125079 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -24,7 +24,7 @@ package object userdatabase { // accessor def fetchUser(name: String): ZIO[UserDatabase, Status, User] = - ZIO.accessM[UserDatabase](_.get.fetchUser(name)) + ZIO.accessZIO[UserDatabase](_.get.fetchUser(name)) val live = zio.ZLayer.succeed(new Service { def fetchUser(name: String): IO[Status, User] = diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala index fd7c19517..60fb83165 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala @@ -18,7 +18,7 @@ object HelloWorldClient extends zio.App { def myAppLogic = for { r <- GreeterClient.sayHello(HelloRequest("World")) - _ <- putStrLn(r.message) + _ <- printLine(r.message) } yield () final def run(args: List[String]) = diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index a67ff56d4..c7fd7660c 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -51,13 +51,13 @@ object HelloWorldClientMetadata extends zio.App { UserClient .sayHello(HelloRequest("World")) .provideSomeLayer[UserClient](ZLayer.succeed(User("user1"))) - _ <- putStrLn(r1.message) + _ <- printLine(r1.message) // With provide: r2 <- UserClient.sayHello(HelloRequest("World")).provideSome { (ct: UserClient) => ct ++ Has(User("user1")) } - _ <- putStrLn(r2.message) + _ <- printLine(r2.message) } yield () // Option 2: through a managed client @@ -69,9 +69,9 @@ object HelloWorldClientMetadata extends zio.App { userClientManaged.use { client => for { r1 <- client.sayHello(HelloRequest("World")).provide(Has(User("user1"))) - _ <- putStrLn(r1.message) + _ <- printLine(r1.message) r2 <- client.sayHello(HelloRequest("World")).provide(Has(User("user2"))) - _ <- putStrLn(r2.message) + _ <- printLine(r2.message) } yield () } @@ -85,7 +85,7 @@ object HelloWorldClientMetadata extends zio.App { client .withMetadataM(userToMetadata(User("hello"))) .sayHello(HelloRequest("World")) - _ <- putStrLn(r1.message) + _ <- printLine(r1.message) } yield () } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala index ed3ffcd58..f8063bcbb 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala @@ -13,7 +13,7 @@ object GreeterImpl extends ZGreeter[ZEnv, Any] { def sayHello( request: HelloRequest ): ZIO[zio.ZEnv, Status, HelloReply] = - putStrLn(s"Got request: $request") *> + printLine(s"Got request: $request") zipRight ZIO.succeed(HelloReply(s"Hello, ${request.name}")) } diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index a03dd1488..5ca001b1c 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -30,10 +30,10 @@ object RouteGuideClientApp extends App { ): ZIO[RouteGuideClient with Console, Status, Unit] = (for { f <- RouteGuideClient.getFeature(Point(lat, lng)) - _ <- putStrLn(s"""Found feature called "${f.name}".""") + _ <- printLine(s"""Found feature called "${f.name}".""") } yield ()).catchSome { case status if status == Status.NOT_FOUND => - putStrLn(s"Feature not found: ${status.toString()}") + printLine(s"Feature not found: ${status.toString()}") } // end: getFeature @@ -51,11 +51,11 @@ object RouteGuideClientApp extends App { .repeatEffect( nextIntBetween(0, features.size).map(features(_).getLocation) ) - .tap(p => putStrLn(s"Visiting (${p.latitude}, ${p.longitude})")) + .tap(p => printLine(s"Visiting (${p.latitude}, ${p.longitude})")) .schedule(Schedule.spaced(300.millis)) .take(numPoints) ) - _ <- putStrLn( + _ <- printLine( s"Finished trip with ${summary.pointCount} points. " + s"Passed ${summary.featureCount} features. " + s"Travelled ${summary.distance} meters. " + @@ -88,13 +88,13 @@ object RouteGuideClientApp extends App { message = "Four Message" ) ).tap { note => - putStrLn( + printLine( s"""Sending message "${note.message}" at ${note.getLocation.latitude}, ${note.getLocation.longitude}""" ) } ) .foreach { note => - putStrLn( + printLine( s"""Got message "${note.message}" at ${note.getLocation.latitude}, ${note.getLocation.longitude}""" ) } @@ -123,7 +123,7 @@ object RouteGuideClientApp extends App { .zipWithIndex .foreach { case (feature, index) => - putStrLn(s"Result #${index + 1}: $feature") + printLine(s"Result #${index + 1}: $feature") } // end: listFeatures diff --git a/project/Versions.scala b/project/Versions.scala index 6a0108192..ea7e55ac1 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "1.0.13" - val grpc = "1.41.0" + val zio = "2.0.0-RC1" + val grpc = "1.41.1" } diff --git a/project/plugins.sbt b/project/plugins.sbt index 148df8d8e..9d7f0f24f 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.8" -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") From 6b27c179c892f59b27fbc8ec9527dd58fe698909 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 11 Jan 2022 21:25:12 -0800 Subject: [PATCH 012/245] Remove crossScalaVersions --- build.sbt | 2 -- 1 file changed, 2 deletions(-) diff --git a/build.sbt b/build.sbt index 265e8950e..60f0610a4 100644 --- a/build.sbt +++ b/build.sbt @@ -105,7 +105,6 @@ lazy val e2e = .jvmPlatform(ScalaVersions) .settings(stdSettings) .settings( - crossScalaVersions := Seq(Scala212, Scala213), publish / skip := true, libraryDependencies ++= Seq( "dev.zio" %% "zio-test" % Version.zio % "test", @@ -129,7 +128,6 @@ lazy val docs = project .in(file("zio-grpc-docs")) .dependsOn(core.jvm(Scala213)) .settings( - crossScalaVersions := Seq(Scala213), scalaVersion := Scala213, publish / skip := true, moduleName := "zio-grpc-docs", From ed3b97eb3ebf1a87f7a59d5f9faf88d05871670b Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 11 Jan 2022 21:41:00 -0800 Subject: [PATCH 013/245] Temporarily disable docs --- .github/workflows/release.yml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e528ed22f..42b4ace1b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,20 +15,20 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - - name: Update docs - run: | - git config --global user.name "ZIO-gRPC Docs" - git config --global user.email "zio-grpc-docs@users.noreply.github.com" - eval "$(ssh-agent -s)" - echo "$TOKEN" | ssh-add - - sbt docs/mdoc - cd website - yarn install - yarn deploy - env: - TOKEN: ${{secrets.DEPLOY_KEY}} - USE_SSH: true - GIT_USER: git + # - name: Update docs + # run: | + # git config --global user.name "ZIO-gRPC Docs" + # git config --global user.email "zio-grpc-docs@users.noreply.github.com" + # eval "$(ssh-agent -s)" + # echo "$TOKEN" | ssh-add - + # sbt docs/mdoc + # cd website + # yarn install + # yarn deploy + # env: + # TOKEN: ${{secrets.DEPLOY_KEY}} + # USE_SSH: true + # GIT_USER: git - uses: olafurpg/setup-gpg@v3 - name: Publish ${{ github.ref }} run: sbt ci-release From c549162d4ef63771f01f42bcfe23291c1f93f4ae Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 16 Jan 2022 10:38:52 -0800 Subject: [PATCH 014/245] Update mergify.yml --- .mergify.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.mergify.yml b/.mergify.yml index 4f009d007..cbceed84e 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -1,3 +1,8 @@ +queue_rules: + - name: default + conditions: + - check-success=ci-passed + pull_request_rules: - name: assign and label scala-steward's PRs conditions: @@ -10,8 +15,8 @@ pull_request_rules: - name: merge scala-steward's PRs conditions: - author=scala-steward - - status-success=ci-passed + - check-success=ci-passed actions: - merge: + queue: method: squash - strict: true + name: default From 764c474f091bf46d4cda17b9e5dfe336b9841bda Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 16 Jan 2022 19:44:28 +0100 Subject: [PATCH 015/245] Update grpc-netty, grpc-services to 1.41.2 (#349) * Update grpc-netty, grpc-services to 1.41.2 * Update grpc-netty, grpc-services to 1.41.2 Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- build.sbt | 2 +- examples/fullapp/build.sbt | 4 ++-- examples/helloworld/build.sbt | 6 +++--- examples/routeguide/build.sbt | 8 ++++---- project/Versions.scala | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index 60f0610a4..b7e3d24a3 100644 --- a/build.sbt +++ b/build.sbt @@ -133,7 +133,7 @@ lazy val docs = project moduleName := "zio-grpc-docs", mdocVariables := Map( "sbtProtocVersion" -> "1.0.2", - "grpcVersion" -> "1.41.0", + "grpcVersion" -> "1.41.2", "zioGrpcVersion" -> "0.5.0", "scalapbVersion" -> scalapb.compiler.Version.scalapbVersion ), diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 943bccd81..259192ebb 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -6,13 +6,13 @@ ThisBuild / cancelable := true ThisBuild / connectInput := true -val grpcVersion = "1.41.0" +val grpcVersion = "1.41.2" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) .settings( Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ), Compile / PB.protoSources := Seq( diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index cc253dd1a..7fa3cd647 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -2,15 +2,15 @@ scalaVersion := "2.13.4" resolvers += Resolver.sonatypeRepo("snapshots") -val grpcVersion = "1.41.0" +val grpcVersion = "1.41.2" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 83cc521b6..43608ccbc 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -2,17 +2,17 @@ scalaVersion := "2.13.4" resolvers += Resolver.sonatypeRepo("snapshots") -val grpcVersion = "1.41.0" +val grpcVersion = "1.41.2" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.11.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.11.0" ) run / fork := true diff --git a/project/Versions.scala b/project/Versions.scala index ea7e55ac1..4e1544980 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { val zio = "2.0.0-RC1" - val grpc = "1.41.1" + val grpc = "1.41.2" } From e8bc40d6729b5298212b4a2f9156b2c15af70a0d Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 16 Jan 2022 20:26:09 -0800 Subject: [PATCH 016/245] Upgrade examples to zio2 and zio-grpc 0.6.0-test1 --- .../client/src/main/scala/ExampleClient.scala | 11 ++--- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 20 +++------ .../scala/ExampleServerWithMetadata.scala | 33 +++++---------- .../webapp/src/main/scala/WebappMain.scala | 15 +++---- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/GreeterWithDatabase.scala | 23 ++++------ .../helloworld/HelloWorldClient.scala | 8 ++-- .../helloworld/HelloWorldClientMetadata.scala | 42 ++++++++++++------- .../helloworld/HelloWorldServer.scala | 6 +-- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideClientApp.scala | 24 +++++------ .../routeguide/RouteGuideServer.scala | 10 ++--- 13 files changed, 86 insertions(+), 112 deletions(-) diff --git a/examples/fullapp/client/src/main/scala/ExampleClient.scala b/examples/fullapp/client/src/main/scala/ExampleClient.scala index 01e79c94e..f7cbc1458 100644 --- a/examples/fullapp/client/src/main/scala/ExampleClient.scala +++ b/examples/fullapp/client/src/main/scala/ExampleClient.scala @@ -3,16 +3,13 @@ package examples import io.grpc.ManagedChannelBuilder import examples.greeter.ZioGreeter.GreeterClient import examples.greeter._ -import zio.console._ +import zio.Console._ import scalapb.zio_grpc.ZManagedChannel -import zio.Has import io.grpc.Channel -import zio.Layer -import zio.ZLayer -import zio.Console.printLine +import zio._ -object ExampleClient extends zio.App { - final def run(args: List[String]) = +object ExampleClient extends zio.ZIOAppDefault { + final def run = myAppLogic.exitCode def clientLayer: Layer[Throwable, GreeterClient] = diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index d2df0d1cc..00457a425 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.1+32-b05873bc+20220111-2034-SNAPSHOT" +val zioGrpcVersion = "0.6.0-test1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index d67b2b572..568c17220 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -2,27 +2,17 @@ package examples import examples.greeter.ZioGreeter.Greeter import examples.greeter._ -import zio.Clock -import zio.Console -import zio.{ZIOAppDefault, Schedule, IO, ZIO} import zio.Duration._ import zio.stream.Stream import io.grpc.ServerBuilder -import zio.Blocking._ import io.grpc.Status -import zio.Managed +import zio._ import zio.stream.ZSink import scalapb.zio_grpc.Server -import zio.Layer -import zio.ZLayer -import zio.Has -import zio.ZManaged import scalapb.zio_grpc.ServerLayer import zio.Console.{print, printLine} object GreeterService { - type GreeterService = Has[Greeter] - class LiveService(clock: Clock) extends Greeter { def greet(req: Request): IO[Status, Response] = clock.sleep(300.millis) *> zio.IO.succeed( @@ -40,7 +30,7 @@ object GreeterService { Status.INTERNAL .withDescription("There was an error!") .withCause(new RuntimeException) - )).provide(Has(clock)) + )).provideEnvironment(ZEnvironment(clock)) def bidi( request: Stream[Status, Point] @@ -49,12 +39,12 @@ object GreeterService { } } - val live: ZLayer[Has[Clock], Nothing, GreeterService] = - ZLayer.fromService(new LiveService(_)) + val live: ZLayer[Clock, Nothing, Greeter] = + (new LiveService(_)).toLayer } object ExampleServer extends ZIOAppDefault { - def serverWait: ZIO[Has[Console] with Has[Clock], Throwable, Unit] = + def serverWait: ZIO[Console with Clock, Throwable, Unit] = for { _ <- printLine("Server is running. Press Ctrl-C to stop.") _ <- (print(".") *> ZIO.sleep(1.second)).forever diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index d8da692e4..88f3e9d20 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -2,36 +2,23 @@ package examples import examples.greeter.ZioGreeter.{Greeter, ZGreeter} import examples.greeter._ -import zio.Clock -import zio.Console -import zio.{App, Schedule, IO, ZIO} -import zio.console -import zio.Duration._ +import zio._ import zio.stream.Stream import io.grpc.Metadata import io.grpc.ServerBuilder -import zio.blocking._ -import zio.console._ +import zio.Console._ import io.grpc.Status -import zio.Managed -import zio.stream.ZSink import scalapb.zio_grpc.Server -import zio.Layer -import zio.ZLayer -import zio.Has -import zio.ZManaged import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.RequestContext -import zio.URIO import scalapb.zio_grpc.ServerLayer -import zio.Console.{print, printLine} object GreeterServiceWithMetadata { case class User(name: String) // Each request gets a User as a context parameter. - class LiveService(clock: Clock.Service) extends ZGreeter[Any, Has[User]] { - def greet(req: Request): ZIO[Has[User], Status, Response] = + class LiveService(clock: Clock) extends ZGreeter[Any, User] { + def greet(req: Request): ZIO[User, Status, Response] = for { name <- ZIO.service[User].map(_.name) } yield Response(s"Hello ${name}, req: ${req}") @@ -53,14 +40,14 @@ object GreeterServiceWithMetadata { case _ => IO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) } - val live: ZLayer[Clock, Nothing, Has[ZGreeter[Any, Has[RequestContext]]]] = - ZLayer.fromService { c: Clock.Service => + val live: ZLayer[Clock, Nothing, ZGreeter[Any, RequestContext]] = { + c: Clock => new LiveService(c).transformContextM(findUser(_)) - } + }.toLayer } -object ExampleServerWithMetadata extends App { - def serverWait: ZIO[Has[Console] with Has[Clock], Throwable, Unit] = +object ExampleServerWithMetadata extends ZIOAppDefault { + def serverWait: ZIO[Console with Clock, Throwable, Unit] = for { _ <- printLine("Server is running. Press Ctrl-C to stop.") _ <- (print(".") *> ZIO.sleep(1.second)).forever @@ -71,7 +58,7 @@ object ExampleServerWithMetadata extends App { ServerBuilder.forPort(port) )(Clock.live >>> GreeterServiceWithMetadata.live) - def run(args: List[String]) = myAppLogic.exitCode + def run = myAppLogic.exitCode val myAppLogic = serverWait.provideLayer(serverLive(8080) ++ Console.live ++ Clock.live) diff --git a/examples/fullapp/webapp/src/main/scala/WebappMain.scala b/examples/fullapp/webapp/src/main/scala/WebappMain.scala index 974a67128..f766cd669 100644 --- a/examples/fullapp/webapp/src/main/scala/WebappMain.scala +++ b/examples/fullapp/webapp/src/main/scala/WebappMain.scala @@ -2,16 +2,13 @@ package examples import scalapb.grpc.Channels import examples.greeter.ZioGreeter.GreeterClient -import zio.App -import zio.Managed -import zio.ZIO -import zio.console._ +import zio._ +import zio.Console._ import examples.greeter.Request import scalapb.zio_grpc.ZManagedChannel import io.grpc.Status -import zio.Console.{print, printLine} -object WebappMain extends App { +object WebappMain extends ZIOAppDefault { val clientLayer = GreeterClient.live( ZManagedChannel(Channels.grpcwebChannel("http://localhost:8080")) ) @@ -20,7 +17,7 @@ object WebappMain extends App { printLine("Hello!") *> GreeterClient .greet(Request("Foo!")) - .foldM(s => printLine(s"error: $s"), s => print(s"success: $s")) *> + .foldZIO(s => printLine(s"error: $s"), s => print(s"success: $s")) *> (GreeterClient .points(Request("Foo!")) .foreach(s => printLine(s"success: $s").orDie) @@ -28,8 +25,8 @@ object WebappMain extends App { printLine(s"Caught: $s") }) - def run(args: List[String]) = - (appLogic.provideLayer(Console.live ++ clientLayer).ignore *> printLine( + def run = + (appLogic.provideLayer(zio.Console.live ++ clientLayer).ignore *> printLine( "Done" )).exitCode } diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 011da0acd..11b84d1ee 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.1" +val zioGrpcVersion = "0.6.0-test1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index 056125079..c1fc428e5 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -3,30 +3,25 @@ package zio_grpc.examples.helloworld import io.grpc.Status import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList -import zio.{ZEnv, ZIO} -import zio.console._ +import zio._ +import zio.Console._ import io.grpc.examples.helloworld.helloworld.ZioHelloworld.RGreeter import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} import zio_grpc.examples.helloworld.userdatabase.UserDatabase import scalapb.zio_grpc.ServerLayer -import zio.ExitCode -import zio.Has -import zio.IO package object userdatabase { - type UserDatabase = Has[UserDatabase.Service] + trait UserDatabase { + def fetchUser(name: String): IO[Status, User] + } object UserDatabase { - trait Service { - def fetchUser(name: String): IO[Status, User] - } - // accessor def fetchUser(name: String): ZIO[UserDatabase, Status, User] = - ZIO.accessZIO[UserDatabase](_.get.fetchUser(name)) + ZIO.environmentWithZIO[UserDatabase](_.get.fetchUser(name)) - val live = zio.ZLayer.succeed(new Service { + val live = zio.ZLayer.succeed(new UserDatabase { def fetchUser(name: String): IO[Status, User] = IO.succeed(User(name)) }) @@ -42,13 +37,13 @@ object GreeterWithDatabase extends RGreeter[UserDatabase with Console] { } } -object GreeterWithDatabaseServer extends zio.App { +object GreeterWithDatabaseServer extends zio.ZIOAppDefault { val serverLayer = ServerLayer.fromServiceLayer( io.grpc.ServerBuilder.forPort(9090) )(GreeterWithDatabase.toLayer) val ourApp = (UserDatabase.live ++ Console.any) >>> serverLayer - def run(args: List[String]): zio.URIO[zio.ZEnv, ExitCode] = + def run: zio.URIO[zio.ZEnv, ExitCode] = ourApp.build.useForever.exitCode } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala index 60fb83165..185a98a58 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala @@ -3,11 +3,11 @@ package zio_grpc.examples.helloworld import io.grpc.examples.helloworld.helloworld.ZioHelloworld.GreeterClient import io.grpc.examples.helloworld.helloworld.HelloRequest import io.grpc.ManagedChannelBuilder -import zio.console._ +import zio.Console._ import scalapb.zio_grpc.ZManagedChannel -import zio.Layer +import zio._ -object HelloWorldClient extends zio.App { +object HelloWorldClient extends zio.ZIOAppDefault { val clientLayer: Layer[Throwable, GreeterClient] = GreeterClient.live( ZManagedChannel( @@ -21,6 +21,6 @@ object HelloWorldClient extends zio.App { _ <- printLine(r.message) } yield () - final def run(args: List[String]) = + final def run = myAppLogic.provideCustomLayer(clientLayer).exitCode } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index c7fd7660c..2989ad390 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -9,13 +9,13 @@ import io.grpc.{ CallOptions, Status } -import zio.console._ +import zio.Console._ import scalapb.zio_grpc.{SafeMetadata, ZClientInterceptor, ZManagedChannel} import zio._ case class User(name: String) -object HelloWorldClientMetadata extends zio.App { +object HelloWorldClientMetadata extends zio.ZIOAppDefault { val UserKey = Metadata.Key.of("user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) @@ -27,7 +27,7 @@ object HelloWorldClientMetadata extends zio.App { // An effect that fetches a User from the environment and transforms it to // Metadata - def userEnvToMetadata: URIO[Has[User], SafeMetadata] = + def userEnvToMetadata: URIO[User, SafeMetadata] = ZIO.service[User].flatMap(userToMetadata) val channel = @@ -38,11 +38,11 @@ object HelloWorldClientMetadata extends zio.App { // Option 1: through layer and accessors val clientLayer = GreeterClient.live(channel, headers = userEnvToMetadata) - type UserClient = Has[GreeterClient.ZService[Any, Has[User]]] + type UserClient = GreeterClient.ZService[Any, User] // The default accessors expect the client type that has no context. We need // to set up accessors for the User context - object UserClient extends GreeterClient.Accessors[Has[User]] + object UserClient extends GreeterClient.Accessors[User] def appLogic1: ZIO[UserClient with Console, Status, Unit] = for { @@ -51,26 +51,36 @@ object HelloWorldClientMetadata extends zio.App { UserClient .sayHello(HelloRequest("World")) .provideSomeLayer[UserClient](ZLayer.succeed(User("user1"))) - _ <- printLine(r1.message) + _ <- printLine(r1.message).orDie - // With provide: - r2 <- UserClient.sayHello(HelloRequest("World")).provideSome { - (ct: UserClient) => ct ++ Has(User("user1")) - } - _ <- printLine(r2.message) + // With provideSomeEnvironment: + r2 <- + UserClient + .sayHello(HelloRequest("World")) + .provideSomeEnvironment( + (_: ZEnvironment[UserClient with Console]) ++ ZEnvironment( + User("user1") + ) + ) + _ <- printLine(r2.message).orDie } yield () // Option 2: through a managed client - val userClientManaged - : Managed[Throwable, GreeterClient.ZService[Any, Has[User]]] = + val userClientManaged: Managed[Throwable, GreeterClient.ZService[Any, User]] = GreeterClient.managed(channel, headers = userEnvToMetadata) def appLogic2 = userClientManaged.use { client => for { - r1 <- client.sayHello(HelloRequest("World")).provide(Has(User("user1"))) + r1 <- + client + .sayHello(HelloRequest("World")) + .provideEnvironment(ZEnvironment(User("user1"))) _ <- printLine(r1.message) - r2 <- client.sayHello(HelloRequest("World")).provide(Has(User("user2"))) + r2 <- + client + .sayHello(HelloRequest("World")) + .provideEnvironment(ZEnvironment(User("user2"))) _ <- printLine(r2.message) } yield () } @@ -89,7 +99,7 @@ object HelloWorldClientMetadata extends zio.App { } yield () } - final def run(args: List[String]) = + final def run = ( appLogic1.provideCustomLayer(clientLayer) *> appLogic2 *> diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala index f8063bcbb..367944ba6 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala @@ -3,8 +3,8 @@ package zio_grpc.examples.helloworld import io.grpc.Status import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList -import zio.{ZEnv, ZIO} -import zio.console._ +import zio._ +import zio.Console._ import io.grpc.examples.helloworld.helloworld.ZioHelloworld.ZGreeter import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} @@ -13,7 +13,7 @@ object GreeterImpl extends ZGreeter[ZEnv, Any] { def sayHello( request: HelloRequest ): ZIO[zio.ZEnv, Status, HelloReply] = - printLine(s"Got request: $request") zipRight + printLine(s"Got request: $request").orDie zipRight ZIO.succeed(HelloReply(s"Hello, ${request.name}")) } diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index d18af94ce..9cbf06738 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.0" +val zioGrpcVersion = "0.6.0-test1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index 5ca001b1c..ecbc94cad 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -3,19 +3,17 @@ package zio_grpc.examples.routeguide import io.grpc.examples.routeguide.route_guide.ZioRouteGuide.RouteGuideClient import io.grpc.examples.routeguide.route_guide._ import io.grpc.ManagedChannelBuilder -import zio.console._ -import zio.random._ +import zio.Console._ +import zio.Random._ import scalapb.zio_grpc.ZManagedChannel -import zio.Layer import io.grpc.Channel -import zio.{App, ZIO} +import zio._ import io.grpc.Status import zio.stream.ZStream import scala.io.Source -import zio.Schedule -import zio.duration._ +import zio.Duration._ -object RouteGuideClientApp extends App { +object RouteGuideClientApp extends ZIOAppDefault { val clientLayer: Layer[Throwable, RouteGuideClient] = RouteGuideClient.live( ZManagedChannel( @@ -30,10 +28,10 @@ object RouteGuideClientApp extends App { ): ZIO[RouteGuideClient with Console, Status, Unit] = (for { f <- RouteGuideClient.getFeature(Point(lat, lng)) - _ <- printLine(s"""Found feature called "${f.name}".""") + _ <- printLine(s"""Found feature called "${f.name}".""").orDie } yield ()).catchSome { case status if status == Status.NOT_FOUND => - printLine(s"Feature not found: ${status.toString()}") + printLine(s"Feature not found: ${status.toString()}").orDie } // end: getFeature @@ -48,10 +46,10 @@ object RouteGuideClientApp extends App { for { summary <- RouteGuideClient.recordRoute( ZStream - .repeatEffect( + .repeatZIO( nextIntBetween(0, features.size).map(features(_).getLocation) ) - .tap(p => printLine(s"Visiting (${p.latitude}, ${p.longitude})")) + .tap(p => printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie) .schedule(Schedule.spaced(300.millis)) .take(numPoints) ) @@ -90,7 +88,7 @@ object RouteGuideClientApp extends App { ).tap { note => printLine( s"""Sending message "${note.message}" at ${note.getLocation.latitude}, ${note.getLocation.longitude}""" - ) + ).orDie } ) .foreach { note => @@ -132,7 +130,7 @@ object RouteGuideClientApp extends App { _ <- routeChat } yield () - final def run(args: List[String]) = + final def run = myAppLogic.provideCustomLayer(clientLayer).exitCode // end: appLogic } diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index ad9675877..710eb2c7f 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -5,15 +5,15 @@ import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList import zio.{Ref, ZEnv, ZIO} import zio.stream.ZStream -import zio.console._ +import zio.Console._ import io.grpc.examples.routeguide.route_guide._ import scala.math._ import zio.IO import scalapb.json4s.JsonFormat import scala.io.Source -import zio.clock.Clock -import zio.clock._ +import zio.Clock +import zio.Clock._ import zio.UIO class RouteGuideService( @@ -66,7 +66,7 @@ class RouteGuideService( ): ZIO[Clock, Status, RouteSummary] = { // Zips each element with the previous element, initially accompanied by None. request.zipWithPrevious - .fold(RouteSummary()) { + .runFold(RouteSummary()) { case (summary, (maybePrevPoint, currentPoint)) => // Compute the next status based on the current status. summary.copy( @@ -103,7 +103,7 @@ class RouteGuideService( (messages, routeNotes.updated(note.getLocation, note :: messages)) } // We create a stream from the effect. - ZStream.fromIterableM(updateMapEffect) + ZStream.fromIterableZIO(updateMapEffect) } // end: routeChat From d244d3cbcdb0c72a482de84d7b29215ae11f9592 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 16 Jan 2022 20:26:24 -0800 Subject: [PATCH 017/245] Enable examples in CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c340b84d..2b384c27c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: - name: Examples run: | cd examples - # for d in */ ; do cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test && cd ../ ; done + for d in */ ; do cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test && cd ../ ; done # Single final job for mergify. ci-passed: From 62dde7c6877f83a00d22abe9681249a629b91496 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 16 Jan 2022 22:42:00 -0800 Subject: [PATCH 018/245] format examples --- examples/fullapp/build.sbt | 2 +- examples/helloworld/build.sbt | 4 ++-- examples/helloworld/project/plugins.sbt | 2 +- examples/routeguide/build.sbt | 6 +++--- .../zio_grpc/examples/routeguide/RouteGuideClientApp.scala | 4 +++- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 259192ebb..aa3ae6688 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -12,7 +12,7 @@ lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) .settings( Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ), Compile / PB.protoSources := Seq( diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index 7fa3cd647..194dc618c 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -5,12 +5,12 @@ resolvers += Resolver.sonatypeRepo("snapshots") val grpcVersion = "1.41.2" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 11b84d1ee..9cbf06738 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -8,5 +8,5 @@ val zioGrpcVersion = "0.6.0-test1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" ) diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 43608ccbc..6da8e8374 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -5,14 +5,14 @@ resolvers += Resolver.sonatypeRepo("snapshots") val grpcVersion = "1.41.2" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.11.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.11.0" ) run / fork := true diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index ecbc94cad..c5b0e9d4a 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -49,7 +49,9 @@ object RouteGuideClientApp extends ZIOAppDefault { .repeatZIO( nextIntBetween(0, features.size).map(features(_).getLocation) ) - .tap(p => printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie) + .tap(p => + printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie + ) .schedule(Schedule.spaced(300.millis)) .take(numPoints) ) From 232b910eb919625263f7ff013d45284a979b2e77 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 17 Jan 2022 07:32:23 -0800 Subject: [PATCH 019/245] Update fullapp example project --- examples/fullapp/project/plugins.sbt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 00457a425..8eebaf31a 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -2,17 +2,17 @@ resolvers += Resolver.sonatypeRepo("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") -addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") +addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") val zioGrpcVersion = "0.6.0-test1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.7.1") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.1.0") From f4e2cb0b3d2d9d920a6d54dfaaf239c85c92ff05 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 17 Jan 2022 18:29:59 +0100 Subject: [PATCH 020/245] Update sbt-scalajs, scalajs-compiler, ... to 1.8.0 (#335) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 9d7f0f24f..a1d08065c 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -10,7 +10,7 @@ addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.7.1") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.1.0") From 0f241c21e6df755e01f9711a6a5030cc4a44e999 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 28 Jan 2022 21:19:08 +0100 Subject: [PATCH 021/245] Update mdoc, sbt-mdoc to 2.3.0 (#358) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index a1d08065c..c50a5005e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.24") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.0") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.8.0") From 801e0e5534a23bf1bf9f8e8c0fd28fc55587b5b3 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 1 Feb 2022 19:15:09 +0100 Subject: [PATCH 022/245] Update sbt to 1.6.2 (#360) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 3161d2146..c8fcab543 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.1 +sbt.version=1.6.2 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 3161d2146..c8fcab543 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.1 +sbt.version=1.6.2 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 3161d2146..c8fcab543 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.1 +sbt.version=1.6.2 diff --git a/project/build.properties b/project/build.properties index 3161d2146..c8fcab543 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.1 +sbt.version=1.6.2 From a37eeee204f0f4f4d442f79e453a6eac6befec83 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 2 Feb 2022 03:04:34 +0100 Subject: [PATCH 023/245] Update scala3-library to 3.1.1 (#361) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index b7e3d24a3..f9b6638b7 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import Settings.stdSettings -val Scala3 = "3.1.0" +val Scala3 = "3.1.1" val Scala213 = "2.13.7" From dcf6f3920b3326066de12c2f68ed91d6aef937e7 Mon Sep 17 00:00:00 2001 From: Gerard Madorell Date: Wed, 16 Feb 2022 11:10:19 +0100 Subject: [PATCH 024/245] Update RouteGuideServer link in basics.md documentation. --- docs/basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/basics.md b/docs/basics.md index e6638a77b..ddf15adfb 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -171,7 +171,7 @@ There are two parts to making our `RouteGuide` service do its job: clients and return the service responses. You can find our example `RouteGuide` server in -[scalapb/zio-grpc/examples/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala](https://github.com/scalapb/zio-grpc/blob/master/examples/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala). +[scalapb/zio-grpc/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala](https://github.com/scalapb/zio-grpc/blob/master/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala). Let's take a closer look at how it works. ### Implementing ZRouteGuide From 444f93806b571b8aeb0a918ef0f65f8bd549115e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 17 Feb 2022 23:09:58 +0100 Subject: [PATCH 025/245] Update sbt-buildinfo to 0.11.0 (#366) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index c50a5005e..7ddd053fc 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -8,7 +8,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") -addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") From 17aeb3b21d8ebe077222c599ebe193fda49e5a62 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 24 Feb 2022 14:54:32 +0100 Subject: [PATCH 026/245] Update mdoc, sbt-mdoc to 2.3.1 (#371) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 7ddd053fc..d036f0aec 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.0") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.1") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.8.0") From 8b1d6b411cacf9f4ab0f9bace6d19a328f2f01be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 26 Feb 2022 02:03:12 +0000 Subject: [PATCH 027/245] Bump prismjs from 1.25.0 to 1.27.0 in /website Bumps [prismjs](https://github.com/PrismJS/prism) from 1.25.0 to 1.27.0. - [Release notes](https://github.com/PrismJS/prism/releases) - [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md) - [Commits](https://github.com/PrismJS/prism/compare/v1.25.0...v1.27.0) --- updated-dependencies: - dependency-name: prismjs dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index f98c9ea78..2234bc9ed 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -8851,9 +8851,9 @@ prism-react-renderer@^1.1.1: integrity sha512-MgMhSdHuHymNRqD6KM3eGS0PNqgK9q4QF5P0yoQQvpB6jNjeSAi3jcSAz0Sua/t9fa4xDOMar9HJbLa08gl9ug== prismjs@^1.22.0: - version "1.25.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.25.0.tgz#6f822df1bdad965734b310b315a23315cf999756" - integrity sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg== + version "1.27.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== process-nextick-args@~2.0.0: version "2.0.1" From 6372b42dc5ec8022547c58e9d89e2feca15cca35 Mon Sep 17 00:00:00 2001 From: denis_savitsky Date: Mon, 9 May 2022 18:09:17 +0300 Subject: [PATCH 028/245] update zio to 2.0.0-rc6 --- build.sbt | 2 +- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 12 ++- .../src/main/scala/scalapb/zio_grpc/GIO.scala | 3 +- .../zio_grpc/TransformableService.scala | 16 ++-- .../scalapb/zio_grpc/ZBindableService.scala | 6 +- .../scala/scalapb/zio_grpc/ZTransform.scala | 9 +- .../main/scala/scalapb/zio_grpc/package.scala | 5 +- .../scalapb/zio_grpc/ZManagedChannel.scala | 4 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 15 ++- .../scalajvm/scalapb/zio_grpc/Server.scala | 60 ++++++------ .../scalapb/zio_grpc/ServerMain.scala | 8 +- .../scalapb/zio_grpc/ServiceList.scala | 31 ++++--- .../scalapb/zio_grpc/ZManagedChannel.scala | 5 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 16 ++-- .../client/StreamingClientCallListener.scala | 11 +-- .../scalapb/zio_grpc/server/CallDriver.scala | 4 +- .../zio_grpc/BindableServiceSpec.scala | 7 +- .../scalapb/zio_grpc/CallDriverSpec.scala | 9 +- .../scalapb/zio_grpc/ClientCallsSpec.scala | 2 +- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 40 ++++---- .../scalapb/zio_grpc/MetadataTests.scala | 34 +++---- .../scalapb/zio_grpc/TestServiceImpl.scala | 28 +++--- .../scalapb/zio_grpc/TestServiceSpec.scala | 93 +++++++++---------- .../client/src/main/scala/ExampleClient.scala | 2 +- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 4 +- .../scala/ExampleServerWithMetadata.scala | 5 +- examples/helloworld/project/plugins.sbt | 4 +- .../helloworld/GreeterWithDatabase.scala | 12 +-- .../helloworld/HelloWorldClientMetadata.scala | 4 +- .../helloworld/HelloWorldServer.scala | 6 +- examples/routeguide/project/plugins.sbt | 4 +- .../routeguide/RouteGuideClientApp.scala | 2 +- .../routeguide/RouteGuideServer.scala | 10 +- project/Versions.scala | 2 +- 35 files changed, 232 insertions(+), 245 deletions(-) diff --git a/build.sbt b/build.sbt index f9b6638b7..b5181d251 100644 --- a/build.sbt +++ b/build.sbt @@ -134,7 +134,7 @@ lazy val docs = project mdocVariables := Map( "sbtProtocVersion" -> "1.0.2", "grpcVersion" -> "1.41.2", - "zioGrpcVersion" -> "0.5.0", + "zioGrpcVersion" -> "0.5.1", "scalapbVersion" -> scalapb.compiler.Version.scalapbVersion ), libraryDependencies ++= Seq( diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index 5a645fefe..8c136ce90 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -326,7 +326,7 @@ class ZioFilePrinter( .add("") .add("// accessor methods") .add( - s"class ${accessorsClassName.name}[Context: zio.Tag: zio.IsNotIntersection](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsClassName.name}[Context]] {" + s"class ${accessorsClassName.name}[Context: zio.Tag](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsClassName.name}[Context]] {" ) .indented( _.add(s"def this() = this(zio.ZIO.succeed($CallOptions.DEFAULT))") @@ -384,13 +384,13 @@ class ZioFilePrinter( .add("}") .add("") .add( - s"def managed[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.Managed[Throwable, ${clientServiceName.name}.ZService[R, Context]] = managedChannel.map {" + s"def managed[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[R, Context]] = managedChannel.map {" ) .add(" channel => new ServiceStub[R, Context](channel, options, headers)") .add("}") .add("") .add( - s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = zio.ZLayer.fromFunctionManaged((r: zio.ZEnvironment[R]) => managed[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers))" + s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = zio.ZLayer.scoped[R](zio.ZIO.environmentWithZIO((r: zio.ZEnvironment[R]) => managed[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers)))" ) .outdent .add("}") @@ -408,8 +408,10 @@ class ZioFilePrinter( ) + " = " val innerCall = s"_.withCallOptionsM(callOptions).${method.name}(request)" val clientCall = method.streamType match { - case StreamType.Unary => s"_root_.zio.ZIO.serviceWithZIO($innerCall)" - case StreamType.ClientStreaming => s"_root_.zio.ZIO.serviceWithZIO($innerCall)" + case StreamType.Unary => + s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" + case StreamType.ClientStreaming => + s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" case StreamType.ServerStreaming => s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" case StreamType.Bidirectional => diff --git a/core/src/main/scala/scalapb/zio_grpc/GIO.scala b/core/src/main/scala/scalapb/zio_grpc/GIO.scala index fca472003..dcb3b85c2 100644 --- a/core/src/main/scala/scalapb/zio_grpc/GIO.scala +++ b/core/src/main/scala/scalapb/zio_grpc/GIO.scala @@ -1,6 +1,7 @@ package scalapb.zio_grpc import zio.Task +import zio.ZIO import io.grpc.Status object GIO { @@ -10,5 +11,5 @@ object GIO { @deprecated("use attempt", "0.6.0") def effect[A](effect: => A) = attempt(effect) - def attempt[A](effect: => A) = fromTask(Task.attempt(effect)) + def attempt[A](effect: => A) = fromTask(ZIO.attempt(effect)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala index 18a3c7a24..07142e929 100644 --- a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala @@ -4,9 +4,8 @@ import io.grpc.Status import zio.ZLayer import zio.ZEnvironment -import izumi.reflect.Tag +import zio.Tag import zio.ZIO -import zio.IsNotIntersection trait TransformableService[S[_, _]] { def transform[RIn, ContextIn, ROut, ContextOut]( @@ -17,13 +16,13 @@ trait TransformableService[S[_, _]] { def provideEnvironment[R, Context: Tag](s: S[R, Context], r: ZEnvironment[R]): S[Any, Context] = transform(s, ZTransform.provideEnvironment[R, Status, Context](r)) - def transformContextM[R, FromContext: Tag: IsNotIntersection, R0 <: R, ToContext: Tag: IsNotIntersection]( + def transformContextM[R, FromContext: Tag, R0 <: R, ToContext: Tag]( s: S[R, FromContext], f: ToContext => ZIO[R0, Status, FromContext] ): S[R0, ToContext] = transform[R, FromContext, R0, ToContext](s, ZTransform.transformContext[R, Status, FromContext, R0, ToContext](f)) - def transformContext[R, FromContext: Tag: IsNotIntersection, ToContext: Tag: IsNotIntersection]( + def transformContext[R, FromContext: Tag, ToContext: Tag]( s: S[R, FromContext], f: ToContext => FromContext ): S[R, ToContext] = @@ -31,8 +30,8 @@ trait TransformableService[S[_, _]] { def toLayer[R, C: Tag]( s: S[R, C] - )(implicit tagged: Tag[S[Any, C]], notis: IsNotIntersection[S[Any, C]]): ZLayer[R, Nothing, S[Any, C]] = - ZLayer.fromFunction((r: ZEnvironment[R]) => provideEnvironment(s, r)) + )(implicit tagged: Tag[S[Any, C]]): ZLayer[R, Nothing, S[Any, C]] = + ZLayer(ZIO.environmentWith((r: ZEnvironment[R]) => provideEnvironment(s, r))) } object TransformableService { @@ -44,9 +43,9 @@ object TransformableService { )(implicit TS: TransformableService[S]): S[ROut, ContextOut] = TS.transform[R, C, ROut, ContextOut](service, transform) - def transformContextM[C2: Tag: IsNotIntersection, R0 <: R]( + def transformContextM[C2: Tag, R0 <: R]( f: C2 => ZIO[R0, Status, C] - )(implicit TS: TransformableService[S], cTagged: Tag[C], cNotIs: IsNotIntersection[C]): S[R0, C2] = + )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[R0, C2] = TS.transformContextM[R, C, R0, C2](service, f) def provideEnvironment( @@ -57,7 +56,6 @@ object TransformableService { def toLayer(implicit TS: TransformableService[S], sTagged: Tag[S[Any, C]], - sNotIs: IsNotIntersection[S[Any, C]], cTagged: Tag[C] ): ZLayer[R, Nothing, S[Any, C]] = TS.toLayer[R, C](service) } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala index e54b81f70..c26a2ccad 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala @@ -2,8 +2,7 @@ package scalapb.zio_grpc import io.grpc.ServerServiceDefinition import zio.URIO -import izumi.reflect.Tag -import zio.IsNotIntersection +import zio.Tag /** Provides a way to bind a ZIO gRPC service implementations to a server. */ trait ZBindableService[-R, S] { @@ -26,8 +25,7 @@ object ZBindableService { ev3: GenericBindable[S], ev4: CanBind[C], ev5: TransformableService[S], - ev6: Tag[C], - ev7: IsNotIntersection[C] + ev6: Tag[C] ): ZBindableService[R, T] = new ZBindableService[R, T] { def bindService(s: T): zio.URIO[R, ServerServiceDefinition] = diff --git a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala index 194230a43..8887e3693 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala @@ -1,10 +1,7 @@ package scalapb.zio_grpc -import zio.ZIO +import zio.{EnvironmentTag, Tag, ZEnvironment, ZIO} import zio.stream.ZStream -import zio.Tag -import zio.ZEnvironment -import zio.IsNotIntersection /** Describes a transformation of an effect or a stream. * @@ -40,7 +37,7 @@ object ZTransform { } /** Provides the entire environment of a service (leaving only the context) */ - def provideEnvironment[R, E, Context: Tag]( + def provideEnvironment[R, E, Context: EnvironmentTag]( env: => ZEnvironment[R] ): ZTransform[R with Context, E, Context] = provideSomeEnvironment((ctx: ZEnvironment[Context]) => env.union[Context](ctx)) @@ -48,7 +45,7 @@ object ZTransform { /** Changes the Context type of the service from Context1 to Context2, by applying an effectful function on the * environment */ - def transformContext[RIn, E, ContextIn: Tag: IsNotIntersection, ROut <: RIn, ContextOut: Tag: IsNotIntersection]( + def transformContext[RIn, E, ContextIn: Tag, ROut <: RIn, ContextOut: Tag]( f: ContextOut => ZIO[ROut, E, ContextIn] ): ZTransform[RIn with ContextIn, E, ROut with ContextOut] = new ZTransform[RIn with ContextIn, E, ROut with ContextOut] { diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index 763ef2b12..8138f7564 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -1,9 +1,8 @@ package scalapb import io.grpc.Status -import zio.IO +import zio.{IO, Scope, ZIO} import zio.stream.Stream -import zio.Managed package object zio_grpc { type GIO[A] = IO[Status, A] @@ -12,5 +11,5 @@ package object zio_grpc { type Server = Server.Service - type ZManagedChannel[R] = Managed[Throwable, ZChannel[R]] + type ZManagedChannel[R] = ZIO[Scope, Throwable, ZChannel[R]] } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala b/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala index 1f8dc2ca1..1b1510dc4 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala @@ -1,14 +1,14 @@ package scalapb.zio_grpc -import zio.ZManaged import io.grpc.ManagedChannel +import zio.ZIO object ZManagedChannel { def apply[R]( channel: ManagedChannel, interceptors: Seq[ZClientInterceptor[R]] = Nil ): ZManagedChannel[R] = - ZManaged.succeed(new ZChannel[R](channel, interceptors)) + ZIO.succeed(new ZChannel[R](channel, interceptors)) def apply(channel: ManagedChannel): ZManagedChannel[Any] = apply(channel, Nil) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index ea1ef5e54..5746aba71 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -1,7 +1,6 @@ package scalapb.zio_grpc.client -import zio.{Chunk, IO, ZIO} -import zio.stream.Stream +import zio.{Chunk, ZIO} import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.ZChannel import io.grpc.MethodDescriptor @@ -19,7 +18,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZIO[R, Status, Res] = - IO.async { callback => + ZIO.async { callback => channel.channel.client.rpcCall[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, req, @@ -27,8 +26,8 @@ object ClientCalls { method.methodInfo, (errorInfo: ErrorInfo, resp: Res) => if (errorInfo != null) - callback(IO.fail(Status.fromErrorInfo(errorInfo))) - else callback(IO.succeed(resp)) + callback(ZIO.fail(Status.fromErrorInfo(errorInfo))) + else callback(ZIO.succeed(resp)) ) } @@ -39,7 +38,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[R, Status, Res] = - Stream.async[R, Status, Res] { cb => + ZStream.async[R, Status, Res] { cb => channel.channel.client .serverStreaming[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -65,7 +64,7 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZIO[R with R0, Status, Res] = - IO.fail(Status.INTERNAL.withDescription("Not supported")) + ZIO.fail(Status.INTERNAL.withDescription("Not supported")) def bidiCall[R, R0, Req, Res]( channel: ZChannel[R], @@ -74,5 +73,5 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZStream[R with R0, Status, Res] = - Stream.fail(Status.INTERNAL.withDescription("Not supported")) + ZStream.fail(Status.INTERNAL.withDescription("Not supported")) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 11ba24e5f..36213eec2 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -1,14 +1,8 @@ package scalapb.zio_grpc -import zio.{Task, UIO, URIO, ZIO} -import zio.Managed -import zio.ZLayer -import zio.ZManaged -import zio.Tag - +import zio.{Scope, Tag, Task, URIO, ZIO, ZLayer} import io.grpc.ServerBuilder import io.grpc.ServerServiceDefinition -import zio.IsNotIntersection object Server { trait Service { @@ -30,18 +24,18 @@ object Server { def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit - def toManaged: ZManaged[Any, Throwable, Service] = start.as(this).toManagedWith(_ => this.shutdown.ignore) + def toManaged: ZIO[Scope, Throwable, Service] = start.as(this).withFinalizer(_ => this.shutdown.ignore) } @deprecated("Use ManagedServer.fromBuilder", "0.4.0") - def zmanaged(builder: => ServerBuilder[_]): Managed[Throwable, Service] = - zmanaged(builder, UIO.succeed(Nil)) + def zmanaged(builder: => ServerBuilder[_]): ZIO[Scope, Throwable, Service] = + zmanaged(builder, ZIO.succeed(Nil)) @deprecated("Use ManagedServer.fromServiceList", "0.4.0") def zmanaged[R]( builder: => ServerBuilder[_], services: URIO[R, List[ServerServiceDefinition]] - ): ZManaged[R, Throwable, Service] = ManagedServer.fromServiceList(builder, services) + ): ZIO[R with Scope, Throwable, Service] = ManagedServer.fromServiceList(builder, services) @deprecated("Use ManagedServer.fromService", "0.4.0") def zmanaged[S0, R0]( @@ -49,10 +43,10 @@ object Server { s0: S0 )(implicit b0: ZBindableService[R0, S0] - ): ZManaged[R0, Throwable, Service] = + ): ZIO[R0 with Scope, Throwable, Service] = ManagedServer.fromServiceList( builder, - URIO.collectAll(ZBindableService.serviceDefinition(s0) :: Nil) + ZIO.collectAll(ZBindableService.serviceDefinition(s0) :: Nil) ) @deprecated("Use ManagedServer.fromServices", "0.4.0") @@ -68,10 +62,10 @@ object Server { )(implicit b0: ZBindableService[R0, S0], b1: ZBindableService[R1, S1] - ): ZManaged[R0 with R1, Throwable, Service] = + ): ZIO[R0 with R1 with Scope, Throwable, Service] = ManagedServer.fromServiceList( builder, - URIO.collectAll( + ZIO.collectAll( ZBindableService.serviceDefinition(s0) :: ZBindableService.serviceDefinition(s1) :: Nil ) @@ -94,35 +88,35 @@ object Server { b0: ZBindableService[R0, S0], b1: ZBindableService[R1, S1], b2: ZBindableService[R2, S2] - ): ZManaged[R0 with R1 with R2, Throwable, Service] = + ): ZIO[R0 with R1 with R2 with Scope, Throwable, Service] = ManagedServer.fromServiceList( builder, - URIO.collectAll( + ZIO.collectAll( ZBindableService.serviceDefinition(s0) :: ZBindableService.serviceDefinition(s1) :: ZBindableService.serviceDefinition(s2) :: Nil ) ) - def fromManaged(zm: Managed[Throwable, Service]) = - ZLayer.fromManaged(zm) + def fromManaged(zm: ZIO[Scope, Throwable, Service]) = + ZLayer.scoped(zm) } object ServerLayer { def fromServiceList[R](builder: => ServerBuilder[_], l: ServiceList[R]) = - ManagedServer.fromServiceList(builder, l).toLayer + ZLayer.scoped[R](ManagedServer.fromServiceList(builder, l)) - def access[S1: Tag: IsNotIntersection]( + def access[S1: Tag]( builder: => ServerBuilder[_] )(implicit bs: ZBindableService[Any, S1]): ZLayer[Any with S1, Throwable, Server] = fromServiceList(builder, ServiceList.access[S1]) - def accessEnv[R, S1: Tag: IsNotIntersection]( + def accessEnv[R, S1: Tag]( builder: => ServerBuilder[_] )(implicit bs: ZBindableService[R, S1]): ZLayer[R with S1, Throwable, Server] = fromServiceList(builder, ServiceList.accessEnv[R, S1]) - def fromServiceLayer[R, S1: Tag: IsNotIntersection]( + def fromServiceLayer[R, S1: Tag]( serverBuilder: => ServerBuilder[_] )(l: ZLayer[R, Throwable, S1])(implicit bs: ZBindableService[Any, S1]) = l >>> fromServiceList(serverBuilder, ServiceList.access[S1]) @@ -147,42 +141,42 @@ object ServerLayer { } object ManagedServer { - def fromBuilder(builder: => ServerBuilder[_]): ZManaged[Any, Throwable, Server.Service] = + def fromBuilder(builder: => ServerBuilder[_]): ZIO[Scope, Throwable, Server.Service] = fromServiceList(builder, ServiceList) def fromService[R1, S1](builder: => ServerBuilder[_], s1: S1)(implicit bs: ZBindableService[R1, S1] - ): ZManaged[R1, Throwable, Server.Service] = + ): ZIO[R1 with Scope, Throwable, Server.Service] = fromServiceList(builder, ServiceList.add(s1)) def fromServices[R1, S1, R2, S2](builder: => ServerBuilder[_], s1: S1, s2: S2)(implicit bs1: ZBindableService[R1, S1], bs2: ZBindableService[R2, S2] - ): ZManaged[R1 with R2, Throwable, Server.Service] = + ): ZIO[R1 with R2 with Scope, Throwable, Server.Service] = fromServiceList(builder, ServiceList.add(s1).add(s2)) def fromServices[R1, S1, R2, S2, R3, S3](builder: => ServerBuilder[_], s1: S1, s2: S2, s3: S3)(implicit bs1: ZBindableService[R1, S1], bs2: ZBindableService[R2, S2], bs3: ZBindableService[R3, S3] - ): ZManaged[R1 with R2 with R3, Throwable, Server.Service] = + ): ZIO[R1 with R2 with R3 with Scope, Throwable, Server.Service] = fromServiceList(builder, ServiceList.add(s1).add(s2).add(s3)) def fromServiceList[R]( builder: => ServerBuilder[_], services: URIO[R, List[ServerServiceDefinition]] - ): ZManaged[R, Throwable, Server.Service] = fromServiceList(builder, services.toManaged) + ): ZIO[R with Scope, Throwable, Server.Service] = fromServiceListScoped[R](builder, services) def fromServiceList[R]( builder: => ServerBuilder[_], services: ServiceList[R] - ): ZManaged[R, Throwable, Server.Service] = - fromServiceList(builder, services.bindAll) + ): ZIO[R with Scope, Throwable, Server.Service] = + fromServiceListScoped[R](builder, services.bindAll) - def fromServiceList[R]( + def fromServiceListScoped[R]( builder: => ServerBuilder[_], - services: ZManaged[R, Throwable, List[ServerServiceDefinition]] - ): ZManaged[R, Throwable, Server.Service] = + services: ZIO[R with Scope, Throwable, List[ServerServiceDefinition]] + ): ZIO[R with Scope, Throwable, Server.Service] = for { services0 <- services serverImpl = new Server.ServiceImpl( diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala index bf1c72cf6..4f7a92cb4 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala @@ -8,19 +8,19 @@ import io.grpc.protobuf.services.ProtoReflectionService trait ServerMain extends zio.ZIOAppDefault { def port: Int = 9000 - def welcome: ZIO[ZEnv, Throwable, Unit] = + def welcome: ZIO[Any, Throwable, Unit] = printLine("Server is running. Press Ctrl-C to stop.") // Override this to add services. For example // def serviceList = // ServiceList.add(MyService) - def services: ServiceList[ZEnv] + def services: ServiceList[Any] def builder = ServerBuilder.forPort(port).addService(ProtoReflectionService.newInstance()) - def serverLive: ZLayer[ZEnv, Throwable, Server] = ServerLayer.fromServiceList(builder, services) + def serverLive: ZLayer[Any, Throwable, Server] = ServerLayer.fromServiceList(builder, services) - val myAppLogic = welcome *> serverLive.build.useForever + val myAppLogic = welcome *> serverLive.build *> ZIO.never def run = myAppLogic.exitCode } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala index b81bef2cf..285107bf4 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala @@ -1,46 +1,47 @@ package scalapb.zio_grpc -import zio.{Tag, ZIO, ZLayer, ZManaged} +import zio.{Scope, Tag, ZEnvironment, ZIO} import io.grpc.ServerServiceDefinition -import zio.IsNotIntersection -import zio.ZEnvironment /** Represents a managed list of services to be added to the a server. * * This is just a wrapper around a list of ServerServiceDefinition. */ -sealed class ServiceList[-RR] private[scalapb] (val bindAll: ZManaged[RR, Throwable, List[ServerServiceDefinition]]) { +sealed class ServiceList[-RR] private[scalapb] ( + val bindAll: ZIO[RR with Scope, Throwable, List[ServerServiceDefinition]] +) { /** Adds a service to the service list */ def add[R1 <: RR, S1](s1: S1)(implicit b: ZBindableService[R1, S1]): ServiceList[R1] = - addManaged[R1, RR, S1](ZManaged.succeed(s1)) + addManaged[R1, RR, S1](ZIO.succeed(s1)) /** Adds an effect that returns a service to the service list */ def addM[R1 <: RR, R2 <: RR, S1]( s1: ZIO[R2, Throwable, S1] )(implicit b: ZBindableService[R1, S1]): ServiceList[R1 with R2] = - addManaged[R1, R2, S1](s1.toManaged) + addManaged[R1, R2, S1](s1) - def addManaged[R1 <: RR, R2 <: RR, S1](s1: ZManaged[R2, Throwable, S1])(implicit + def addManaged[R1 <: RR, R2 <: RR, S1](s1: ZIO[R2 with Scope, Throwable, S1])(implicit bs: ZBindableService[R1, S1] ): ServiceList[RR with R1 with R2] = - new ServiceList(for { + new ServiceList[RR with R1 with R2](for { l <- bindAll - sd <- s1.mapZIO(bs.bindService(_)) + sd <- s1.flatMap(bs.bindService(_)) } yield sd :: l) /** Adds a dependency on a service that will be provided later from the environment or a Layer * */ - def access[B: IsNotIntersection: Tag](implicit bs: ZBindableService[Any, B]): ServiceList[B with RR] = + def access[B: Tag](implicit bs: ZBindableService[Any, B]): ServiceList[B with RR] = accessEnv[Any, B] - def accessEnv[R, B: IsNotIntersection: Tag](implicit bs: ZBindableService[R, B]): ServiceList[R with B with RR] = - new ServiceList(ZManaged.environmentWithManaged[R with B with RR] { r => - bindAll.mapZIO(ll => bs.bindService(r.get[B]).map(_ :: ll)) + def accessEnv[R, B: Tag](implicit bs: ZBindableService[R, B]): ServiceList[R with B with RR] = + new ServiceList[R with B with RR](ZIO.environmentWithZIO[R with B with RR] { r => + bindAll.flatMap(ll => bs.bindService(r.get[B]).map(_ :: ll)) }) - def provideEnvironment(r: => ZEnvironment[RR]): ServiceList[Any] = new ServiceList[Any](bindAll.provideEnvironment(r)) + def provideEnvironment(r: => ZEnvironment[RR]): ServiceList[Any] = + new ServiceList[Any](bindAll.provideSomeEnvironment[Scope](r.union[Scope](_))) } -object ServiceList extends ServiceList(ZManaged.succeed(Nil)) { +object ServiceList extends ServiceList(ZIO.succeed(Nil)) { val empty = this } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala index c392432ac..dc1282875 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala @@ -2,19 +2,18 @@ package scalapb.zio_grpc import io.grpc.ManagedChannelBuilder import zio.ZIO -import zio.ZManaged object ZManagedChannel { def apply[R]( builder: => ManagedChannelBuilder[_], interceptors: Seq[ZClientInterceptor[R]] = Nil ): ZManagedChannel[R] = - ZManaged.acquireReleaseWith(ZIO.attempt(new ZChannel(builder.build(), interceptors)))( + ZIO.acquireRelease(ZIO.attempt(new ZChannel(builder.build(), interceptors)))( _.shutdown().ignore ) def apply(builder: ManagedChannelBuilder[_]): ZManagedChannel[Any] = - ZManaged.acquireReleaseWith(ZIO.attempt(new ZChannel(builder.build(), Nil)))( + ZIO.acquireRelease(ZIO.attempt(new ZChannel(builder.build(), Nil)))( _.shutdown().ignore ) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala index 002eaf0f7..b2afa0f95 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc.client import io.grpc.{CallOptions, MethodDescriptor, Status} import scalapb.zio_grpc.{SafeMetadata, ZChannel} -import zio.stream.{Stream, ZStream} +import zio.stream.ZStream import zio.{Exit, ZIO} object ClientCalls { @@ -50,7 +50,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[R, Status, Res] = - Stream + ZStream .fromZIO(channel.newCall(method, options)) .flatMap(serverStreamingCall(_, headers, req)) @@ -59,12 +59,12 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[R, Status, Res] = - Stream + ZStream .acquireReleaseExitWith( StreamingClientCallListener.make[R, Res](call) )(anyExitHandler[R, Req, Res](call)) .flatMap { (listener: StreamingClientCallListener[R, Res]) => - Stream + ZStream .fromZIO( call.start(listener, headers) *> call.request(1) *> @@ -115,7 +115,7 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZStream[R with R0, Status, Res] = - Stream + ZStream .fromZIO( channel.newCall(method, options) ) @@ -126,17 +126,17 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZStream[R with R0, Status, Res] = - Stream + ZStream .acquireReleaseExitWith( StreamingClientCallListener.make[R, Res](call) )(anyExitHandler(call)) .flatMap { (listener: StreamingClientCallListener[R, Res]) => - val init = Stream + val init = ZStream .fromZIO( call.start(listener, headers) *> call.request(1) ) - val sendRequestStream = (init ++ req.tap(call.sendMessage) ++ Stream + val sendRequestStream = (init ++ req.tap(call.sendMessage) ++ ZStream .fromZIO(call.halfClose())).drain sendRequestStream.merge(listener.stream) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 2bd578169..2f9cec219 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -1,15 +1,10 @@ package scalapb.zio_grpc.client -import zio.Runtime -import zio.Ref - +import zio.{Queue, Ref, Runtime, URIO, ZIO} import io.grpc.ClientCall import io.grpc.{Metadata, Status} -import zio.Queue -import zio.IO import StreamingCallState._ import zio.stream.ZStream -import zio.URIO sealed trait StreamingCallState[+Res] @@ -48,8 +43,8 @@ class StreamingClientCallListener[R, Res]( .fromQueue(queue) .tap { case Left((status, trailers @ _)) => - queue.shutdown *> IO.when(!status.isOk)(IO.fail(status)) - case _ => IO.unit + queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(status)) + case _ => ZIO.unit } .collect { case Right(v) => v diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala index 1c31b0f3f..008ae5a26 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala @@ -3,7 +3,7 @@ package scalapb.zio_grpc.server import io.grpc.ServerCall.Listener import io.grpc.Status import zio._ -import zio.stream.Stream +import zio.stream.{Stream, ZStream} import scalapb.zio_grpc.RequestContext import io.grpc.Metadata @@ -117,7 +117,7 @@ object CallDriver { ) }, run = { - val requestStream = Stream + val requestStream = ZStream .fromQueue(queue) .collectWhileSome diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index e3f45b96b..9e9abfcda 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -3,7 +3,6 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.ZioTestservice.ZTestService import zio.Clock import zio.Console -import zio.Managed import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.testservice.{Request, Response} @@ -11,7 +10,7 @@ import zio.stream.ZStream import io.grpc.ServerBuilder import zio.test._ -object BindableServiceSpec extends DefaultRunnableSpec { +object BindableServiceSpec extends ZIOSpecDefault { implicitly[ZBindableService[Any, ZTestService[Any, RequestContext]]] implicitly[ZBindableService[Any, ZTestService[Any, SafeMetadata]]] implicitly[ZBindableService[Any, ZTestService[Any, Any]]] @@ -71,9 +70,9 @@ object BindableServiceSpec extends DefaultRunnableSpec { val z6 = ServiceList.addM(ZIO.succeed(S6)) val z7 = ServiceList.addM(ZIO.succeed(S7)) val z8 = ServiceList.access[S1.type] - val z9 = ServiceList.addManaged(Managed.succeed(S4)) + val z9 = ServiceList.addManaged(ZIO.succeed(S4)) - def spec: ZSpec[ZTestEnv, scalapb.zio_grpc.BindableServiceSpec.Failure] = suite("BindableServiceSpec")( + def spec = suite("BindableServiceSpec")( test("empty - required to make the compiler happy") { assertCompletes } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala index 8cb9de1b1..3156a89d1 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala @@ -6,21 +6,22 @@ import scalapb.zio_grpc.server.CallDriver import zio._ import zio.Clock._ import zio.Random._ -import zio.test.{DefaultRunnableSpec, _} +import zio.test._ -object CallDriverSpec extends DefaultRunnableSpec { +object CallDriverSpec extends ZIOSpecDefault { def spec = suite("CallDriverSpec")( test("exitToStatus prioritizes failures over interrupts") { val effectWithInterruptAndFailure = ZIO - .foreachParNDiscard(128)(List.range(0, 16))(i => + .foreachParDiscard(List.range(0, 16))(i => for { delay <- nextIntBetween(100, 200) _ <- ClockLive.sleep(delay.milliseconds) _ <- ZIO.fail(Status.INVALID_ARGUMENT.withDescription(s"i=$i")) } yield () ) - assertM(effectWithInterruptAndFailure.exit map CallDriver.exitToStatus)( + .withParallelism(128) + assertZIO(effectWithInterruptAndFailure.exit map CallDriver.exitToStatus)( hasStatusCode(Status.INVALID_ARGUMENT) ) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala index 2bde39f77..b258694cd 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala @@ -8,7 +8,7 @@ import zio.Schedule import zio.test.Assertion._ import zio.test._ -object ClientCallsSpec extends DefaultRunnableSpec { +object ClientCallsSpec extends ZIOSpecDefault { def unarySuite = suite("unaryCall")( diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 2216d8f70..ca1cb236f 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -9,24 +9,22 @@ import io.grpc.ServerBuilder import io.grpc.Metadata import io.grpc.ManagedChannelBuilder import io.grpc.Status -import zio.Console import zio.stream.ZStream -import zio.Clock -object EnvSpec extends DefaultRunnableSpec with MetadataTests { +object EnvSpec extends ZIOSpecDefault with MetadataTests { case class User(name: String) val getUser = ZIO.environmentWith[User](_.get) - object ServiceWithConsole extends ZTestService[Console with Clock, User] { - def unary(request: Request): ZIO[Console with User, Status, Response] = + object ServiceWithConsole extends ZTestService[Any, User] { + def unary(request: Request): ZIO[User, Status, Response] = for { user <- getUser } yield Response(out = user.name) def serverStreaming( request: Request - ): ZStream[Console with User, Status, Response] = + ): ZStream[User, Status, Response] = ZStream.environmentWithStream { (u: ZEnvironment[User]) => ZStream( Response(u.get.name), @@ -54,11 +52,11 @@ object EnvSpec extends DefaultRunnableSpec with MetadataTests { def parseUser(rc: RequestContext): IO[Status, User] = rc.metadata.get(UserKey).flatMap { case Some("alice") => - IO.fail( + ZIO.fail( Status.PERMISSION_DENIED.withDescription("You are not allowed!") ) - case Some(name) => IO.succeed(User(name)) - case None => IO.fail(Status.UNAUTHENTICATED) + case Some(name) => ZIO.succeed(User(name)) + case None => ZIO.fail(Status.UNAUTHENTICATED) } val serviceLayer = ServiceWithConsole.transformContextM(parseUser(_)).toLayer @@ -69,19 +67,21 @@ object EnvSpec extends DefaultRunnableSpec with MetadataTests { override def clientLayer( userName: Option[String] ): URLayer[Server, TestServiceClient] = - ZManaged.environmentWithManaged { (ss: ZEnvironment[Server.Service]) => - ZManaged.fromZIO(ss.get[Server.Service].port).orDie flatMap { (port: Int) => - val ch = ZManagedChannel( - ManagedChannelBuilder.forAddress("localhost", port).usePlaintext(), - Seq( - ZClientInterceptor.headersUpdater((_, _, md) => ZIO.foreach(userName)(un => md.put(UserKey, un)).unit) + ZLayer.scoped { + ZIO.environmentWithZIO { (ss: ZEnvironment[Server.Service]) => + ss.get[Server.Service].port.orDie flatMap { (port: Int) => + val ch = ZManagedChannel( + ManagedChannelBuilder.forAddress("localhost", port).usePlaintext(), + Seq( + ZClientInterceptor.headersUpdater((_, _, md) => ZIO.foreach(userName)(un => md.put(UserKey, un)).unit) + ) ) - ) - TestServiceClient - .managed(ch) - .orDie + TestServiceClient + .managed(ch) + .orDie + } } - }.toLayer + } val layers = serviceLayer >>> (serverLayer ++ Annotations.live) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala index 615b8619a..ec3d5302d 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala @@ -3,11 +3,11 @@ package scalapb.zio_grpc import zio.ZLayer import zio.test._ import zio.test.Assertion._ -import zio.stream.Stream -import testservice.ZioTestservice.TestServiceClient -import testservice._ +import zio.stream.ZStream import io.grpc.Status import TestUtils._ +import scalapb.zio_grpc.testservice._ +import scalapb.zio_grpc.testservice.ZioTestservice._ trait MetadataTests { def clientLayer( @@ -24,56 +24,56 @@ trait MetadataTests { val unaryEffect = TestServiceClient.unary(Request()) val serverStreamingEffect = TestServiceClient.serverStreaming(Request()).runCollect - val clientStreamingEffect = TestServiceClient.clientStreaming(Stream.empty) - val bidiEffect = TestServiceClient.bidiStreaming(Stream.empty).runCollect + val clientStreamingEffect = TestServiceClient.clientStreaming(ZStream.empty) + val bidiEffect = TestServiceClient.bidiStreaming(ZStream.empty).runCollect def permissionDeniedSuite = suite("unauthorized request fail for")( test("unary") { - assertM(unaryEffect.exit)(permissionDenied) + assertZIO(unaryEffect.exit)(permissionDenied) }, test("server streaming") { - assertM(serverStreamingEffect.exit)(permissionDenied) + assertZIO(serverStreamingEffect.exit)(permissionDenied) }, test("client streaming") { - assertM(clientStreamingEffect.exit)(permissionDenied) + assertZIO(clientStreamingEffect.exit)(permissionDenied) }, test("bidi streaming") { - assertM(bidiEffect.exit)(permissionDenied) + assertZIO(bidiEffect.exit)(permissionDenied) } ).provideLayer(unauthClient) def unauthenticatedSuite = suite("authorized request fail for")( test("unary") { - assertM(unaryEffect.exit)(unauthenticated) + assertZIO(unaryEffect.exit)(unauthenticated) }, test("server streaming") { - assertM(serverStreamingEffect.exit)(unauthenticated) + assertZIO(serverStreamingEffect.exit)(unauthenticated) }, test("client streaming") { - assertM(clientStreamingEffect.exit)(unauthenticated) + assertZIO(clientStreamingEffect.exit)(unauthenticated) }, test("bidi streaming") { - assertM(bidiEffect.exit)(unauthenticated) + assertZIO(bidiEffect.exit)(unauthenticated) } ).provideLayer(unsetClient) def authenticatedSuite = suite("authorized request fail for")( test("unary") { - assertM(unaryEffect)(equalTo(Response("bob"))) + assertZIO(unaryEffect)(equalTo(Response("bob"))) }, test("server streaming") { - assertM(serverStreamingEffect)( + assertZIO(serverStreamingEffect)( equalTo(Seq(Response("bob"), Response("bob"))) ) }, test("client streaming") { - assertM(clientStreamingEffect)(equalTo(Response("bob"))) + assertZIO(clientStreamingEffect)(equalTo(Response("bob"))) }, test("bidi streaming") { - assertM(bidiEffect)(equalTo(Seq(Response("bob")))) + assertZIO(bidiEffect)(equalTo(Seq(Response("bob")))) } ).provideLayer(authClient) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index 092059679..d9b5fe1fe 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -90,20 +90,20 @@ package object server { def bidiStreaming( request: Stream[Status, Request] ): Stream[Status, Response] = - ((ZStream.fromZIO(requestReceived.succeed(())).drain ++ + (ZStream.fromZIO(requestReceived.succeed(())).drain ++ (request.flatMap { r => r.scenario match { case Scenario.OK => - Stream(Response(r.in.toString)) + ZStream(Response(r.in.toString)) .repeat(Schedule.recurs(r.in - 1)) - case Scenario.DELAY => Stream.never - case Scenario.DIE => Stream.die(new RuntimeException("FOO")) + case Scenario.DELAY => ZStream.never + case Scenario.DIE => ZStream.die(new RuntimeException("FOO")) case Scenario.ERROR_NOW => - Stream.fail(Status.INTERNAL.withDescription("Intentional error")) - case _ => Stream.fail(Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}")) + ZStream.fail(Status.INTERNAL.withDescription("Intentional error")) + case _ => ZStream.fail(Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}")) } - } ++ Stream(Response("DONE")))) - .ensuring(exit.succeed(Exit.succeed(Response())))) + } ++ ZStream(Response("DONE"))) + .ensuring(exit.succeed(Exit.succeed(Response())))) .provideEnvironment(ZEnvironment(clock, console)) def awaitReceived = requestReceived.await @@ -123,11 +123,15 @@ package object server { p3 <- Promise.make[Nothing, Exit[Status, Response]] } yield new Service(p1, p2, p3)(clock, console) - def makeFromEnv: ZIO[Clock with Console, Nothing, Service] = - ZIO.environmentWithZIO[Clock with Console](env => make(env.get[Clock], env.get[Console])) + def makeFromEnv: ZIO[Any, Nothing, Service] = + for { + clock <- ZIO.clock + console <- ZIO.console + service <- make(clock, console) + } yield service - val live: ZLayer[Clock with Console, Nothing, TestServiceImpl] = - makeFromEnv.toLayer + val live: ZLayer[Any, Nothing, TestServiceImpl] = + ZLayer(makeFromEnv) val any: ZLayer[TestServiceImpl, Nothing, TestServiceImpl] = ZLayer.environment diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 41f3ea748..fc54d4b77 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -6,40 +6,41 @@ import scalapb.zio_grpc.server.TestServiceImpl import scalapb.zio_grpc.testservice.Request.Scenario import scalapb.zio_grpc.testservice.ZioTestservice.TestServiceClient import scalapb.zio_grpc.testservice._ -import zio.{durationInt, Fiber, Queue, URIO, ZIO, ZLayer, ZQueue} +import zio.{durationInt, Fiber, Queue, URIO, ZIO, ZLayer} import zio.stream.{Stream, ZStream} import zio.test.Assertion._ import zio.test.TestAspect.timeout import zio.test._ -object TestServiceSpec extends DefaultRunnableSpec { +object TestServiceSpec extends ZIOSpecDefault { val serverLayer: ZLayer[TestServiceImpl, Throwable, Server] = ServerLayer.access[TestServiceImpl.Service](ServerBuilder.forPort(0)) - val clientLayer: ZLayer[Server, Nothing, TestServiceClient] = { - for { - ss <- ZIO.service[Server.Service].toManaged - port <- ss.port.toManaged.orDie - ch = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext() - client <- TestServiceClient.managed(ZManagedChannel(ch)).orDie - } yield client - }.toLayer + val clientLayer: ZLayer[Server, Nothing, TestServiceClient] = + ZLayer.scoped[Server] { + for { + ss <- ZIO.service[Server.Service] + port <- ss.port.orDie + ch = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext() + client <- TestServiceClient.managed(ZManagedChannel(ch)).orDie + } yield client + } def unarySuite = suite("unary request")( test("returns successful response") { - assertM(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)))( + assertZIO(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)))( equalTo(Response("Res12")) ) }, test("returns successful response when the program is used repeatedly") { // Must not capture an instance of ZClientCall, so call.start() should not be invoked twice - assertM(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)).repeatN(1))( + assertZIO(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)).repeatN(1))( equalTo(Response("Res12")) ) }, test("returns correct error response") { - assertM( + assertZIO( TestServiceClient .unary(Request(Request.Scenario.ERROR_NOW, in = 12)) .exit @@ -58,7 +59,7 @@ object TestServiceSpec extends DefaultRunnableSpec { } yield assert(exit.isInterrupted)(isTrue) }, test("returns response on failures") { - assertM( + assertZIO( TestServiceClient.unary(Request(Request.Scenario.DIE, in = 12)).exit )( fails(hasStatusCode(Status.INTERNAL)) @@ -86,15 +87,13 @@ object TestServiceSpec extends DefaultRunnableSpec { assertionA: Assertion[A], assertionB: Assertion[B] ): Assertion[(A, B)] = - Assertion.assertionDirect("tuple")( - Assertion.Render.param(assertionA), - Assertion.Render.param(assertionB) - )(run => assertionA.run(run._1) && assertionB.run(run._2)) + hasField[(A, B), A]("", _._1, assertionA) && + hasField[(A, B), B]("", _._2, assertionB) def serverStreamingSuite = suite("server streaming request")( test("returns successful response") { - assertM( + assertZIO( collectWithError( TestServiceClient.serverStreaming( Request(Request.Scenario.OK, in = 12) @@ -103,7 +102,7 @@ object TestServiceSpec extends DefaultRunnableSpec { )(equalTo((List(Response("X1"), Response("X2")), None))) }, test("returns correct error response") { - assertM( + assertZIO( collectWithError( TestServiceClient.serverStreaming( Request(Request.Scenario.ERROR_NOW, in = 12) @@ -114,7 +113,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) }, test("returns correct error after two response") { - assertM( + assertZIO( collectWithError( TestServiceClient.serverStreaming( Request(Request.Scenario.ERROR_AFTER, in = 12) @@ -128,7 +127,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) }, test("catches client cancellations") { - assertM(for { + assertZIO(for { fb <- TestServiceClient .serverStreaming( Request(Request.Scenario.DELAY, in = 12) @@ -141,7 +140,7 @@ object TestServiceSpec extends DefaultRunnableSpec { } yield exit)(fails(hasStatusCode(Status.CANCELLED))) }, test("returns failure when failure") { - assertM( + assertZIO( collectWithError( TestServiceClient.serverStreaming( Request(Request.Scenario.DIE, in = 12) @@ -156,9 +155,9 @@ object TestServiceSpec extends DefaultRunnableSpec { def clientStreamingSuite = suite("client streaming request")( test("returns successful response") { - assertM( + assertZIO( TestServiceClient.clientStreaming( - Stream( + ZStream( Request(Scenario.OK, in = 17), Request(Scenario.OK, in = 12), Request(Scenario.OK, in = 33) @@ -167,17 +166,17 @@ object TestServiceSpec extends DefaultRunnableSpec { )(equalTo(Response("62"))) }, test("returns successful response on empty stream") { - assertM( + assertZIO( TestServiceClient.clientStreaming( - Stream.empty + ZStream.empty ) )(equalTo(Response("0"))) }, test("returns correct error response") { - assertM( + assertZIO( TestServiceClient .clientStreaming( - Stream( + ZStream( Request(Scenario.OK, in = 17), Request(Scenario.OK, in = 12), Request(Scenario.ERROR_NOW, in = 33) @@ -187,10 +186,10 @@ object TestServiceSpec extends DefaultRunnableSpec { )(fails(hasStatusCode(Status.INTERNAL))) }, test("catches client cancellation") { - assertM(for { + assertZIO(for { fiber <- TestServiceClient .clientStreaming( - Stream( + ZStream( Request(Scenario.OK, in = 17), Request(Scenario.OK, in = 12), Request(Scenario.DELAY, in = 33) @@ -203,10 +202,10 @@ object TestServiceSpec extends DefaultRunnableSpec { } yield exit)(isInterrupted) }, test("returns response on failures") { - assertM( + assertZIO( TestServiceClient .clientStreaming( - Stream( + ZStream( Request(Scenario.OK, in = 17), Request(Scenario.OK, in = 12), Request(Scenario.DIE, in = 33) @@ -216,10 +215,10 @@ object TestServiceSpec extends DefaultRunnableSpec { )(fails(hasStatusCode(Status.INTERNAL))) }, test("returns response on failures for infinite input") { - assertM( + assertZIO( TestServiceClient .clientStreaming( - Stream.repeat(Request(Scenario.DIE, in = 33)) + ZStream.repeat(Request(Scenario.DIE, in = 33)) ) .exit )(fails(hasStatusCode(Status.INTERNAL))) @@ -241,18 +240,18 @@ object TestServiceSpec extends DefaultRunnableSpec { object BidiFixture { def apply[R, Req, Res]( call: Stream[Status, Req] => ZStream[R, Status, Res] - ): zio.URIO[R with zio.Console, BidiFixture[Req, Res]] = + ): zio.URIO[R, BidiFixture[Req, Res]] = for { - in <- ZQueue.unbounded[Res] - out <- ZQueue.unbounded[Option[Req]] - fiber <- call(Stream.fromQueue(out).collectWhileSome).foreach(in.offer).fork + in <- Queue.unbounded[Res] + out <- Queue.unbounded[Option[Req]] + fiber <- call(ZStream.fromQueue(out).collectWhileSome).foreach(in.offer).fork } yield BidiFixture(in, out, fiber) } def bidiStreamingSuite = suite("bidi streaming request")( test("returns successful response") { - assertM(for { + assertZIO(for { bf <- BidiFixture(TestServiceClient.bidiStreaming[Any]) _ <- bf.send(Request(Scenario.OK, in = 1)) f1 <- bf.receive(1) @@ -274,7 +273,7 @@ object TestServiceSpec extends DefaultRunnableSpec { ) }, test("returns correct error response") { - assertM(for { + assertZIO(for { bf <- BidiFixture(TestServiceClient.bidiStreaming[Any]) _ <- bf.send(Request(Scenario.OK, in = 1)) f1 <- bf.receive(1) @@ -289,15 +288,15 @@ object TestServiceSpec extends DefaultRunnableSpec { ) }, test("catches client interrupts") { - assertM( + assertZIO( for { testServiceImpl <- ZIO.environment[TestServiceImpl] collectFiber <- collectWithError( TestServiceClient.bidiStreaming[Any]( - Stream( + ZStream( Request(Scenario.OK, in = 17) - ) ++ Stream.fromZIO(testServiceImpl.get.awaitReceived).drain - ++ Stream.fail(Status.CANCELLED) + ) ++ ZStream.fromZIO(testServiceImpl.get.awaitReceived).drain + ++ ZStream.fail(Status.CANCELLED) ) ).fork _ <- testServiceImpl.get.awaitExit @@ -308,10 +307,10 @@ object TestServiceSpec extends DefaultRunnableSpec { ) }, test("returns response on failures") { - assertM( + assertZIO( TestServiceClient .bidiStreaming( - Stream( + ZStream( Request(Scenario.OK, in = 17), Request(Scenario.OK, in = 12), Request(Scenario.DIE, in = 33) diff --git a/examples/fullapp/client/src/main/scala/ExampleClient.scala b/examples/fullapp/client/src/main/scala/ExampleClient.scala index f7cbc1458..88d28290f 100644 --- a/examples/fullapp/client/src/main/scala/ExampleClient.scala +++ b/examples/fullapp/client/src/main/scala/ExampleClient.scala @@ -27,5 +27,5 @@ object ExampleClient extends zio.ZIOAppDefault { _ <- printLine(f.resp) } yield ()) .onError { c => printLine(c.prettyPrint).orDie } - .provideLayer(Console.live ++ clientLayer) + .provideLayer(clientLayer) } diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 8eebaf31a..c9c1a9f37 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test1" +val zioGrpcVersion = "0.5.1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index 568c17220..ff256b88c 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -44,7 +44,7 @@ object GreeterService { } object ExampleServer extends ZIOAppDefault { - def serverWait: ZIO[Console with Clock, Throwable, Unit] = + def serverWait: ZIO[Any, Throwable, Unit] = for { _ <- printLine("Server is running. Press Ctrl-C to stop.") _ <- (print(".") *> ZIO.sleep(1.second)).forever @@ -58,5 +58,5 @@ object ExampleServer extends ZIOAppDefault { def run = myAppLogic.exitCode val myAppLogic = - serverWait.provideLayer(serverLive(9090) ++ Console.live ++ Clock.live) + serverWait.provideLayer(serverLive(9090)) } diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 88f3e9d20..9c5b44cfe 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -47,7 +47,8 @@ object GreeterServiceWithMetadata { } object ExampleServerWithMetadata extends ZIOAppDefault { - def serverWait: ZIO[Console with Clock, Throwable, Unit] = + + def serverWait: ZIO[Any, Throwable, Unit] = for { _ <- printLine("Server is running. Press Ctrl-C to stop.") _ <- (print(".") *> ZIO.sleep(1.second)).forever @@ -61,5 +62,5 @@ object ExampleServerWithMetadata extends ZIOAppDefault { def run = myAppLogic.exitCode val myAppLogic = - serverWait.provideLayer(serverLive(8080) ++ Console.live ++ Clock.live) + serverWait.provideLayer(serverLive(8080)) } diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 9cbf06738..9512f8696 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,9 +4,9 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.6.0-test1" +val zioGrpcVersion = "0.5.1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" ) diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index c1fc428e5..9b5183df8 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -19,11 +19,11 @@ package object userdatabase { object UserDatabase { // accessor def fetchUser(name: String): ZIO[UserDatabase, Status, User] = - ZIO.environmentWithZIO[UserDatabase](_.get.fetchUser(name)) + ZIO.serviceWithZIO[UserDatabase](_.fetchUser(name)) - val live = zio.ZLayer.succeed(new UserDatabase { - def fetchUser(name: String): IO[Status, User] = - IO.succeed(User(name)) + val live = ZLayer.succeed(new UserDatabase { + def fetchUser(name: String): ZIO[Status, User] = + ZIO.succeed(User(name)) }) } } @@ -31,7 +31,7 @@ package object userdatabase { object GreeterWithDatabase extends RGreeter[UserDatabase with Console] { def sayHello( request: HelloRequest - ): ZIO[UserDatabase with Console, Status, HelloReply] = + ): ZIO[UserDatabase, Status, HelloReply] = UserDatabase.fetchUser(request.name).map { user => HelloReply(s"Hello ${user.name}") } @@ -42,7 +42,7 @@ object GreeterWithDatabaseServer extends zio.ZIOAppDefault { io.grpc.ServerBuilder.forPort(9090) )(GreeterWithDatabase.toLayer) - val ourApp = (UserDatabase.live ++ Console.any) >>> serverLayer + val ourApp = UserDatabase.live >>> serverLayer def run: zio.URIO[zio.ZEnv, ExitCode] = ourApp.build.useForever.exitCode diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index 2989ad390..0034ced38 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -44,7 +44,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { // to set up accessors for the User context object UserClient extends GreeterClient.Accessors[User] - def appLogic1: ZIO[UserClient with Console, Status, Unit] = + def appLogic1: ZIO[UserClient, Status, Unit] = for { // With provideSomeLayer: r1 <- @@ -58,7 +58,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { UserClient .sayHello(HelloRequest("World")) .provideSomeEnvironment( - (_: ZEnvironment[UserClient with Console]) ++ ZEnvironment( + (_: ZEnvironment[UserClient]) ++ ZEnvironment( User("user1") ) ) diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala index 367944ba6..1cfecd274 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala @@ -9,14 +9,14 @@ import zio.Console._ import io.grpc.examples.helloworld.helloworld.ZioHelloworld.ZGreeter import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} -object GreeterImpl extends ZGreeter[ZEnv, Any] { +object GreeterImpl extends ZGreeter[Any, Any] { def sayHello( request: HelloRequest - ): ZIO[zio.ZEnv, Status, HelloReply] = + ): ZIO[Any, Status, HelloReply] = printLine(s"Got request: $request").orDie zipRight ZIO.succeed(HelloReply(s"Hello, ${request.name}")) } object HelloWorldServer extends ServerMain { - def services: ServiceList[zio.ZEnv] = ServiceList.add(GreeterImpl) + def services: ServiceList[Any] = ServiceList.add(GreeterImpl) } diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 9cbf06738..9512f8696 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -4,9 +4,9 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.6.0-test1" +val zioGrpcVersion = "0.5.1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.1" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" ) diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index c5b0e9d4a..e511063a3 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -25,7 +25,7 @@ object RouteGuideClientApp extends ZIOAppDefault { def getFeature( lat: Int, lng: Int - ): ZIO[RouteGuideClient with Console, Status, Unit] = + ): ZIO[RouteGuideClient, Status, Unit] = (for { f <- RouteGuideClient.getFeature(Point(lat, lng)) _ <- printLine(s"""Found feature called "${f.name}".""").orDie diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index 710eb2c7f..c972da4bc 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -19,7 +19,7 @@ import zio.UIO class RouteGuideService( features: Seq[Feature], routeNotesRef: Ref[Map[Point, List[RouteNote]]] -) extends ZioRouteGuide.ZRouteGuide[ZEnv, Any] { +) extends ZioRouteGuide.ZRouteGuide[Any, Any] { /** * Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the requested [[Point]]. If no feature at @@ -28,7 +28,7 @@ class RouteGuideService( * @param request the requested location for the feature. */ // start: getFeature - def getFeature(request: Point): ZIO[ZEnv, Status, Feature] = + def getFeature(request: Point): ZIO[Any, Status, Feature] = ZIO.fromOption(findFeature(request)).mapError(_ => Status.NOT_FOUND) // end: getFeature @@ -63,7 +63,7 @@ class RouteGuideService( // start: recordRoute def recordRoute( request: zio.stream.Stream[Status, Point] - ): ZIO[Clock, Status, RouteSummary] = { + ): ZIO[Any, Status, RouteSummary] = { // Zips each element with the previous element, initially accompanied by None. request.zipWithPrevious .runFold(RouteSummary()) { @@ -90,7 +90,7 @@ class RouteGuideService( // start: routeChat def routeChat( request: zio.stream.Stream[Status, RouteNote] - ): ZStream[ZEnv, Status, RouteNote] = + ): ZStream[Any, Status, RouteNote] = request.flatMap { note => // By using flatMap, we can map each RouteNote we receive to a stream with // the existing RouteNotes for that location, and those sub-streams are going @@ -155,7 +155,7 @@ object RouteGuideServer extends ServerMain { routeNotes <- Ref.make(Map.empty[Point, List[RouteNote]]) } yield new RouteGuideService(featuresDatabase.feature, routeNotes) - def services: ServiceList[zio.ZEnv] = + def services: ServiceList[Any] = ServiceList.addM(createRouteGuide) } // end: serverMain diff --git a/project/Versions.scala b/project/Versions.scala index 4e1544980..ee539fc26 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.0-RC1" + val zio = "2.0.0-RC6" val grpc = "1.41.2" } From 742c2a8c0e5ddb33eec5e8b61989055854a7fd0b Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 14 May 2022 15:23:00 -0700 Subject: [PATCH 029/245] Use default protoc version --- build.sbt | 1 - 1 file changed, 1 deletion(-) diff --git a/build.sbt b/build.sbt index b5181d251..7a8e5102e 100644 --- a/build.sbt +++ b/build.sbt @@ -118,7 +118,6 @@ lazy val e2e = "scalapb.zio_grpc.ZioCodeGenerator$" ) -> (Compile / sourceManaged).value ), - PB.protocVersion := "3.13.0", codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value, testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") ) From 871c39b067bd58cce6c6a52b1b6a6d9ebce5aa77 Mon Sep 17 00:00:00 2001 From: denis_savitsky Date: Mon, 16 May 2022 23:18:24 +0300 Subject: [PATCH 030/245] fix examples --- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 12 ++--- .../scala/ExampleServerWithMetadata.scala | 10 ++-- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/GreeterWithDatabase.scala | 8 +-- .../helloworld/HelloWorldClient.scala | 2 +- .../helloworld/HelloWorldClientMetadata.scala | 53 ++++++++++--------- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideClientApp.scala | 2 +- .../routeguide/RouteGuideServer.scala | 4 +- 10 files changed, 50 insertions(+), 47 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index c9c1a9f37..3b7f516fe 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.5.1" +val zioGrpcVersion = "0.6.0-test2" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index ff256b88c..917095a2e 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -3,7 +3,7 @@ package examples import examples.greeter.ZioGreeter.Greeter import examples.greeter._ import zio.Duration._ -import zio.stream.Stream +import zio.stream.{Stream, ZStream} import io.grpc.ServerBuilder import io.grpc.Status import zio._ @@ -15,18 +15,16 @@ import zio.Console.{print, printLine} object GreeterService { class LiveService(clock: Clock) extends Greeter { def greet(req: Request): IO[Status, Response] = - clock.sleep(300.millis) *> zio.IO.succeed( - Response(resp = "hello " + req.name) - ) + clock.sleep(300.millis).as(Response(resp = "hello " + req.name)) def points( request: Request ): Stream[Status, Point] = - (Stream(Point(3, 4)) + (ZStream(Point(3, 4)) .schedule(Schedule.spaced(1000.millis)) .forever .take(5) ++ - Stream.fail( + ZStream.fail( Status.INTERNAL .withDescription("There was an error!") .withCause(new RuntimeException) @@ -40,7 +38,7 @@ object GreeterService { } val live: ZLayer[Clock, Nothing, Greeter] = - (new LiveService(_)).toLayer + ZLayer.fromFunction(new LiveService(_)) } object ExampleServer extends ZIOAppDefault { diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 9c5b44cfe..b309b8b33 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -36,14 +36,14 @@ object GreeterServiceWithMetadata { // Imagine this resolves an authenticated User instance from the Metadata. def findUser(rc: RequestContext): IO[Status, User] = rc.metadata.get(UserKey).flatMap { - case Some(name) => IO.succeed(User(name)) - case _ => IO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case Some(name) => ZIO.succeed(User(name)) + case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) } - val live: ZLayer[Clock, Nothing, ZGreeter[Any, RequestContext]] = { - c: Clock => + val live: ZLayer[Clock, Nothing, ZGreeter[Any, RequestContext]] = + ZLayer.fromFunction { c: Clock => new LiveService(c).transformContextM(findUser(_)) - }.toLayer + } } object ExampleServerWithMetadata extends ZIOAppDefault { diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 9512f8696..0e59be5e4 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.1" +val zioGrpcVersion = "0.6.0-test2" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index 9b5183df8..a94673a27 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -22,13 +22,13 @@ package object userdatabase { ZIO.serviceWithZIO[UserDatabase](_.fetchUser(name)) val live = ZLayer.succeed(new UserDatabase { - def fetchUser(name: String): ZIO[Status, User] = + def fetchUser(name: String): IO[Status, User] = ZIO.succeed(User(name)) }) } } -object GreeterWithDatabase extends RGreeter[UserDatabase with Console] { +object GreeterWithDatabase extends RGreeter[UserDatabase] { def sayHello( request: HelloRequest ): ZIO[UserDatabase, Status, HelloReply] = @@ -44,6 +44,6 @@ object GreeterWithDatabaseServer extends zio.ZIOAppDefault { val ourApp = UserDatabase.live >>> serverLayer - def run: zio.URIO[zio.ZEnv, ExitCode] = - ourApp.build.useForever.exitCode + def run = + (ourApp.build *> ZIO.never).exitCode } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala index 185a98a58..cffd5c83d 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala @@ -22,5 +22,5 @@ object HelloWorldClient extends zio.ZIOAppDefault { } yield () final def run = - myAppLogic.provideCustomLayer(clientLayer).exitCode + myAppLogic.provideLayer(clientLayer).exitCode } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index 0034ced38..bae0c42be 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -66,42 +66,47 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { } yield () // Option 2: through a managed client - val userClientManaged: Managed[Throwable, GreeterClient.ZService[Any, User]] = + val userClientManaged + : ZIO[Scope, Throwable, GreeterClient.ZService[Any, User]] = GreeterClient.managed(channel, headers = userEnvToMetadata) def appLogic2 = - userClientManaged.use { client => - for { - r1 <- - client - .sayHello(HelloRequest("World")) - .provideEnvironment(ZEnvironment(User("user1"))) - _ <- printLine(r1.message) - r2 <- - client - .sayHello(HelloRequest("World")) - .provideEnvironment(ZEnvironment(User("user2"))) - _ <- printLine(r2.message) - } yield () + ZIO.scoped { + userClientManaged.flatMap { client => + for { + r1 <- + client + .sayHello(HelloRequest("World")) + .provideEnvironment(ZEnvironment(User("user1"))) + _ <- printLine(r1.message) + r2 <- + client + .sayHello(HelloRequest("World")) + .provideEnvironment(ZEnvironment(User("user2"))) + _ <- printLine(r2.message) + } yield () + } } // Option 3: by changing the stub val clientManaged = GreeterClient.managed(channel) def appLogic3 = - clientManaged.use { client => - for { - // Pass metadata effectfully - r1 <- - client - .withMetadataM(userToMetadata(User("hello"))) - .sayHello(HelloRequest("World")) - _ <- printLine(r1.message) - } yield () + ZIO.scoped { + clientManaged.flatMap { client => + for { + // Pass metadata effectfully + r1 <- + client + .withMetadataM(userToMetadata(User("hello"))) + .sayHello(HelloRequest("World")) + _ <- printLine(r1.message) + } yield () + } } final def run = ( - appLogic1.provideCustomLayer(clientLayer) *> + appLogic1.provideLayer(clientLayer) *> appLogic2 *> appLogic3 ).exitCode diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 9512f8696..0e59be5e4 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") -val zioGrpcVersion = "0.5.1" +val zioGrpcVersion = "0.6.0-test2" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index e511063a3..1d6c968ee 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -133,6 +133,6 @@ object RouteGuideClientApp extends ZIOAppDefault { } yield () final def run = - myAppLogic.provideCustomLayer(clientLayer).exitCode + myAppLogic.provideLayer(clientLayer).exitCode // end: appLogic } diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index c972da4bc..d3e53133b 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -3,7 +3,7 @@ package zio_grpc.examples.routeguide import io.grpc.Status import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList -import zio.{Ref, ZEnv, ZIO} +import zio.{Ref, ZIO} import zio.stream.ZStream import zio.Console._ @@ -38,7 +38,7 @@ class RouteGuideService( * @param request the bounding rectangle for the requested features. */ // start: listFeatures - def listFeatures(request: Rectangle): ZStream[ZEnv, Status, Feature] = { + def listFeatures(request: Rectangle): ZStream[Any, Status, Feature] = { val left = request.getLo.longitude min request.getHi.longitude val right = request.getLo.longitude max request.getHi.longitude val top = request.getLo.latitude max request.getHi.latitude From f602caa1f748480a0c8481f0e8b83bb9368ad0cf Mon Sep 17 00:00:00 2001 From: denis_savitsky Date: Sun, 22 May 2022 19:46:38 +0300 Subject: [PATCH 031/245] Change methods names to ZIO-style --- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 24 +++++++++---------- .../scalapb/zio_grpc/CallOptionsMethods.scala | 8 +++---- .../scala/scalapb/zio_grpc/SafeMetadata.scala | 4 ++-- .../zio_grpc/TransformableService.scala | 8 +++---- .../scalapb/zio_grpc/ServiceList.scala | 8 +++---- .../zio_grpc/BindableServiceSpec.scala | 16 ++++++------- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 4 ++-- .../scalapb/zio_grpc/TestServiceSpec.scala | 2 +- 8 files changed, 37 insertions(+), 37 deletions(-) diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index 8c136ce90..dca75854e 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -260,9 +260,9 @@ class ZioFilePrinter( ) .add( "// Returns a copy of the service with new default metadata", - s"def mapCallOptionsM(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.mapCallOptionsM(cf), f)", - s"def withMetadataM[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R1, C] = ??? // transform[R, Context, R1, C](self.withMetadataM(headersEffect), f)", - s"def withCallOptionsM(callOptions: zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withCallOptionsM(callOptions), f)" + s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.mapCallOptionsZIO(cf), f)", + s"def withMetadataZIO[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R1, C] = ??? // transform[R, Context, R1, C](self.withMetadataZIO(headersEffect), f)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withCallOptionsZIO(callOptions), f)" ) ).add("}") ).add("}") @@ -332,7 +332,7 @@ class ZioFilePrinter( _.add(s"def this() = this(zio.ZIO.succeed($CallOptions.DEFAULT))") .print(service.getMethods().asScala.toVector)(printAccessor) .add( - s"def mapCallOptionsM(f: $CallOptions => zio.IO[$Status, $CallOptions]) = new ${accessorsClassName.name}(callOptions.flatMap(f))" + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]) = new ${accessorsClassName.name}(callOptions.flatMap(f))" ) ) .add("}") @@ -354,8 +354,8 @@ class ZioFilePrinter( .add("") .add( "// Returns a copy of the service with new default metadata", - s"def withMetadataM[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R, C]", - s"def withCallOptionsM(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context]" + s"def withMetadataZIO[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R, C]", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context]" ) ) .add("}") @@ -376,21 +376,21 @@ class ZioFilePrinter( printClientImpl(envType = "R with Context") ) .add( - s"def mapCallOptionsM(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, options.flatMap(f), headers)", - s"override def withMetadataM[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R, C] = new ServiceStub(channel, options, headersEffect)", - s"def withCallOptionsM(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, callOptions, headers)" + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, options.flatMap(f), headers)", + s"override def withMetadataZIO[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R, C] = new ServiceStub(channel, options, headersEffect)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, callOptions, headers)" ) ) .add("}") .add("") .add( - s"def managed[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[R, Context]] = managedChannel.map {" + s"def scoped[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[R, Context]] = managedChannel.map {" ) .add(" channel => new ServiceStub[R, Context](channel, options, headers)") .add("}") .add("") .add( - s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = zio.ZLayer.scoped[R](zio.ZIO.environmentWithZIO((r: zio.ZEnvironment[R]) => managed[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers)))" + s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = zio.ZLayer.scoped[R](zio.ZIO.environmentWithZIO((r: zio.ZEnvironment[R]) => scoped[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers)))" ) .outdent .add("}") @@ -406,7 +406,7 @@ class ZioFilePrinter( outEnvType = s"${clientServiceName.name}.ZService[Any, Context] with Context", implicitViews = ": zio.Tag" ) + " = " - val innerCall = s"_.withCallOptionsM(callOptions).${method.name}(request)" + val innerCall = s"_.withCallOptionsZIO(callOptions).${method.name}(request)" val clientCall = method.streamType match { case StreamType.Unary => s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" diff --git a/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala b/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala index 6063e7dd8..151f002d6 100644 --- a/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala +++ b/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala @@ -8,11 +8,11 @@ import zio.Duration import io.grpc.Deadline trait CallOptionsMethods[Repr] { - def mapCallOptionsM(f: CallOptions => zio.IO[Status, CallOptions]): Repr + def mapCallOptionsZIO(f: CallOptions => zio.IO[Status, CallOptions]): Repr - def withCallOptions(callOptions: CallOptions): Repr = mapCallOptionsM(_ => ZIO.succeed(callOptions)) - def withDeadline(deadline: Deadline): Repr = mapCallOptionsM(co => ZIO.succeed(co.withDeadline(deadline))) + def withCallOptions(callOptions: CallOptions): Repr = mapCallOptionsZIO(_ => ZIO.succeed(callOptions)) + def withDeadline(deadline: Deadline): Repr = mapCallOptionsZIO(co => ZIO.succeed(co.withDeadline(deadline))) def withTimeout(duration: Duration): Repr = - mapCallOptionsM(co => ZIO.succeed(co.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))) + mapCallOptionsZIO(co => ZIO.succeed(co.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))) def withTimeoutMillis(millis: Long): Repr = withTimeout(Duration.fromMillis(millis)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala b/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala index 99c05d4b7..20407f508 100644 --- a/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala +++ b/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala @@ -20,9 +20,9 @@ final class SafeMetadata private ( /** Creates an effect from a total side-effecting function of metadata */ def wrap[A](f: Metadata => A): UIO[A] = - wrapM(metadata => ZIO.succeed(f(metadata))) + wrapZIO(metadata => ZIO.succeed(f(metadata))) - def wrapM[R, E, A](f: Metadata => ZIO[R, E, A]): ZIO[R, E, A] = + def wrapZIO[R, E, A](f: Metadata => ZIO[R, E, A]): ZIO[R, E, A] = sem.withPermit(f(metadata)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala index 07142e929..bc925ac9d 100644 --- a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala @@ -16,7 +16,7 @@ trait TransformableService[S[_, _]] { def provideEnvironment[R, Context: Tag](s: S[R, Context], r: ZEnvironment[R]): S[Any, Context] = transform(s, ZTransform.provideEnvironment[R, Status, Context](r)) - def transformContextM[R, FromContext: Tag, R0 <: R, ToContext: Tag]( + def transformContextZIO[R, FromContext: Tag, R0 <: R, ToContext: Tag]( s: S[R, FromContext], f: ToContext => ZIO[R0, Status, FromContext] ): S[R0, ToContext] = @@ -26,7 +26,7 @@ trait TransformableService[S[_, _]] { s: S[R, FromContext], f: ToContext => FromContext ): S[R, ToContext] = - transformContextM[R, FromContext, R, ToContext](s, (hc2: ToContext) => ZIO.succeed(f(hc2))) + transformContextZIO[R, FromContext, R, ToContext](s, (hc2: ToContext) => ZIO.succeed(f(hc2))) def toLayer[R, C: Tag]( s: S[R, C] @@ -43,10 +43,10 @@ object TransformableService { )(implicit TS: TransformableService[S]): S[ROut, ContextOut] = TS.transform[R, C, ROut, ContextOut](service, transform) - def transformContextM[C2: Tag, R0 <: R]( + def transformContextZIO[C2: Tag, R0 <: R]( f: C2 => ZIO[R0, Status, C] )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[R0, C2] = - TS.transformContextM[R, C, R0, C2](service, f) + TS.transformContextZIO[R, C, R0, C2](service, f) def provideEnvironment( r: ZEnvironment[R] diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala index 285107bf4..e10cc26f0 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala @@ -13,15 +13,15 @@ sealed class ServiceList[-RR] private[scalapb] ( /** Adds a service to the service list */ def add[R1 <: RR, S1](s1: S1)(implicit b: ZBindableService[R1, S1]): ServiceList[R1] = - addManaged[R1, RR, S1](ZIO.succeed(s1)) + addScoped[R1, RR, S1](ZIO.succeed(s1)) /** Adds an effect that returns a service to the service list */ - def addM[R1 <: RR, R2 <: RR, S1]( + def addZIO[R1 <: RR, R2 <: RR, S1]( s1: ZIO[R2, Throwable, S1] )(implicit b: ZBindableService[R1, S1]): ServiceList[R1 with R2] = - addManaged[R1, R2, S1](s1) + addScoped[R1, R2, S1](s1) - def addManaged[R1 <: RR, R2 <: RR, S1](s1: ZIO[R2 with Scope, Throwable, S1])(implicit + def addScoped[R1 <: RR, R2 <: RR, S1](s1: ZIO[R2 with Scope, Throwable, S1])(implicit bs: ZBindableService[R1, S1] ): ServiceList[RR with R1 with R2] = new ServiceList[RR with R1 with R2](for { diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index 9e9abfcda..802fa5df2 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -62,15 +62,15 @@ object BindableServiceSpec extends ZIOSpecDefault { val y5 = ServiceList.add(S5) val y6 = ServiceList.add(S6) val y7 = ServiceList.add(S7) - val z1 = ServiceList.addM(ZIO.succeed(S1)) - val z2 = ServiceList.addM(ZIO.succeed(S2)) - val z3 = ServiceList.addM(ZIO.succeed(S3)) - val z4 = ServiceList.addM(ZIO.succeed(S4)) - val z5 = ServiceList.addM(ZIO.succeed(S5)) - val z6 = ServiceList.addM(ZIO.succeed(S6)) - val z7 = ServiceList.addM(ZIO.succeed(S7)) + val z1 = ServiceList.addZIO(ZIO.succeed(S1)) + val z2 = ServiceList.addZIO(ZIO.succeed(S2)) + val z3 = ServiceList.addZIO(ZIO.succeed(S3)) + val z4 = ServiceList.addZIO(ZIO.succeed(S4)) + val z5 = ServiceList.addZIO(ZIO.succeed(S5)) + val z6 = ServiceList.addZIO(ZIO.succeed(S6)) + val z7 = ServiceList.addZIO(ZIO.succeed(S7)) val z8 = ServiceList.access[S1.type] - val z9 = ServiceList.addManaged(ZIO.succeed(S4)) + val z9 = ServiceList.addScoped(ZIO.succeed(S4)) def spec = suite("BindableServiceSpec")( test("empty - required to make the compiler happy") { diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index ca1cb236f..9208feb71 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -59,7 +59,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { case None => ZIO.fail(Status.UNAUTHENTICATED) } - val serviceLayer = ServiceWithConsole.transformContextM(parseUser(_)).toLayer + val serviceLayer = ServiceWithConsole.transformContextZIO(parseUser(_)).toLayer val serverLayer: ZLayer[ZTestService[Any, RequestContext], Throwable, Server] = ServerLayer.access[ZTestService[Any, RequestContext]](ServerBuilder.forPort(0)) @@ -77,7 +77,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { ) ) TestServiceClient - .managed(ch) + .scoped(ch) .orDie } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index fc54d4b77..b8be325f6 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -22,7 +22,7 @@ object TestServiceSpec extends ZIOSpecDefault { ss <- ZIO.service[Server.Service] port <- ss.port.orDie ch = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext() - client <- TestServiceClient.managed(ZManagedChannel(ch)).orDie + client <- TestServiceClient.scoped(ZManagedChannel(ch)).orDie } yield client } From 8995da64417c0f6087fe81f46544f338ea1dc9da Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 21 May 2022 19:05:59 -0700 Subject: [PATCH 032/245] Update documentation to ZIO 2. --- .github/workflows/release.yml | 28 +++++++++++------------ build.sbt | 4 ++-- docs/context.md | 42 +++++++++++++++++------------------ docs/deadlines.md | 20 +++++++++-------- docs/decorating.md | 12 +++++----- docs/generated-code.md | 30 +++++++++++++------------ project/plugins.sbt | 2 +- 7 files changed, 70 insertions(+), 68 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 42b4ace1b..e528ed22f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,20 +15,20 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 - # - name: Update docs - # run: | - # git config --global user.name "ZIO-gRPC Docs" - # git config --global user.email "zio-grpc-docs@users.noreply.github.com" - # eval "$(ssh-agent -s)" - # echo "$TOKEN" | ssh-add - - # sbt docs/mdoc - # cd website - # yarn install - # yarn deploy - # env: - # TOKEN: ${{secrets.DEPLOY_KEY}} - # USE_SSH: true - # GIT_USER: git + - name: Update docs + run: | + git config --global user.name "ZIO-gRPC Docs" + git config --global user.email "zio-grpc-docs@users.noreply.github.com" + eval "$(ssh-agent -s)" + echo "$TOKEN" | ssh-add - + sbt docs/mdoc + cd website + yarn install + yarn deploy + env: + TOKEN: ${{secrets.DEPLOY_KEY}} + USE_SSH: true + GIT_USER: git - uses: olafurpg/setup-gpg@v3 - name: Publish ${{ github.ref }} run: sbt ci-release diff --git a/build.sbt b/build.sbt index 7a8e5102e..ccec62948 100644 --- a/build.sbt +++ b/build.sbt @@ -131,9 +131,9 @@ lazy val docs = project publish / skip := true, moduleName := "zio-grpc-docs", mdocVariables := Map( - "sbtProtocVersion" -> "1.0.2", + "sbtProtocVersion" -> "1.0.6", "grpcVersion" -> "1.41.2", - "zioGrpcVersion" -> "0.5.1", + "zioGrpcVersion" -> "0.6.0-M1", "scalapbVersion" -> scalapb.compiler.Version.scalapbVersion ), libraryDependencies ++= Seq( diff --git a/docs/context.md b/docs/context.md index 71be981ad..4047d71b4 100644 --- a/docs/context.md +++ b/docs/context.md @@ -7,12 +7,12 @@ custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/context.md When implementing a server, ZIO gRPC allows you to specify that your service depends on an environment of type `R` and a context of type `Context`. -`Context` and `R` can be of any Scala type, however when they are not `Any` they have to be wrapped in an `Has[]`. This allows ZIO gRPC to combine two values (`Context with R`) when providing the values at effect execution time. +`Context` and `R` can be of any Scala type. This allows ZIO gRPC to combine two values (`Context with R`) when providing the values at effect execution time. For example, we can define a service for which the effects depend on `Console`, and for each request we expect to get a context of type `User`. ```scala mdoc -import zio.{Has, ZIO} +import zio.ZIO import zio.Console import zio.Console.printLine import scalapb.zio_grpc.RequestContext @@ -22,8 +22,8 @@ import io.grpc.Status case class User(name: String) -object MyService extends ZSimpleService[Has[Console], Has[User]] { - def sayHello(req: Request): ZIO[Has[Console] with Has[User], Status, Response] = +object MyService extends ZSimpleService[Any, User] { + def sayHello(req: Request): ZIO[User, Status, Response] = for { user <- ZIO.service[User] _ <- printLine("I am here!").orDie @@ -37,11 +37,11 @@ As you can see above, we can access both the `User` and the `Console` in our eff In order to be able to bind our service to a gRPC server, we need to have the service's Context type to be one of the supported types: -* `Has[scalapb.zio_grpc.RequestContext]` -* `Has[scalapb.zio_grpc.SafeMetadata]` +* `scalapb.zio_grpc.RequestContext` +* `scalapb.zio_grpc.SafeMetadata` * `Any` -The service `MyService` as defined above expects `Has[User]` as a context. In order to be able to bind it, we will transform it into a service that depends on a context of type `Has[RequestContext]`. To do this, we need to provide the function to produce a `User` out of a `RequestContext`. This way, when a request comes in, ZIO gRPC can take the `RequestContext` (which is request metadata such as headers and options), and use our function to construct a `User` and provide it into the environment of our original service. +The service `MyService` as defined above expects `User` as a context. In order to be able to bind it, we will transform it into a service that depends on a context of type `RequestContext`. To do this, we need to provide the function to produce a `User` out of a `RequestContext`. This way, when a request comes in, ZIO gRPC can take the `RequestContext` (which is request metadata such as headers and options), and use our function to construct a `User` and provide it into the environment of our original service. In many typical cases, we may need to retrieve the user from a database, and thus we are using an effectful function `RequestContext => IO[Status, User]` to find the user. @@ -49,10 +49,10 @@ For example, we can provide a function that returns an effect that always succee ```scala mdoc val fixedUserService = - MyService.transformContextM((rc: RequestContext) => ZIO.succeed(User("foo"))) + MyService.transformContextZIO((rc: RequestContext) => ZIO.succeed(User("foo"))) ``` -and we got our service, which still depends on an environment of type `Console`, however the context is now `Has[RequestContext]` so it can be bound to a gRPC server. +and we got our service with context of type `RequestContext` so it can be bound to a gRPC server. ### Accessing metadata @@ -66,12 +66,12 @@ val UserKey = io.grpc.Metadata.Key.of( def findUser(rc: RequestContext): IO[Status, User] = rc.metadata.get(UserKey).flatMap { - case Some(name) => IO.succeed(User(name)) - case _ => IO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case Some(name) => ZIO.succeed(User(name)) + case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) } val rcService = - MyService.transformContextM(findUser) + MyService.transformContextZIO(findUser) object MyServer extends ServerMain { def services = ServiceList.add(rcService) @@ -85,20 +85,19 @@ may want to organize your code such that there is a `UserDatabase` service that a `fetchUser` effect that retrieves users from a database. Here is how you can do this: ```scala mdoc -type UserDatabase = Has[UserDatabase.Service] object UserDatabase { trait Service { def fetchUser(name: String): IO[Status, User] } // accessor - def fetchUser(name: String): ZIO[UserDatabase, Status, User] = - ZIO.accessZIO[UserDatabase](_.get.fetchUser(name)) + def fetchUser(name: String): ZIO[UserDatabase.Service, Status, User] = + ZIO.environmentWithZIO[UserDatabase.Service](_.get.fetchUser(name)) val live = zio.ZLayer.succeed( new Service { def fetchUser(name: String): IO[Status, User] = - IO.succeed(User(name)) + ZIO.succeed(User(name)) }) } ``` @@ -110,7 +109,7 @@ import zio.Clock._ import zio.Duration._ val myServiceAuthWithDatabase = - MyService.transformContextM { + MyService.transformContextZIO { (rc: RequestContext) => rc.metadata.get(UserKey) .someOrFail(Status.UNAUTHENTICATED) @@ -128,8 +127,8 @@ val myServiceLive = myServiceAuthWithDatabase.toLayer ``` notice how the dependencies moved to the input side of the `Layer` and the resulting layer is of -type `ZSimpleService[Any, Has[RequestContext]]]`, which means no environment is expected, and it assumes -a `Has[RequestContext]` context. To use this layer in an app, we can wire it like so: +type `ZSimpleService[Any, RequestContext]]`, which means no environment is expected, and it assumes +a `RequestContext` context. To use this layer in an app, we can wire it like so: ```scala mdoc import scalapb.zio_grpc.ServerLayer @@ -140,11 +139,10 @@ val serverLayer = io.grpc.ServerBuilder.forPort(9000) )(myServiceLive) -val ourApp = (UserDatabase.live ++ Console.any) >>> - serverLayer +val ourApp = UserDatabase.live >>> serverLayer object LayeredApp extends zio.ZIOAppDefault { - def run = ourApp.build.useForever.exitCode + def run = (ourApp.build *> ZIO.never).exitCode } ``` diff --git a/docs/deadlines.md b/docs/deadlines.md index e2142c51f..36451c14f 100644 --- a/docs/deadlines.md +++ b/docs/deadlines.md @@ -86,13 +86,15 @@ client that has a modified `CallOptions` effect. Making the copy of those client be safely done for each individual call: ```scala mdoc -val clientManaged = ServiceNameClient.managed(channel) - -val myAppLogic = for { - res <- clientManaged.use( - client => - client.withTimeoutMillis(3000).unary(Request()) - .mapError(_.asRuntimeException) - ) -} yield res +val clientScoped = ServiceNameClient.scoped(channel) + +val myAppLogic = ZIO.scoped { + clientScoped.flatMap { client => + for { + res <- client + .withTimeoutMillis(3000).unary(Request()) + .mapError(_.asRuntimeException) + } yield res + } +} ``` diff --git a/docs/decorating.md b/docs/decorating.md index 7155e3a9d..248b7a652 100644 --- a/docs/decorating.md +++ b/docs/decorating.md @@ -20,16 +20,16 @@ import scalapb.zio_grpc.{ RequestContext, ZTransform } import zio._ import zio.stream.ZStream -class LoggingTransform[R] extends ZTransform[R, Status, R with Has[RequestContext]] { +class LoggingTransform[R] extends ZTransform[R, Status, R with RequestContext] { - def logCause(cause: Cause[Status]): URIO[Has[RequestContext], Unit] = ??? + def logCause(cause: Cause[Status]): URIO[RequestContext, Unit] = ??? - def accessLog: URIO[Has[RequestContext], Unit] = ??? + def accessLog: URIO[RequestContext, Unit] = ??? - override def effect[A](io: ZIO[R, Status, A]): ZIO[R with Has[RequestContext], Status, A] = + override def effect[A](io: ZIO[R, Status, A]): ZIO[R with RequestContext, Status, A] = io.zipLeft(accessLog).tapErrorCause(logCause) - override def stream[A](io: ZStream[R, Status, A]): ZStream[R with Has[RequestContext], Status, A] = + override def stream[A](io: ZStream[R, Status, A]): ZStream[R with RequestContext, Status, A] = (io ++ ZStream.fromZIO(accessLog).drain).onError(logCause) } ``` @@ -47,4 +47,4 @@ object MyService extends ZSimpleService[Any, Any] { val decoratedService = MyService.transform(new LoggingTransform[Any]) -``` \ No newline at end of file +``` diff --git a/docs/generated-code.md b/docs/generated-code.md index ea33f2c88..36afe6d76 100644 --- a/docs/generated-code.md +++ b/docs/generated-code.md @@ -68,7 +68,8 @@ You can also override `def port: Int` to set a port number (by default port 9000 The generated client follows [ZIO's module pattern](https://zio.dev/docs/howto/howto_use_layers): ```scala -type ServiceNameClient = Has[ServiceNameClient.Service] +type ServiceNameClient = ServiceNameClient.Service + object ServiceNameClient { trait ZService[R] { // methods for use as a client @@ -81,7 +82,7 @@ object ServiceNameClient { def sayHello(request: HelloRequest): ZIO[ServiceNameClient, Status, HelloReply] - def managed[R]( + def scoped[R]( managedChannel: ZManagedChannel[R], options: CallOptions = io.grpc.CallOptions.DEFAULT, @@ -119,7 +120,7 @@ val channel = ZManagedChannel( ### Using the client as a layer -A single `ZManagedChannel` represent a virtual connection to a conceptual endpoint to perform RPCs. A channel can have many actual connection to the endpoint. Therefore, it is very common to have a single service client for each RPC service you need to connect to. You can create a `ZLayer` to provide this service using the `live` method on the client companion object. Then simply write your logic using the accessor methods. Finally, inject the layer using `provideCustomLayer` at the top of your app: +A single `ZManagedChannel` represent a virtual connection to a conceptual endpoint to perform RPCs. A channel can have many actual connection to the endpoint. Therefore, it is very common to have a single service client for each RPC service you need to connect to. You can create a `ZLayer` to provide this service using the `live` method on the client companion object. Then simply write your logic using the accessor methods. Finally, inject the layer using `provideLayer` at the top of your app: ```scala mdoc import myexample.testservice.ZioTestservice.ServiceNameClient @@ -138,15 +139,15 @@ val myAppLogicNeedsEnv = for { // myAppLogicNeedsEnv needs access to a ServiceNameClient. We turn it into // a self-contained effect (IO) by providing the layer to it: -val myAppLogic1 = myAppLogicNeedsEnv.provideCustomLayer(clientLayer) +val myAppLogic1 = myAppLogicNeedsEnv.provideLayer(clientLayer) object LayeredApp extends zio.ZIOAppDefault { - def run: URIO[ZEnv, ExitCode] = myAppLogic1.exitCode + def run: UIO[ExitCode] = myAppLogic1.exitCode } ``` Here the application is broken to multiple value assignments so you can see the types. -The first effect `myAppLogicNeedsEnv` uses accessor functions, which makes it depend on an environment of type `ServiceNameClient`. It chains the `unary` RPC with printing the result to the console, and hence the final inferred effect type is `ServiceNameClient with Has[Console]`. Once we provide our custom layer, the effect type is `ZEnv`, which we can use with ZIO's `exit` method. +The first effect `myAppLogicNeedsEnv` uses accessor functions, which makes it depend on an environment of type `ServiceNameClient`. It chains the `unary` RPC with printing the result to the console, and hence the final inferred effect type is `ServiceNameClient`. Once we provide our custom layer, the effect type is `ZEnv`, which we can use with ZIO's `exit` method. ### Using a Managed Client @@ -156,14 +157,15 @@ As an alternative to using ZLayer, you can use the client through a managed reso import myexample.testservice.ZioTestservice.ServiceNameClient import myexample.testservice.{Request, Response} -val clientManaged = ServiceNameClient.managed(channel) +val clientManaged = ServiceNameClient.scoped(channel) -val myAppLogic = for { - res <- clientManaged.use( - client => - client.unary(Request()).mapError(_.asRuntimeException) - ) -} yield res +val myAppLogic = ZIO.scoped { + clientManaged.flatMap { client => + for { + res <- client.unary(Request()).mapError(_.asRuntimeException) + } yield res + } +} ``` -Since the service acquistion (through the ZManaged) can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. \ No newline at end of file +Since the service acquistion (through the ZManaged) can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. diff --git a/project/plugins.sbt b/project/plugins.sbt index d036f0aec..fe0989088 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.1") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.2") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.8.0") From 62421283568a5b6fff24a7e98e18aa2f36706472 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 22 May 2022 08:59:23 -0700 Subject: [PATCH 033/245] Update docusaurus --- docs/intro.md | 1 + website/docusaurus.config.js | 16 +- website/package.json | 8 +- website/yarn.lock | 11852 ++++++++++++--------------------- 4 files changed, 4159 insertions(+), 7718 deletions(-) diff --git a/docs/intro.md b/docs/intro.md index 12e7bdfa0..0b68058af 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -1,6 +1,7 @@ --- title: Introduction custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/intro.md +slug: / --- ZIO-gRPC lets you write purely functional gRPC servers and clients. It is built on top of [ZIO](https://zio.dev/), a library for asynchronous and concurrent functional programming in Scala. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 5ef41d93d..aed7a1d64 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,13 +1,12 @@ module.exports = { title: 'ZIO gRPC', tagline: 'Build gRPC clients and servers with ZIO', - url: 'https://scalapb.github.io/zio-grpc/', + url: 'https://scalapb.github.io', baseUrl: '/zio-grpc/', favicon: 'img/favicon.ico', organizationName: 'scalapb', // Usually your GitHub org/user name. projectName: 'zio-grpc', // Usually your repo name. themeConfig: { - sidebarCollapsible: false, image: 'https://scalapb.github.io/zio-grpc/img/zio-grpc-social-light.png', navbar: { title: ' ', @@ -78,12 +77,9 @@ module.exports = { copyright: `Copyright © ${new Date().getFullYear()} Nadav Samet`, }, prism: { - additionalLanguages: ['scala', 'protobuf'], + additionalLanguages: ['java', 'protobuf', 'scala'], theme: require('prism-react-renderer/themes/nightOwlLight'), darkTheme: require('prism-react-renderer/themes/dracula') - }, - googleAnalytics: { - trackingID: 'UA-346180-20' } }, presets: [ @@ -91,9 +87,8 @@ module.exports = { '@docusaurus/preset-classic', { docs: { - // It is recommended to set document id as docs home page (`docs/` path). - homePageId: 'intro', sidebarPath: require.resolve('./sidebars.js'), + sidebarCollapsible: false, // Please change this to your repo. // editUrl: 'https://github.com/scalapb/zio-grpc/edit/master/foo/docs/', path: '../zio-grpc-docs/target/mdoc' @@ -107,7 +102,10 @@ module.exports = { theme: { customCss: require.resolve('./src/css/custom.css'), }, + googleAnalytics: { + trackingID: 'UA-346180-20' + }, }, - ], + ] ] }; diff --git a/website/package.json b/website/package.json index b3c04b56c..8d03930d3 100644 --- a/website/package.json +++ b/website/package.json @@ -9,11 +9,11 @@ "deploy": "docusaurus deploy" }, "dependencies": { - "@docusaurus/core": "^2.0.0-alpha.64", - "@docusaurus/preset-classic": "^2.0.0-alpha.64", + "@docusaurus/core": "2.0.0-beta.20", + "@docusaurus/preset-classic": "2.0.0-beta.20", "clsx": "^1.1.1", - "react": "^16.8.4", - "react-dom": "^16.8.4" + "react": "^16.14.0", + "react-dom": "^16.14.0" }, "browserslist": { "production": [ diff --git a/website/yarn.lock b/website/yarn.lock index 2234bc9ed..5402c5fa7 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2,163 +2,146 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@^1.0.0-alpha.35": - version "1.0.0-alpha.42" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.0.0-alpha.42.tgz#a8fcdabea53ce1531520b8bfd9abdedae579634f" - integrity sha512-0vpVVXO4EhY2L3BLWcikkdcdgb8xUVp9a8LRKFpPKvVi6EQe4/PJGR+cfCMzJeY3dc689IekebNIM8BCb8ONlQ== - dependencies: - "@algolia/autocomplete-shared" "1.0.0-alpha.42" - -"@algolia/autocomplete-preset-algolia@^1.0.0-alpha.35": - version "1.0.0-alpha.42" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.0.0-alpha.42.tgz#b33373a9f56cc501ff6897fb87aed6d2f6d96080" - integrity sha512-UHyYba+UOASrfV2KyILS3BleSRp2zdSxoAixMbYw7rXcCwpZhF/meFZX3s5Mjdo1u+wkuofTx+gs66UwCQoDsQ== - dependencies: - "@algolia/autocomplete-shared" "1.0.0-alpha.42" - -"@algolia/autocomplete-shared@1.0.0-alpha.42": - version "1.0.0-alpha.42" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.0.0-alpha.42.tgz#9b1c7f083ac63b454d12a2ba3d4bfd59a508ca25" - integrity sha512-vjSw/LFUFJf87fdBeU97AG0E1997P7f4IiDaXtXIZ7GWXiDAOb6ZCYwQGPkPAXWa/UCl7CrxYvKhkjpP8bN7lQ== - -"@algolia/cache-browser-local-storage@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.5.1.tgz#bdf58c30795683fd48310c552c3a10f10fb26e2b" - integrity sha512-TAQHRHaCUAR0bNhUHG0CnO6FTx3EMPwZQrjPuNS6kHvCQ/H8dVD0sLsHyM8C7U4j33xPQCWi9TBnSx8cYXNmNw== - dependencies: - "@algolia/cache-common" "4.5.1" - -"@algolia/cache-common@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.5.1.tgz#3aefda3382dc30b67091b01a3d7461d937082821" - integrity sha512-Sux+pcedQi9sfScIiQdl6pEaTVl712qM9OblvDhnaeF1v6lf4jyTlRTiBLP7YBLuvO1Yo54W3maf03kmz9PVhA== - -"@algolia/cache-in-memory@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.5.1.tgz#127cd473474f62300a157f4ee3b3f6836003cf35" - integrity sha512-fzwAtBFwveuG+E5T/namChEIvdVl0DoV3djV1C078b/JpO5+DeAwuXIJGYbyl950u170n5NEYuIwYG+R6h4lJQ== - dependencies: - "@algolia/cache-common" "4.5.1" - -"@algolia/client-account@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.5.1.tgz#7d3ccda09d3c7849b171c915da0833e7649bab33" - integrity sha512-2WFEaI7Zf4ljnBsSAS4e+YylZ5glovm78xFg4E1JKA8PE6M+TeIgUY6HO2ouLh2dqQKxc9UfdAT1Loo/dha2iQ== - dependencies: - "@algolia/client-common" "4.5.1" - "@algolia/client-search" "4.5.1" - "@algolia/transporter" "4.5.1" - -"@algolia/client-analytics@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.5.1.tgz#bfc2a7292a9ea789ca3c99f79b1f96c08d378828" - integrity sha512-bTmZUU8zhZMWBeGEQ/TVqLoL3OOT0benU0HtS3iOnQURwb+AOCv3RsgZvkj2djp+M24Q6P8/L34uBJMmCurbLg== - dependencies: - "@algolia/client-common" "4.5.1" - "@algolia/client-search" "4.5.1" - "@algolia/requester-common" "4.5.1" - "@algolia/transporter" "4.5.1" - -"@algolia/client-common@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.5.1.tgz#91a401eba6eafd7cc74a0aeccb4c6e6cb1e72026" - integrity sha512-5CpIf8IK1hke7q+N4e+A4TWdFXVJ5Qwyaa0xS84DrDO8HQ7vfYbDvG1oYa9hVEtGn6c3WVKPAvuWynK+fXQQCA== - dependencies: - "@algolia/requester-common" "4.5.1" - "@algolia/transporter" "4.5.1" - -"@algolia/client-recommendation@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.5.1.tgz#57a1fe30987c90b10d5119b8e7d6cd91c423e54c" - integrity sha512-GiFrNSImoEBUQICjFBEoxPGzrjWji8PY9GeMg2CNvOYcRQ0Xt0Y36v9GN53NLjvB7QdQ2FlE1Cuv/PLUfS/aQQ== - dependencies: - "@algolia/client-common" "4.5.1" - "@algolia/requester-common" "4.5.1" - "@algolia/transporter" "4.5.1" - -"@algolia/client-search@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.5.1.tgz#cb798c99d6621e29a36334b92205518a74ecdf3e" - integrity sha512-wjuOTte9Auo9Cg4fL0709PjeJ9rXFh4okYUrOt/2SWqQid6DSdZOp+BtyaHKV3E94sj+SlmMxkMUacYluYg5zA== +"@algolia/autocomplete-core@1.6.3": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz#76832fffb6405ac2c87bac5a040b8a31a1cdef80" + integrity sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA== dependencies: - "@algolia/client-common" "4.5.1" - "@algolia/requester-common" "4.5.1" - "@algolia/transporter" "4.5.1" + "@algolia/autocomplete-shared" "1.6.3" -"@algolia/logger-common@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.5.1.tgz#18d654516369a28e25ad7eee4fc2882fd47ed8ec" - integrity sha512-ZoVnGriinlLHlkvn5K7djOUn1/1IeTjU8rDzOJ3t06T+2hQytgJghaX7rSwKIeH4CjWMy61w8jLisuGJRBOEeg== +"@algolia/autocomplete-shared@1.6.3": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz#52085ce89a755977841ed0a463aa31ce8f1dea97" + integrity sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg== + +"@algolia/cache-browser-local-storage@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.13.1.tgz#ffacb9230119f77de1a6f163b83680be999110e4" + integrity sha512-UAUVG2PEfwd/FfudsZtYnidJ9eSCpS+LW9cQiesePQLz41NAcddKxBak6eP2GErqyFagSlnVXe/w2E9h2m2ttg== + dependencies: + "@algolia/cache-common" "4.13.1" + +"@algolia/cache-common@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.13.1.tgz#c933fdec9f73b4f7c69d5751edc92eee4a63d76b" + integrity sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA== + +"@algolia/cache-in-memory@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz#c19baa67b4597e1a93e987350613ab3b88768832" + integrity sha512-pZzybCDGApfA/nutsFK1P0Sbsq6fYJU3DwIvyKg4pURerlJM4qZbB9bfLRef0FkzfQu7W11E4cVLCIOWmyZeuQ== + dependencies: + "@algolia/cache-common" "4.13.1" + +"@algolia/client-account@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.13.1.tgz#fea591943665477a23922ab31863ad0732e26c66" + integrity sha512-TFLiZ1KqMiir3FNHU+h3b0MArmyaHG+eT8Iojio6TdpeFcAQ1Aiy+2gb3SZk3+pgRJa/BxGmDkRUwE5E/lv3QQ== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/client-search" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-analytics@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.13.1.tgz#5275956b2d0d16997148f2085f1701b6c39ecc32" + integrity sha512-iOS1JBqh7xaL5x00M5zyluZ9+9Uy9GqtYHv/2SMuzNW1qP7/0doz1lbcsP3S7KBbZANJTFHUOfuqyRLPk91iFA== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/client-search" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-common@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.13.1.tgz#3bf9e3586f20ef85bbb56ccca390f7dbe57c8f4f" + integrity sha512-LcDoUE0Zz3YwfXJL6lJ2OMY2soClbjrrAKB6auYVMNJcoKZZ2cbhQoFR24AYoxnGUYBER/8B+9sTBj5bj/Gqbg== + dependencies: + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-personalization@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.13.1.tgz#438a1f58576ef19c4ad4addb8417bdacfe2fce2e" + integrity sha512-1CqrOW1ypVrB4Lssh02hP//YxluoIYXAQCpg03L+/RiXJlCs+uIqlzC0ctpQPmxSlTK6h07kr50JQoYH/TIM9w== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/client-search@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.13.1.tgz#5501deed01e23c33d4aaa9f9eb96a849f0fce313" + integrity sha512-YQKYA83MNRz3FgTNM+4eRYbSmHi0WWpo019s5SeYcL3HUan/i5R09VO9dk3evELDFJYciiydSjbsmhBzbpPP2A== + dependencies: + "@algolia/client-common" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/transporter" "4.13.1" + +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/logger-console@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.5.1.tgz#c9def97c20bea5eecb4b07f8d3f733c0192d1761" - integrity sha512-1qa7K18+uAgxyWuguayaDS5ViiZFcOjI3J5ACBb0i/n7RsXUo149lP6mwmx6TIU7s135hT0f0TCqnvfMvN1ilA== - dependencies: - "@algolia/logger-common" "4.5.1" +"@algolia/logger-common@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.13.1.tgz#4221378e701e3f1eacaa051bcd4ba1f25ddfaf4d" + integrity sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw== -"@algolia/requester-browser-xhr@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.5.1.tgz#838b55209d2c83572df261338f7cd75be36de401" - integrity sha512-tsQz+9pZw9dwPm/wMvZDpsWFZgmghLjXi4c3O4rfwoP/Ikum5fhle5fiR14yb4Lw4WlOQ1AJIHJvrg1qLIG8hQ== +"@algolia/logger-console@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.13.1.tgz#423d358e4992dd4bceab0d9a4e99d1fd68107043" + integrity sha512-7jQOTftfeeLlnb3YqF8bNgA2GZht7rdKkJ31OCeSH2/61haO0tWPoNRjZq9XLlgMQZH276pPo0NdiArcYPHjCA== dependencies: - "@algolia/requester-common" "4.5.1" - -"@algolia/requester-common@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.5.1.tgz#a34d02daa6093e112b528d3bcd5a5467c00ba823" - integrity sha512-bPCiLvhHKXaka7f5FLtheChToz0yHVhvza64naFJRRh/3kC0nvyrvQ0ogjiydiSrGIfdNDyyTVfKGdk4gS5gyA== + "@algolia/logger-common" "4.13.1" -"@algolia/requester-node-http@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.5.1.tgz#29911c104c6714a5cb29d3991f2b50c52301e091" - integrity sha512-BfFc2h9eQOKu1gGs3DtQO7GrVZW/rxUgpJVLja4UVQyGplJyTCrFgkTyfl+8rb3MkNgA/S2LNo7cKNSPfpqeAQ== +"@algolia/requester-browser-xhr@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz#f8ea79233cf6f0392feaf31e35a6b40d68c5bc9e" + integrity sha512-oa0CKr1iH6Nc7CmU6RE7TnXMjHnlyp7S80pP/LvZVABeJHX3p/BcSCKovNYWWltgTxUg0U1o+2uuy8BpMKljwA== dependencies: - "@algolia/requester-common" "4.5.1" + "@algolia/requester-common" "4.13.1" -"@algolia/transporter@4.5.1": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.5.1.tgz#e0a5c64f358b6751f867001f51f384d6fc7ede14" - integrity sha512-asPDNToDAPhH0tM6qKGTn1l0wTlNUbekpa1ifZ6v+qhSjo3VdqGyp+2VeciJOBW/wVHXh3HUbAcycvLERRlCLg== - dependencies: - "@algolia/cache-common" "4.5.1" - "@algolia/logger-common" "4.5.1" - "@algolia/requester-common" "4.5.1" +"@algolia/requester-common@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.13.1.tgz#daea143d15ab6ed3909c4c45877f1b6c36a16179" + integrity sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w== -"@babel/code-frame@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== +"@algolia/requester-node-http@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz#32c63d4c009f22d97e396406de7af9b66fb8e89d" + integrity sha512-7C0skwtLdCz5heKTVe/vjvrqgL/eJxmiEjHqXdtypcE5GCQCYI15cb+wC4ytYioZDMiuDGeVYmCYImPoEgUGPw== dependencies: - "@babel/highlight" "^7.8.3" + "@algolia/requester-common" "4.13.1" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== +"@algolia/transporter@4.13.1": + version "4.13.1" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.13.1.tgz#509e03e9145102843d5be4a031c521f692d4e8d6" + integrity sha512-pICnNQN7TtrcYJqqPEXByV8rJ8ZRU2hCiIKLTLRyNpghtQG3VAFk6fVtdzlNfdUGZcehSKGarPIZEHlQXnKjgw== dependencies: - "@babel/highlight" "^7.10.4" + "@algolia/cache-common" "4.13.1" + "@algolia/logger-common" "4.13.1" + "@algolia/requester-common" "4.13.1" -"@babel/code-frame@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@babel/highlight" "^7.12.13" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" -"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" - integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== dependencies: - browserslist "^4.12.0" - invariant "^2.2.4" - semver "^5.5.0" + "@babel/highlight" "^7.16.7" -"@babel/compat-data@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" - integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== "@babel/core@7.12.9": version "7.12.9" @@ -182,1600 +165,931 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.12.3": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.16.tgz#8c6ba456b23b680a6493ddcfcd9d3c3ad51cab7c" - integrity sha512-t/hHIB504wWceOeaOoONOhu+gX+hpjfeN6YRBT209X/4sibZQfSF1I0HFRRlBe97UZZosGx5XwUg1ZgNbelmNw== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.15" - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helpers" "^7.12.13" - "@babel/parser" "^7.12.16" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" +"@babel/core@^7.15.5", "@babel/core@^7.17.10": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.0.tgz#c58d04d7c6fbfb58ea7681e2b9145cfb62726756" + integrity sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.0" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.0" + "@babel/parser" "^7.18.0" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" - source-map "^0.5.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" -"@babel/core@^7.7.5", "@babel/core@^7.9.0": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.6.tgz#3a9455dc7387ff1bac45770650bc13ba04a15651" - integrity sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg== +"@babel/generator@^7.12.5", "@babel/generator@^7.17.10", "@babel/generator@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.0.tgz#46d28e8a18fc737b028efb25ab105d74473af43f" + integrity sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.6" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.5" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.5" - "@babel/types" "^7.11.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" + "@babel/types" "^7.18.0" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" -"@babel/generator@^7.11.5", "@babel/generator@^7.11.6": - version "7.11.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.6.tgz#b868900f81b163b4d464ea24545c61cbac4dc620" - integrity sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA== +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/types" "^7.11.5" - jsesc "^2.5.1" - source-map "^0.5.0" + "@babel/types" "^7.16.7" -"@babel/generator@^7.12.13", "@babel/generator@^7.12.15", "@babel/generator@^7.12.5": - version "7.12.15" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" - integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: - "@babel/types" "^7.12.13" - jsesc "^2.5.1" - source-map "^0.5.0" + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== dependencies: - "@babel/types" "^7.10.4" + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" -"@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== +"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" + integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-member-expression-to-functions" "^7.17.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" + integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^5.0.1" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" -"@babel/helper-builder-react-jsx-experimental@^7.10.4", "@babel/helper-builder-react-jsx-experimental@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.11.5.tgz#4ea43dd63857b0a35cd1f1b161dc29b43414e79f" - integrity sha512-Vc4aPJnRZKWfzeCBsqTBnzulVNjABVdahSPhtdMD3Vs80ykx4a87jTHtF/VR+alSrDmNvat7l13yrRHauGcHVw== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" - "@babel/types" "^7.11.5" + "@babel/types" "^7.16.7" -"@babel/helper-builder-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz#8095cddbff858e6fa9c326daee54a2f2732c1d5d" - integrity sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg== +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" - integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== +"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== dependencies: - "@babel/compat-data" "^7.10.4" - browserslist "^4.12.0" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" -"@babel/helper-compilation-targets@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.16.tgz#6905238b4a5e02ba2d032c1a49dd1820fe8ce61b" - integrity sha512-dBHNEEaZx7F3KoUYqagIhRIeqyyuI65xMndMZ3WwGwEBI609I4TleYQHcrS627vbKyNTXqShoN+fvYD9HuQxAg== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-validator-option" "^7.12.16" - browserslist "^4.14.5" - semver "^5.5.0" + "@babel/types" "^7.16.7" -"@babel/helper-create-class-features-plugin@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" - integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== +"@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" + integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.10.5" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/types" "^7.17.0" -"@babel/helper-create-class-features-plugin@^7.12.13", "@babel/helper-create-class-features-plugin@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.16.tgz#955d5099fd093e5afb05542190f8022105082c61" - integrity sha512-KbSEj8l9zYkMVHpQqM3wJNxS1d9h3U9vm/uE5tpjMbaj3lTp+0noe3KPsV5dSD9jxKnf9jO9Ip9FX5PKNZCKow== +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.12.16" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/types" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" - integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== +"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - regexpu-core "^4.7.0" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.16.tgz#3b31d13f39f930fad975e151163b7df7d4ffe9d3" - integrity sha512-jAcQ1biDYZBdaAxB4yg46/XirgX7jBDiMHDbwYQOgtViLBXGxJpZQ24jutmBqAIB/q+AwB6j+NbBXjKxEY8vqg== +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - regexpu-core "^4.7.1" + "@babel/types" "^7.16.7" + +"@babel/helper-plugin-utils@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" + integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== + +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-simple-access@^7.17.7": + version "7.17.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" + integrity sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA== + dependencies: + "@babel/types" "^7.17.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + +"@babel/helpers@^7.12.5", "@babel/helpers@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.0.tgz#aff37c3590de42102b54842446146d0205946370" + integrity sha512-AE+HMYhmlMIbho9nbvicHyxFwhrO+xhKB6AhRxzl8w46Yj0VXTZjEsAoBVC7rB2I0jzX+yWyVybnO08qkfx6kg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10", "@babel/parser@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112" + integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg== -"@babel/helper-define-map@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" - integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" + integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.5" - lodash "^4.17.19" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz#2d8e3470252cc17aba917ede7803d4a7a276a41b" - integrity sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" + integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" - integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== +"@babel/plugin-proposal-async-generator-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" + integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== +"@babel/plugin-proposal-class-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" + integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== +"@babel/plugin-proposal-class-static-block@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" + integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== +"@babel/plugin-proposal-export-namespace-from@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" + integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== +"@babel/plugin-proposal-json-strings@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" + integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/helper-hoist-variables@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" - integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== +"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" + integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" + integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== dependencies: - "@babel/types" "^7.11.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/helper-member-expression-to-functions@^7.12.13", "@babel/helper-member-expression-to-functions@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.16.tgz#41e0916b99f8d5f43da4f05d85f4930fa3d62b22" - integrity sha512-zYoZC1uvebBFmj1wFAlXwt35JLEgecefATtKp20xalwEK8vHAixLBXTGxNrVGEmTT+gzOThUgr8UEdgtalc1BQ== +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== +"@babel/plugin-proposal-object-rest-spread@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" + integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.12.1" -"@babel/helper-module-imports@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" +"@babel/plugin-proposal-object-rest-spread@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" + integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.17.12" + +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" + integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" + integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-proposal-private-property-in-object@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" + integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" + integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.12.13": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea" - integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-simple-access" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" - lodash "^4.17.19" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-plugin-utils@7.10.4", "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" -"@babel/helper-plugin-utils@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" - integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== +"@babel/plugin-syntax-import-assertions@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" + integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/helper-regex@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" - integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: - lodash "^4.17.19" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-remap-async-to-generator@^7.10.4": - version "7.11.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz#4474ea9f7438f18575e30b0cac784045b402a12d" - integrity sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA== +"@babel/plugin-syntax-jsx@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/helper-remap-async-to-generator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" - integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== +"@babel/plugin-syntax-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz#834035b45061983a491f60096f61a2e7c5674a47" + integrity sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/helper-replace-supers@^7.10.4": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/helper-replace-supers@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" - integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-simple-access@^7.10.4": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== +"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" - integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: - "@babel/types" "^7.11.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: - "@babel/types" "^7.12.1" + "@babel/helper-plugin-utils" "^7.8.0" -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/types" "^7.11.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/helper-validator-option@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.16.tgz#f73cbd3bbba51915216c5dea908e9b206bb10051" - integrity sha512-uCgsDBPUQDvzr11ePPo4TVEocxj8RXjUVSC/Y8N1YpVAI/XDdUwGJu78xmlGhTxj2ntaWM7n9LQdRtyhOzT2YQ== - -"@babel/helper-wrap-function@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" - integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== +"@babel/plugin-syntax-typescript@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz#b54fc3be6de734a56b87508f99d6428b5b605a7b" + integrity sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/helper-wrap-function@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" - integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== +"@babel/plugin-transform-arrow-functions@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" + integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== +"@babel/plugin-transform-async-to-generator@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" + integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/helpers@^7.12.13", "@babel/helpers@^7.12.5": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47" - integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ== +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== +"@babel/plugin-transform-block-scoping@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz#68fc3c4b3bb7dfd809d97b7ed19a584052a2725c" + integrity sha512-jw8XW/B1i7Lqwqj2CbrViPcZijSxfguBWZP2aN59NHgxUyO/OcO1mfdCxH13QhN5LbWhPkX+f+brKGhZTiqtZQ== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/highlight@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" - integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== +"@babel/plugin-transform-classes@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz#da889e89a4d38375eeb24985218edeab93af4f29" + integrity sha512-cvO7lc7pZat6BsvH6l/EGaI8zpl8paICaoGk+7x7guvtfak/TbIf66nYmJOH13EuG0H+Xx3M+9LQDtSvZFKXKw== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.10.4", "@babel/parser@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" - integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== - -"@babel/parser@^7.12.13", "@babel/parser@^7.12.16", "@babel/parser@^7.12.5", "@babel/parser@^7.12.7": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.16.tgz#cc31257419d2c3189d394081635703f549fc1ed4" - integrity sha512-c/+u9cqV6F0+4Hpq01jnJO+GLp2DdT63ppz9Xa+6cHaajM9VFzK/iDXiKK65YtpeVwu+ctfS6iqlMqRgQRzeCw== + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" -"@babel/plugin-proposal-async-generator-functions@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" - integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== +"@babel/plugin-transform-computed-properties@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" + integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-async-generator-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" - integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== +"@babel/plugin-transform-destructuring@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" + integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-remap-async-to-generator" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== +"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" - integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== +"@babel/plugin-transform-duplicate-keys@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" + integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-dynamic-import@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" - integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-dynamic-import@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.16.tgz#b9f33b252e3406d492a15a799c9d45a9a9613473" - integrity sha512-yiDkYFapVxNOCcBfLnsb/qdsliroM+vc3LHiZwS4gh7pFjo5Xq3BDhYBNn3H3ao+hWPvqeeTdU+s+FIvokov+w== +"@babel/plugin-transform-for-of@^7.17.12": + version "7.18.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" + integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-export-namespace-from@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" - integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-transform-literals@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" + integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-json-strings@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" - integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-json-strings@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" - integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== +"@babel/plugin-transform-modules-amd@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" + integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" - integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== +"@babel/plugin-transform-modules-commonjs@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz#3be575e19fbd273d42adbc84566b1fad3582b3db" + integrity sha512-cCeR0VZWtfxWS4YueAK2qtHtBPJRSaJcMlbS8jhSIm/A3E2Kpro4W1Dn4cqJtp59dtWfXjQwK7SPKF8ghs7rlw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-simple-access" "^7.17.7" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" - integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== +"@babel/plugin-transform-modules-systemjs@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz#50ecdb43de97c8483824402f7125edb94cddb09a" + integrity sha512-vwKpxdHnlM5tIrRt/eA0bzfbi7gUBLN08vLu38np1nZevlPySRe6yvuATJB5F/WPJ+ur4OXwpVYq9+BsxqAQuQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" - integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== +"@babel/plugin-transform-modules-umd@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" + integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" - integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" + integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/helper-create-regexp-features-plugin" "^7.17.12" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" - integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== +"@babel/plugin-transform-new-target@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" + integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-numeric-separator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== +"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" + integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-object-rest-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-object-rest-spread@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" - integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== +"@babel/plugin-transform-react-constant-elements@^7.14.5": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz#cc580857696b6dd9e5e3d079e673d060a0657f37" + integrity sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-optional-catch-binding@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" - integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== +"@babel/plugin-transform-react-display-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" + integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-optional-catch-binding@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" - integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== +"@babel/plugin-transform-react-jsx-development@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" + integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" + "@babel/plugin-transform-react-jsx" "^7.16.7" -"@babel/plugin-proposal-optional-chaining@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" - integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== +"@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" + integrity sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-jsx" "^7.17.12" + "@babel/types" "^7.17.12" -"@babel/plugin-proposal-optional-chaining@^7.12.1", "@babel/plugin-proposal-optional-chaining@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.16.tgz#600c7531f754186b0f2096e495a92da7d88aa139" - integrity sha512-O3ohPwOhkwji5Mckb7F/PJpJVJY3DpPsrt/F0Bk40+QMk9QpAIqeGusHWqu/mYqsM8oBa6TziL/2mbERWsUZjg== +"@babel/plugin-transform-react-pure-annotations@^7.16.7": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz#ef82c8e310913f3522462c9ac967d395092f1954" + integrity sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-private-methods@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" - integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== +"@babel/plugin-transform-regenerator@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" + integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.17.12" + regenerator-transform "^0.15.0" -"@babel/plugin-proposal-private-methods@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" - integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== +"@babel/plugin-transform-reserved-words@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" + integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" - integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== +"@babel/plugin-transform-runtime@^7.17.10": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.0.tgz#894cdab4b353dcb7639f03fb74c59db1d344f71c" + integrity sha512-7kM/jJ3DD/y1hDPn0jov12DoUIFsxLiItprhNydUSibxaywaxNqKwq+ODk72J9ePn4LWobIc5ik6TAJhVl8IkQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.17.12" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + semver "^6.3.0" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-async-generators@^7.8.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz#39abaae3cbf710c4373d8429484e6ba21340166c" - integrity sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" - integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-top-level-await@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-typescript@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" - integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-arrow-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" - integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-arrow-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" - integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" - integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" - -"@babel/plugin-transform-async-to-generator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" - integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-remap-async-to-generator" "^7.12.13" - -"@babel/plugin-transform-block-scoped-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" - integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-block-scoped-functions@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-block-scoping@^7.10.4": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" - integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-block-scoping@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-classes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" - integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" - globals "^11.1.0" - -"@babel/plugin-transform-classes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" - integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" - integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-computed-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" - integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-destructuring@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" - integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-destructuring@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" - integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" - integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-dotall-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-duplicate-keys@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" - integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-duplicate-keys@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-exponentiation-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" - integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-exponentiation-operator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-for-of@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" - integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-for-of@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" - integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" - integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== - dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" - integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-member-expression-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" - integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-modules-amd@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" - integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== - dependencies: - "@babel/helper-module-transforms" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-amd@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" - integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== - dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" - integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== - dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" - integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== - dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-simple-access" "^7.12.13" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" - integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== - dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" - integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== - dependencies: - "@babel/helper-hoist-variables" "^7.12.13" - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" - integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== - dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-modules-umd@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" - integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== - dependencies: - "@babel/helper-module-transforms" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" - integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - -"@babel/plugin-transform-new-target@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" - integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-new-target@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-object-super@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" - integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - -"@babel/plugin-transform-object-super@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" - -"@babel/plugin-transform-parameters@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" - integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" - integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-property-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" - integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-property-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-react-constant-elements@^7.9.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.10.4.tgz#0f485260bf1c29012bb973e7e404749eaac12c9e" - integrity sha512-cYmQBW1pXrqBte1raMkAulXmi7rjg3VI6ZLg9QIic8Hq7BtYXaWuZSxsr2siOMI6SWwpxjWfnwhTUrd7JlAV7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-display-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz#b5795f4e3e3140419c3611b7a2a3832b9aef328d" - integrity sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-display-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-react-jsx-development@^7.10.4": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.11.5.tgz#e1439e6a57ee3d43e9f54ace363fb29cefe5d7b6" - integrity sha512-cImAmIlKJ84sDmpQzm4/0q/2xrXlDezQoixy3qoz1NJeZL/8PRon6xZtluvr4H4FzwlDGI5tCcFupMnXGtr+qw== - dependencies: - "@babel/helper-builder-react-jsx-experimental" "^7.11.5" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" - -"@babel/plugin-transform-react-jsx-development@^7.12.12": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.16.tgz#af187e749d123b54ae49bc7e034057a0c1d4d568" - integrity sha512-GOp5SkMC4zhHwLbOSYhF+WpIZSf5bGzaKQTT9jWkemJRDM/CE6FtPydXjEYO3pHcna2Zjvg4mQ1lfjOR/4jsaQ== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.16" - -"@babel/plugin-transform-react-jsx-self@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz#cd301a5fed8988c182ed0b9d55e9bd6db0bd9369" - integrity sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" - -"@babel/plugin-transform-react-jsx-source@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz#34f1779117520a779c054f2cdd9680435b9222b4" - integrity sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" - -"@babel/plugin-transform-react-jsx@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz#673c9f913948764a4421683b2bef2936968fddf2" - integrity sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A== - dependencies: - "@babel/helper-builder-react-jsx" "^7.10.4" - "@babel/helper-builder-react-jsx-experimental" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-jsx" "^7.10.4" - -"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.16.tgz#07c341e02a3e4066b00413534f30c42519923230" - integrity sha512-dNu0vAbIk8OkqJfGtYF6ADk6jagoyAl+Ks5aoltbAlfoKv8d6yooi3j+kObeSQaCj9PgN6KMZPB90wWyek5TmQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/plugin-transform-react-pure-annotations@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.4.tgz#3eefbb73db94afbc075f097523e445354a1c6501" - integrity sha512-+njZkqcOuS8RaPakrnR9KvxjoG1ASJWpoIv/doyWngId88JoFlPlISenGXjrVacZUIALGUr6eodRs1vmPnF23A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-regenerator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" - integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-regenerator@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" - integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" - integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-reserved-words@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-runtime@^7.12.1": - version "7.12.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.15.tgz#4337b2507288007c2b197059301aa0af8d90c085" - integrity sha512-OwptMSRnRWJo+tJ9v9wgAf72ydXWfYSXWhnQjZing8nGZSDFqU1MBleKM3+DriKkcbv7RagA8gVeB0A1PNlNow== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" - integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-shorthand-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" - integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - -"@babel/plugin-transform-spread@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" - integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" - -"@babel/plugin-transform-sticky-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" - integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - -"@babel/plugin-transform-sticky-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-template-literals@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" - integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-template-literals@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" - integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-typeof-symbol@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" - integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-typeof-symbol@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-typescript@^7.12.16": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.16.tgz#3f30b829bdd15683f71c32fa31330c2af8c1b732" - integrity sha512-88hep+B6dtDOiEqtRzwHp2TYO+CN8nbAV3eh5OpBGPsedug9J6y1JwLKzXRIGGQZDC8NlpxpQMIIxcfIW96Wgw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.16" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-typescript" "^7.12.13" - -"@babel/plugin-transform-unicode-escapes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" - integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-transform-unicode-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" - integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-unicode-regex@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/preset-env@^7.12.1": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.16.tgz#16710e3490e37764b2f41886de0a33bc4ae91082" - integrity sha512-BXCAXy8RE/TzX416pD2hsVdkWo0G+tYd16pwnRV4Sc0fRwTLRS/Ssv8G5RLXUGQv7g4FG7TXkdDJxCjQ5I+Zjg== - dependencies: - "@babel/compat-data" "^7.12.13" - "@babel/helper-compilation-targets" "^7.12.16" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.16" - "@babel/plugin-proposal-async-generator-functions" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-dynamic-import" "^7.12.16" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.12.13" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.12.13" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" - "@babel/plugin-proposal-optional-chaining" "^7.12.16" - "@babel/plugin-proposal-private-methods" "^7.12.13" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" - "@babel/plugin-syntax-async-generators" "^7.8.0" +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" + integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz#4aec0a18f39dd86c442e1d077746df003e362c6e" + integrity sha512-kAKJ7DX1dSRa2s7WN1xUAuaQmkTpN+uig4wCKWivVXIObqGbVTUlSavHyfI2iZvz89GFAMGm9p2DBJ4Y1Tp0hw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typeof-symbol@^7.17.12": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" + integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + +"@babel/plugin-transform-typescript@^7.17.12": + version "7.18.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.1.tgz#5fd8b86130bad95c4a24377b41ab989a9ccad22d" + integrity sha512-F+RJmL479HJmC0KeqqwEGZMg1P7kWArLGbAKfEi9yPthJyMNjF+DjxFF/halfQvq1Q9GFM4TUbYDNV8xe4Ctqg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.0" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/plugin-syntax-typescript" "^7.17.12" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@^7.15.6", "@babel/preset-env@^7.17.10": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.0.tgz#ec7e51f4c6e026816000b230ed7cf74a1530d91d" + integrity sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-async-generator-functions" "^7.17.12" + "@babel/plugin-proposal-class-properties" "^7.17.12" + "@babel/plugin-proposal-class-static-block" "^7.18.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.17.12" + "@babel/plugin-proposal-json-strings" "^7.17.12" + "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.18.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/plugin-proposal-private-methods" "^7.17.12" + "@babel/plugin-proposal-private-property-in-object" "^7.17.12" + "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" + "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.12.13" - "@babel/plugin-transform-async-to-generator" "^7.12.13" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.12.13" - "@babel/plugin-transform-computed-properties" "^7.12.13" - "@babel/plugin-transform-destructuring" "^7.12.13" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.12.13" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.12.13" - "@babel/plugin-transform-modules-commonjs" "^7.12.13" - "@babel/plugin-transform-modules-systemjs" "^7.12.13" - "@babel/plugin-transform-modules-umd" "^7.12.13" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.12.13" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.12.13" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.12.13" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.13" - core-js-compat "^3.8.0" - semver "^5.5.0" - -"@babel/preset-env@^7.9.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" - integrity sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA== - dependencies: - "@babel/compat-data" "^7.11.0" - "@babel/helper-compilation-targets" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-proposal-async-generator-functions" "^7.10.4" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-dynamic-import" "^7.10.4" - "@babel/plugin-proposal-export-namespace-from" "^7.10.4" - "@babel/plugin-proposal-json-strings" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread" "^7.11.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" - "@babel/plugin-proposal-optional-chaining" "^7.11.0" - "@babel/plugin-proposal-private-methods" "^7.10.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-import-assertions" "^7.17.12" + "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.4" - "@babel/plugin-transform-arrow-functions" "^7.10.4" - "@babel/plugin-transform-async-to-generator" "^7.10.4" - "@babel/plugin-transform-block-scoped-functions" "^7.10.4" - "@babel/plugin-transform-block-scoping" "^7.10.4" - "@babel/plugin-transform-classes" "^7.10.4" - "@babel/plugin-transform-computed-properties" "^7.10.4" - "@babel/plugin-transform-destructuring" "^7.10.4" - "@babel/plugin-transform-dotall-regex" "^7.10.4" - "@babel/plugin-transform-duplicate-keys" "^7.10.4" - "@babel/plugin-transform-exponentiation-operator" "^7.10.4" - "@babel/plugin-transform-for-of" "^7.10.4" - "@babel/plugin-transform-function-name" "^7.10.4" - "@babel/plugin-transform-literals" "^7.10.4" - "@babel/plugin-transform-member-expression-literals" "^7.10.4" - "@babel/plugin-transform-modules-amd" "^7.10.4" - "@babel/plugin-transform-modules-commonjs" "^7.10.4" - "@babel/plugin-transform-modules-systemjs" "^7.10.4" - "@babel/plugin-transform-modules-umd" "^7.10.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" - "@babel/plugin-transform-new-target" "^7.10.4" - "@babel/plugin-transform-object-super" "^7.10.4" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-transform-property-literals" "^7.10.4" - "@babel/plugin-transform-regenerator" "^7.10.4" - "@babel/plugin-transform-reserved-words" "^7.10.4" - "@babel/plugin-transform-shorthand-properties" "^7.10.4" - "@babel/plugin-transform-spread" "^7.11.0" - "@babel/plugin-transform-sticky-regex" "^7.10.4" - "@babel/plugin-transform-template-literals" "^7.10.4" - "@babel/plugin-transform-typeof-symbol" "^7.10.4" - "@babel/plugin-transform-unicode-escapes" "^7.10.4" - "@babel/plugin-transform-unicode-regex" "^7.10.4" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.11.5" - browserslist "^4.12.0" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.17.12" + "@babel/plugin-transform-async-to-generator" "^7.17.12" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.17.12" + "@babel/plugin-transform-classes" "^7.17.12" + "@babel/plugin-transform-computed-properties" "^7.17.12" + "@babel/plugin-transform-destructuring" "^7.18.0" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.17.12" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.17.12" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.17.12" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.18.0" + "@babel/plugin-transform-modules-commonjs" "^7.18.0" + "@babel/plugin-transform-modules-systemjs" "^7.18.0" + "@babel/plugin-transform-modules-umd" "^7.18.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" + "@babel/plugin-transform-new-target" "^7.17.12" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.18.0" + "@babel/plugin-transform-reserved-words" "^7.17.12" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.17.12" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.17.12" + "@babel/plugin-transform-typeof-symbol" "^7.17.12" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.18.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1783,496 +1097,525 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.12.5": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" - integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.12.13" - "@babel/plugin-transform-react-jsx-development" "^7.12.12" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" - -"@babel/preset-react@^7.9.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.4.tgz#92e8a66d816f9911d11d4cc935be67adfc82dbcf" - integrity sha512-BrHp4TgOIy4M19JAfO1LhycVXOPWdDbTRep7eVyatf174Hff+6Uk53sDyajqZPu8W1qXRBiYOfIamek6jA7YVw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-transform-react-display-name" "^7.10.4" - "@babel/plugin-transform-react-jsx" "^7.10.4" - "@babel/plugin-transform-react-jsx-development" "^7.10.4" - "@babel/plugin-transform-react-jsx-self" "^7.10.4" - "@babel/plugin-transform-react-jsx-source" "^7.10.4" - "@babel/plugin-transform-react-pure-annotations" "^7.10.4" - -"@babel/preset-typescript@^7.12.1": - version "7.12.16" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.12.16.tgz#b2080ce20b7095c049db2a0410f1e39bc892f7ca" - integrity sha512-IrYNrpDSuQfNHeqh7gsJsO35xTGyAyGkI1VxOpBEADFtxCqZ77a1RHbJqM3YJhroj7qMkNMkNtcw0lqeZUrzow== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-validator-option" "^7.12.16" - "@babel/plugin-transform-typescript" "^7.12.16" - -"@babel/runtime-corejs3@^7.12.5": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.12.13.tgz#53d09813b7c20d616caf258e9325550ff701c039" - integrity sha512-8fSpqYRETHATtNitsCXq8QQbKJP31/KnDl2Wz2Vtui9nKzjss2ysuZtyVsWjBtvkeEFo346gkwjYPab1hvrXkQ== - dependencies: - core-js-pure "^3.0.0" +"@babel/preset-react@^7.14.5", "@babel/preset-react@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" + integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-react-display-name" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.17.12" + "@babel/plugin-transform-react-jsx-development" "^7.16.7" + "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + +"@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz#40269e0a0084d56fc5731b6c40febe1c9a4a3e8c" + integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== + dependencies: + "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-transform-typescript" "^7.17.12" + +"@babel/runtime-corejs3@^7.17.9": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.0.tgz#eed03023c5226b1e2b2ba32b8b6af5cb0518a6c7" + integrity sha512-G5FaGZOWORq9zthDjIrjib5XlcddeqLbIiDO3YQsut6j7aGf76xn0umUC/pA6+nApk3hQJF4JzLzg5PCl6ewJg== + dependencies: + core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.12.5": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d" - integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw== +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.8.4": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.0.tgz#6d77142a19cb6088f0af662af1ada37a604d34ae" + integrity sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/template@^7.12.13", "@babel/template@^7.12.7": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.5.tgz#be777b93b518eb6d76ee2e1ea1d143daa11e61c3" - integrity sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.5" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.11.5" - "@babel/types" "^7.11.5" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.12.13", "@babel/traverse@^7.12.5", "@babel/traverse@^7.12.9": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" - integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" +"@babel/template@^7.12.7", "@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba" + integrity sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.0" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.0" + "@babel/types" "^7.18.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.11.5", "@babel/types@^7.4.4", "@babel/types@^7.9.5": - version "7.11.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.5.tgz#d9de577d01252d77c6800cee039ee64faf75662d" - integrity sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q== +"@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.4.4": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.0.tgz#ef523ea349722849cb4bf806e9342ede4d071553" + integrity sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw== dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.7": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" - integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" - to-fast-properties "^2.0.0" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@docsearch/css@3.0.0-alpha.33": - version "3.0.0-alpha.33" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.33.tgz#36c8d61ec001d678b501adf49117413dd9c41fa3" - integrity sha512-7k/d960WaCRPxZqKwasSH2+pmKW+IeQ14zvS8t7T59OeW24G4N9xuLnpBf1XZ6IyS2AS3KPwRomwRX78qpETVg== - -"@docsearch/react@^3.0.0-alpha.31": - version "3.0.0-alpha.33" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0-alpha.33.tgz#2f8b5d90990b54b59db1a90e405d8008178e972a" - integrity sha512-XOhaUsxiq62umpGMfgzey45H6Id7qOa2DyJJOIpZHEeo5uFVkxc7Qamng+ETdUIn9ql8tWRPzjTh5OAtjJAgxw== - dependencies: - "@algolia/autocomplete-core" "^1.0.0-alpha.35" - "@algolia/autocomplete-preset-algolia" "^1.0.0-alpha.35" - "@docsearch/css" "3.0.0-alpha.33" +"@docsearch/css@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.1.0.tgz#6781cad43fc2e034d012ee44beddf8f93ba21f19" + integrity sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA== + +"@docsearch/react@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.1.0.tgz#da943a64c01ee82b04e53b691806469272f943f7" + integrity sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg== + dependencies: + "@algolia/autocomplete-core" "1.6.3" + "@docsearch/css" "3.1.0" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-alpha.70", "@docusaurus/core@^2.0.0-alpha.64": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-alpha.70.tgz#81bff8b093421a0c740fac02903dd23938806077" - integrity sha512-ccDcr5eb5T3C6k7VoqTclBFwjVkIHK1zISdhqzRNVl8AZTql1bYMvGUJP+2WbF6RSdmsGTNWreaUlrJc00dQqw== +"@docusaurus/core@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-beta.20.tgz#cf4aeeccecacb547a6fb42340c83bed0cccb57c0" + integrity sha512-a3UgZ4lIcIOoZd4j9INqVkWSXEDxR7EicJXt8eq2whg4N5hKGqLHoDSnWfrVSPQn4NoG5T7jhPypphSoysImfQ== dependencies: - "@babel/core" "^7.12.3" - "@babel/generator" "^7.12.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.1" + "@babel/core" "^7.17.10" + "@babel/generator" "^7.17.10" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.12.1" - "@babel/preset-env" "^7.12.1" - "@babel/preset-react" "^7.12.5" - "@babel/preset-typescript" "^7.12.1" - "@babel/runtime" "^7.12.5" - "@babel/runtime-corejs3" "^7.12.5" - "@babel/traverse" "^7.12.5" - "@docusaurus/cssnano-preset" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - "@docusaurus/utils-validation" "2.0.0-alpha.70" - "@endiliey/static-site-generator-webpack-plugin" "^4.0.0" - "@svgr/webpack" "^5.4.0" - babel-loader "^8.2.1" + "@babel/plugin-transform-runtime" "^7.17.10" + "@babel/preset-env" "^7.17.10" + "@babel/preset-react" "^7.16.7" + "@babel/preset-typescript" "^7.16.7" + "@babel/runtime" "^7.17.9" + "@babel/runtime-corejs3" "^7.17.9" + "@babel/traverse" "^7.17.10" + "@docusaurus/cssnano-preset" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + "@slorber/static-site-generator-webpack-plugin" "^4.0.4" + "@svgr/webpack" "^6.2.1" + autoprefixer "^10.4.5" + babel-loader "^8.2.5" babel-plugin-dynamic-import-node "2.3.0" - boxen "^4.2.0" - cache-loader "^4.1.0" - chalk "^3.0.0" - chokidar "^3.4.3" - clean-css "^4.2.3" - commander "^4.0.1" - copy-webpack-plugin "^6.3.0" - core-js "^2.6.5" - css-loader "^3.4.2" - del "^5.1.0" + boxen "^6.2.1" + chokidar "^3.5.3" + clean-css "^5.3.0" + cli-table3 "^0.6.2" + combine-promises "^1.1.0" + commander "^5.1.0" + copy-webpack-plugin "^10.2.4" + core-js "^3.22.3" + css-loader "^6.7.1" + css-minimizer-webpack-plugin "^3.4.1" + cssnano "^5.1.7" + del "^6.0.0" detect-port "^1.3.0" - eta "^1.11.0" - express "^4.17.1" + escape-html "^1.0.3" + eta "^1.12.3" file-loader "^6.2.0" - fs-extra "^9.0.1" - globby "^10.0.1" - html-minifier-terser "^5.1.1" - html-tags "^3.1.0" - html-webpack-plugin "^4.5.0" - import-fresh "^3.2.2" - inquirer "^7.2.0" - is-root "^2.1.0" - joi "^17.2.1" + fs-extra "^10.1.0" + html-minifier-terser "^6.1.0" + html-tags "^3.2.0" + html-webpack-plugin "^5.5.0" + import-fresh "^3.3.0" leven "^3.1.0" - lodash "^4.17.20" - lodash.flatmap "^4.5.0" - lodash.has "^4.5.2" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - mini-css-extract-plugin "^0.8.0" - nprogress "^0.2.0" - null-loader "^3.0.0" - optimize-css-assets-webpack-plugin "^5.0.4" - pnp-webpack-plugin "^1.6.4" - postcss-loader "^3.0.0" - postcss-preset-env "^6.7.0" - react-dev-utils "^10.2.1" - react-helmet "^6.1.0" - react-loadable "^5.5.0" - react-loadable-ssr-addon "^0.3.0" + lodash "^4.17.21" + mini-css-extract-plugin "^2.6.0" + postcss "^8.4.13" + postcss-loader "^6.2.1" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + react-loadable-ssr-addon-v5-slorber "^1.0.1" react-router "^5.2.0" react-router-config "^5.1.1" react-router-dom "^5.2.0" - resolve-pathname "^3.0.0" - semver "^6.3.0" + remark-admonitions "^1.2.1" + rtl-detect "^1.0.4" + semver "^7.3.7" serve-handler "^6.1.3" - shelljs "^0.8.4" - std-env "^2.2.1" - terser-webpack-plugin "^4.1.0" - update-notifier "^4.1.0" + shelljs "^0.8.5" + terser-webpack-plugin "^5.3.1" + tslib "^2.4.0" + update-notifier "^5.1.0" url-loader "^4.1.1" - wait-on "^5.2.0" - webpack "^4.44.1" - webpack-bundle-analyzer "^3.6.1" - webpack-dev-server "^3.11.0" - webpack-merge "^4.2.2" - webpackbar "^4.0.0" - -"@docusaurus/cssnano-preset@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.70.tgz#75dc56a71dc365a450729fd109b86fab72a6f560" - integrity sha512-Zwk3SrlE5r/z5j/tjDcs4XoyeoyymCtEovoxLWLV7wb+iR1qb+Jdso4TRShAepbW/ff6SzjCZ8hRy8ahXPD9TA== - dependencies: - cssnano-preset-advanced "^4.0.7" - postcss "^7.0.2" - postcss-combine-duplicated-selectors "^9.1.0" - postcss-sort-media-queries "^1.7.26" - -"@docusaurus/mdx-loader@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.70.tgz#4cc3c92a5a89ffdc8313da998d4646564940b3e7" - integrity sha512-CDR4O4z7wO5/S8O3TAggCynnuBIGIlUT9q9uhhkDe8h5XDhF8n8d6bwqir0O+fUMN3EnyrMq6z1g4IDRB5G2vw== - dependencies: - "@babel/parser" "^7.12.5" - "@babel/traverse" "^7.12.5" - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - "@mdx-js/mdx" "^1.6.21" - "@mdx-js/react" "^1.6.21" + wait-on "^6.0.1" + webpack "^5.72.0" + webpack-bundle-analyzer "^4.5.0" + webpack-dev-server "^4.8.1" + webpack-merge "^5.8.0" + webpackbar "^5.0.2" + +"@docusaurus/cssnano-preset@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.20.tgz#c47722e347fd044f2372e924199eabf61733232f" + integrity sha512-7pfrYuahHl3YYS+gYhbb1YHsq5s5+hk+1KIU7QqNNn4YjrIqAHlOznCQ9XfQfspe9boZmaNFGMZQ1tawNOVLqQ== + dependencies: + cssnano-preset-advanced "^5.3.3" + postcss "^8.4.13" + postcss-sort-media-queries "^4.2.1" + +"@docusaurus/logger@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.0-beta.20.tgz#bb49e8516e48082ab96bca11569a18541476d5a6" + integrity sha512-7Rt7c8m3ZM81o5jsm6ENgdbjq/hUICv8Om2i7grynI4GT2aQyFoHcusaNbRji4FZt0DaKT2CQxiAWP8BbD4xzQ== + dependencies: + chalk "^4.1.2" + tslib "^2.4.0" + +"@docusaurus/mdx-loader@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.20.tgz#7016e8ce7e4a11c9ea458e2236d3c93af71f393f" + integrity sha512-BBuf77sji3JxbCEW7Qsv3CXlgpm+iSLTQn6JUK7x8vJ1JYZ3KJbNgpo9TmxIIltpcvNQ/QOy6dvqrpSStaWmKQ== + dependencies: + "@babel/parser" "^7.17.10" + "@babel/traverse" "^7.17.10" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" - fs-extra "^9.0.1" - github-slugger "^1.3.0" - gray-matter "^4.0.2" - loader-utils "^2.0.0" - mdast-util-to-string "^1.1.0" - remark-emoji "^2.1.0" + fs-extra "^10.1.0" + image-size "^1.0.1" + mdast-util-to-string "^2.0.0" + remark-emoji "^2.2.0" stringify-object "^3.3.0" - unist-util-visit "^2.0.2" + tslib "^2.4.0" + unist-util-visit "^2.0.3" url-loader "^4.1.1" - webpack "^4.44.1" - -"@docusaurus/plugin-content-blog@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.70.tgz#795a5ddf181dfb314873a5dc33010d1a5bd94d28" - integrity sha512-qWXlSDovkhCZLJR0Wz4e3YcNjlelpuSNkS1rJ8sI1ehs/n32lj7A/nVoRfS/LnOMfIciY48vVPr64VLb6dfEeg== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/mdx-loader" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - "@docusaurus/utils-validation" "2.0.0-alpha.70" - chalk "^3.0.0" - feed "^4.2.1" - fs-extra "^9.0.1" - globby "^10.0.1" - joi "^17.2.1" - loader-utils "^1.2.3" - lodash "^4.17.20" - reading-time "^1.2.0" + webpack "^5.72.0" + +"@docusaurus/module-type-aliases@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.20.tgz#669605a64b04226c391e0284c44743e137eb2595" + integrity sha512-lUIXLwQEOyYwcb3iCNibPUL6O9ijvYF5xQwehGeVraTEBts/Ch8ZwELFk+XbaGHKh52PiVxuWL2CP4Gdjy5QKw== + dependencies: + "@docusaurus/types" "2.0.0-beta.20" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + +"@docusaurus/plugin-content-blog@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.20.tgz#7c0d413ac8df9a422a0b3ddd90b77ec491bbda15" + integrity sha512-6aby36Gmny5h2oo/eEZ2iwVsIlBWbRnNNeqT0BYnJO5aj53iCU/ctFPpJVYcw0l2l8+8ITS70FyePIWEsaZ0jA== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + cheerio "^1.0.0-rc.10" + feed "^4.2.2" + fs-extra "^10.1.0" + lodash "^4.17.21" + reading-time "^1.5.0" remark-admonitions "^1.2.1" - webpack "^4.44.1" - -"@docusaurus/plugin-content-docs@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.70.tgz#42dfa40786e819b42974dd167048b190b37bbee5" - integrity sha512-LZre12Q0sxLgi2XgjQbNQMV+jFG7v0+8hRzgBL+iCRiLCa4NlV7+M6mEHJGJJXSKqbfH7CelaUOESqEgPpVQXQ== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/mdx-loader" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - "@docusaurus/utils-validation" "2.0.0-alpha.70" - chalk "^3.0.0" - execa "^3.4.0" - fs-extra "^9.0.1" - globby "^10.0.1" - import-fresh "^3.2.2" - joi "^17.2.1" - loader-utils "^1.2.3" - lodash "^4.17.19" - lodash.flatmap "^4.5.0" - lodash.groupby "^4.6.0" - lodash.pick "^4.4.0" - lodash.pickby "^4.6.0" - lodash.sortby "^4.6.0" + tslib "^2.4.0" + unist-util-visit "^2.0.3" + utility-types "^3.10.0" + webpack "^5.72.0" + +"@docusaurus/plugin-content-docs@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.20.tgz#2a53b9fc355f45bf7c6917f19be7bfa0698b8b9e" + integrity sha512-XOgwUqXtr/DStpB3azdN6wgkKtQkOXOx1XetORzhHnjihrSMn6daxg+spmcJh1ki/mpT3n7yBbKJxVNo+VB38Q== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + combine-promises "^1.1.0" + fs-extra "^10.1.0" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + lodash "^4.17.21" remark-admonitions "^1.2.1" - shelljs "^0.8.4" + tslib "^2.4.0" utility-types "^3.10.0" - webpack "^4.44.1" - -"@docusaurus/plugin-content-pages@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.70.tgz#6cb937c9601d92bb616c7d95974d780d1a708ef7" - integrity sha512-HiFa5l1RDs155ATyYKkPtyIs/d6WJgSAyVfY5ji0Bsixp/K/Kh9YUZYMeTfeMIdhGYe3AAJz+PSZHYRpwTo1wA== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/mdx-loader" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - "@docusaurus/utils-validation" "2.0.0-alpha.70" - globby "^10.0.1" - joi "^17.2.1" - loader-utils "^1.2.3" - lodash "^4.17.19" - minimatch "^3.0.4" + webpack "^5.72.0" + +"@docusaurus/plugin-content-pages@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.20.tgz#6a76c7fa049983d2d94d8c4d738802acf01611fe" + integrity sha512-ubY6DG4F0skFKjfNGCbfO34Qf+MZy6C05OtpIYsoA2YU8ADx0nRH7qPgdEkwR3ma860DbY612rleRT13ogSlhg== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + fs-extra "^10.1.0" remark-admonitions "^1.2.1" - slash "^3.0.0" - webpack "^4.44.1" - -"@docusaurus/plugin-debug@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.70.tgz#7a41d24151a92195311c85ab827656cf705a0c68" - integrity sha512-h/x5KtS/YJerhY6C6sJOaP9gMaSVnjj1qZ6r9E/IFujQJ7bSKnk1unqBQpVXADkQhP081ENPL01ubc0/JbE1Mw== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - react-json-view "^1.19.1" - -"@docusaurus/plugin-google-analytics@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.70.tgz#9476314353d585716cbdd408319ff30bdbda4f87" - integrity sha512-Ah9W83ZnA0VvmflKNuGq5f/CaEjWJxhjkISQn09/ykEvXfWV33000Bhck4RoCr5YxD+GBEBT5suG5LKH7Qkigw== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - -"@docusaurus/plugin-google-gtag@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.70.tgz#a90e54830a6f95a83cf51b82e7e6adcf6a699dc1" - integrity sha512-K3s894PqMPQnGXEZs0bSs2bRE3bVXFYSb/RN+K9sNd7zxGuOX4UytuvpXP+1r0Hj/YTwQIjj7AKsND0ZpDJHyw== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - -"@docusaurus/plugin-sitemap@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.70.tgz#1eb02e4a4ecf5fb2bdf641a6f962ae421ff86916" - integrity sha512-ev9yNLPoeHP03jTz67daGd7yA7YhUwHeoWz14SyiKuU7OYtwL/8SJTn/V5kMDRl7o8FRQt9T//mRkpa270hmXw== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - fs-extra "^9.0.1" - joi "^17.2.1" - sitemap "^3.2.2" - -"@docusaurus/preset-classic@^2.0.0-alpha.64": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.70.tgz#7857f606eecdbaa34f8df83d62812908be02126f" - integrity sha512-Zx98KryJjHiqzGisWKR0glXl0HXuf/YbcK9yUl6ySyS+6cIMAuGMS0HGLgbvvEmYjywz7nMLpijzGderEOihjQ== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/plugin-content-blog" "2.0.0-alpha.70" - "@docusaurus/plugin-content-docs" "2.0.0-alpha.70" - "@docusaurus/plugin-content-pages" "2.0.0-alpha.70" - "@docusaurus/plugin-debug" "2.0.0-alpha.70" - "@docusaurus/plugin-google-analytics" "2.0.0-alpha.70" - "@docusaurus/plugin-google-gtag" "2.0.0-alpha.70" - "@docusaurus/plugin-sitemap" "2.0.0-alpha.70" - "@docusaurus/theme-classic" "2.0.0-alpha.70" - "@docusaurus/theme-search-algolia" "2.0.0-alpha.70" - -"@docusaurus/theme-classic@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.70.tgz#58e2dceee1076980700865df460e771e8d78cb68" - integrity sha512-lKU+fgSd08fo3LNYTw31Wty7RgAdFm8bEOwBNkKZcCFnatTSG4qyDbrDZclCQT/SpXSv9XIEKUc0irg2IH6Qrg== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/plugin-content-blog" "2.0.0-alpha.70" - "@docusaurus/plugin-content-docs" "2.0.0-alpha.70" - "@docusaurus/plugin-content-pages" "2.0.0-alpha.70" - "@docusaurus/theme-common" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - "@docusaurus/utils-validation" "2.0.0-alpha.70" - "@mdx-js/mdx" "^1.6.21" - "@mdx-js/react" "^1.6.21" - "@types/react-toggle" "^4.0.2" + tslib "^2.4.0" + webpack "^5.72.0" + +"@docusaurus/plugin-debug@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.20.tgz#7c026e81c45fd4f00801a785c928b9e8727a99de" + integrity sha512-acGZmpncPA1XDczpV1ji1ajBCRBY/H2lXN8alSjOB1vh0c/2Qz+KKD05p17lsUbhIyvsnZBa/BaOwtek91Lu7Q== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + fs-extra "^10.1.0" + react-json-view "^1.21.3" + tslib "^2.4.0" + +"@docusaurus/plugin-google-analytics@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.20.tgz#c1bdbc1239f987f9716fa30c2fd86962c190a765" + integrity sha512-4C5nY25j0R1lntFmpSEalhL7jYA7tWvk0VZObiIxGilLagT/f9gWPQtIjNBe4yzdQvkhiaXpa8xcMcJUAKRJyw== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + tslib "^2.4.0" + +"@docusaurus/plugin-google-gtag@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.20.tgz#7284bcfad9cb4e5d63605e95f6da73ca8ac8f053" + integrity sha512-EMZdiMTNg4NwE60xwjbetcqMDqAOazMTwQAQ4OuNAclv7oh8+VPCvqRF8s8AxCoI2Uqc7vh8yzNUuM307Ne9JA== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + tslib "^2.4.0" + +"@docusaurus/plugin-sitemap@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.20.tgz#08eada1260cafb273abea33c9c890ab667c7cbd3" + integrity sha512-Rf5a2vOBWjbe7PJJEBDeLZzDA7lsDi+16bqzKN8OKSXlcZLhxjmIpL5NrjANNbpGpL5vbl9z+iqvjbQmZ3QSmA== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + fs-extra "^10.1.0" + sitemap "^7.1.1" + tslib "^2.4.0" + +"@docusaurus/preset-classic@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.20.tgz#19566be713ce0297834cd999392ea3605bc6f574" + integrity sha512-artUDjiYFIlGd2fxk0iqqcJ5xSCrgormOAoind1c0pn8TRXY1WSCQWYI6p4X24jjhSCzLv0s6Z9PMDyxZdivhg== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/plugin-content-blog" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/plugin-content-pages" "2.0.0-beta.20" + "@docusaurus/plugin-debug" "2.0.0-beta.20" + "@docusaurus/plugin-google-analytics" "2.0.0-beta.20" + "@docusaurus/plugin-google-gtag" "2.0.0-beta.20" + "@docusaurus/plugin-sitemap" "2.0.0-beta.20" + "@docusaurus/theme-classic" "2.0.0-beta.20" + "@docusaurus/theme-common" "2.0.0-beta.20" + "@docusaurus/theme-search-algolia" "2.0.0-beta.20" + +"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" + integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== + dependencies: + "@types/react" "*" + prop-types "^15.6.2" + +"@docusaurus/theme-classic@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.20.tgz#c4c7712c2b35c5654433228729f92ec73e6c598e" + integrity sha512-rs4U68x8Xk6rPsZC/7eaPxCKqzXX1S45FICKmq/IZuaDaQyQIijCvv2ssxYnUyVZUNayZfJK7ZtNu+A0kzYgSQ== + dependencies: + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/plugin-content-blog" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/plugin-content-pages" "2.0.0-beta.20" + "@docusaurus/theme-common" "2.0.0-beta.20" + "@docusaurus/theme-translations" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-common" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + "@mdx-js/react" "^1.6.22" clsx "^1.1.1" - copy-text-to-clipboard "^2.2.0" - infima "0.2.0-alpha.18" - joi "^17.2.1" - lodash "^4.17.19" - parse-numeric-range "^1.2.0" - prism-react-renderer "^1.1.1" - prismjs "^1.22.0" - prop-types "^15.7.2" + copy-text-to-clipboard "^3.0.1" + infima "0.2.0-alpha.39" + lodash "^4.17.21" + nprogress "^0.2.0" + postcss "^8.4.13" + prism-react-renderer "^1.3.1" + prismjs "^1.28.0" react-router-dom "^5.2.0" - react-toggle "^4.1.1" - -"@docusaurus/theme-common@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.70.tgz#fa42aef2ec1b535d37f72fc978a3138c49667a37" - integrity sha512-Ge/dLGPCJhtyvumSMg0BlWcF00d1Qd2KnHf8kL/0nTxe257yNTHIOK95LKhIPAdcVgxG+ge9N0XcBm4KaubASQ== - dependencies: - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/plugin-content-blog" "2.0.0-alpha.70" - "@docusaurus/plugin-content-docs" "2.0.0-alpha.70" - "@docusaurus/plugin-content-pages" "2.0.0-alpha.70" - "@docusaurus/types" "2.0.0-alpha.70" - -"@docusaurus/theme-search-algolia@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.70.tgz#7f41241e0d22e89438817a3d4a27d880116c06c1" - integrity sha512-xuoWZ+HUKzn1A5vPlNZM8mtyRL5uo15o34OX/i7HkTRmBVymWO1bBE0lECfDVJU2JUYGmwjpDXhZzNLDZmZRWg== - dependencies: - "@docsearch/react" "^3.0.0-alpha.31" - "@docusaurus/core" "2.0.0-alpha.70" - "@docusaurus/theme-common" "2.0.0-alpha.70" - "@docusaurus/utils" "2.0.0-alpha.70" - algoliasearch "^4.0.0" - algoliasearch-helper "^3.1.1" + rtlcss "^3.5.0" + +"@docusaurus/theme-common@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-beta.20.tgz#4ec7d77ecd2ade9dad33b8689e3cd51b07e594b0" + integrity sha512-lmdGB3/GQM5z0GH0iHGRXUco4Wfqc6sR5eRKuW4j0sx3+UFVvtbVTTIGt0Cie4Dh6omnFxjPbNDlPDgWr/agVQ== + dependencies: + "@docusaurus/module-type-aliases" "2.0.0-beta.20" + "@docusaurus/plugin-content-blog" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/plugin-content-pages" "2.0.0-beta.20" clsx "^1.1.1" - eta "^1.11.0" - joi "^17.2.1" - lodash "^4.17.19" + parse-numeric-range "^1.3.0" + prism-react-renderer "^1.3.1" + tslib "^2.4.0" + utility-types "^3.10.0" -"@docusaurus/types@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-alpha.70.tgz#44b98290919cca2505aea334daecf762c7537d10" - integrity sha512-QoHmMiJhRDq5P/4o3eUIiJebdwRjShFlal01DST5B8MZo4k0ogl57FNHqJvIHc93NgonZzFlvC/auLlBnc/d4Q== - dependencies: - "@types/webpack" "^4.41.0" - commander "^4.0.1" - querystring "0.2.0" - webpack-merge "^4.2.2" - -"@docusaurus/utils-validation@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.70.tgz#04f24a7b3a4568ca164a8c1a4cf0caa8ba5caa6e" - integrity sha512-GJonaRjiJtlCk1+RfKA9f0YwRsSRGFMVbl6DrFidTgs4FmRb0hQsN4fnllsBvBJtbDZYwPTQ3T7c4cKJ/Ll7bQ== - dependencies: - "@docusaurus/utils" "2.0.0-alpha.70" - chalk "^3.0.0" - joi "^17.2.1" - -"@docusaurus/utils@2.0.0-alpha.70": - version "2.0.0-alpha.70" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-alpha.70.tgz#01779efcb4ff3bf39f9e74b3ef06fc2c8a43633a" - integrity sha512-xNSUcE7fGcneH00CPCEY0SP5V7H6pLEcu620UiU/m1367tCMsmv+MZcnII2ACcjAtvhjS22v/KLippM3VeTXqQ== - dependencies: - "@docusaurus/types" "2.0.0-alpha.70" - chalk "^3.0.0" - escape-string-regexp "^2.0.0" - fs-extra "^9.0.1" - gray-matter "^4.0.2" - lodash "^4.17.20" - lodash.camelcase "^4.3.0" - lodash.kebabcase "^4.1.1" - resolve-pathname "^3.0.0" +"@docusaurus/theme-search-algolia@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.20.tgz#14f2ea376a87d7cfa4840d8c917d1ec62d3a07f7" + integrity sha512-9XAyiXXHgyhDmKXg9RUtnC4WBkYAZUqKT9Ntuk0OaOb4mBwiYUGL74tyP0LLL6T+oa9uEdXiUMlIL1onU8xhvA== + dependencies: + "@docsearch/react" "^3.0.0" + "@docusaurus/core" "2.0.0-beta.20" + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/plugin-content-docs" "2.0.0-beta.20" + "@docusaurus/theme-common" "2.0.0-beta.20" + "@docusaurus/theme-translations" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/utils-validation" "2.0.0-beta.20" + algoliasearch "^4.13.0" + algoliasearch-helper "^3.8.2" + clsx "^1.1.1" + eta "^1.12.3" + fs-extra "^10.1.0" + lodash "^4.17.21" + tslib "^2.4.0" + utility-types "^3.10.0" -"@endiliey/static-site-generator-webpack-plugin@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz#94bfe58fd83aeda355de797fcb5112adaca3a6b1" - integrity sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng== +"@docusaurus/theme-translations@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.20.tgz#dcc7efb43ff110c19736764c287f6c5128a5dbba" + integrity sha512-O7J/4dHcg7Yr+r3ylgtqmtMEz6d5ScpUxBg8nsNTWOCRoGEXNZVmXSd5l6v72KCyxPZpllPrgjmqkL+I19qWiw== dependencies: - bluebird "^3.7.1" - cheerio "^0.22.0" - eval "^0.1.4" - url "^0.11.0" - webpack-sources "^1.4.3" + fs-extra "^10.1.0" + tslib "^2.4.0" + +"@docusaurus/types@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-beta.20.tgz#069d40cc225141d5c9a85605a1c61a460814bf5d" + integrity sha512-d4ZIpcrzGsUUcZJL3iz8/iSaewobPPiYfn2Lmmv7GTT5ZPtPkOAtR5mE6+LAf/KpjjgqrC7mpwDKADnOL/ic4Q== + dependencies: + commander "^5.1.0" + history "^4.9.0" + joi "^17.6.0" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.72.0" + webpack-merge "^5.8.0" + +"@docusaurus/utils-common@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-beta.20.tgz#adb914c331d711a3c0ef2ba3f64139acdf4cd781" + integrity sha512-HabHh23vOQn6ygs0PjuCSF/oZaNsYTFsxB2R6EwHNyw01nWgBC3QAcGVmyIWQhlb9p8V3byKgbzVS68hZX5t9A== + dependencies: + tslib "^2.4.0" + +"@docusaurus/utils-validation@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.20.tgz#ebf475a4388066bd450877fe920f405c53ff5ad2" + integrity sha512-7MxMoaF4VNAt5vUwvITa6nbkw1tb4WE6hp1VlfIoLCY4D7Wk5cMf1ZFhppCP1UzmPwvFb9zw8fPuvDfB3Tb5nQ== + dependencies: + "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/utils" "2.0.0-beta.20" + joi "^17.6.0" + js-yaml "^4.1.0" + tslib "^2.4.0" + +"@docusaurus/utils@2.0.0-beta.20": + version "2.0.0-beta.20" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-beta.20.tgz#d5a9816a328b2ca5e4e1a3fbf267e3674abacd48" + integrity sha512-eUQquakhrbnvhsmx8jRPLgoyjyzMuOhmQC99m7rotar7XOzROpgEpm7+xVaquG5Ha47WkybE3djHJhKNih7GZQ== + dependencies: + "@docusaurus/logger" "2.0.0-beta.20" + "@svgr/webpack" "^6.2.1" + file-loader "^6.2.0" + fs-extra "^10.1.0" + github-slugger "^1.4.0" + globby "^11.1.0" + gray-matter "^4.0.3" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.4.0" + url-loader "^4.1.1" + webpack "^5.72.0" "@hapi/hoek@^9.0.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6" - integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw== + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== "@hapi/topo@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz#c19af8577fa393a06e9c77b60995af959be721e7" - integrity sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== dependencies: "@hapi/hoek" "^9.0.0" -"@mdx-js/mdx@^1.6.21": +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mdx-js/mdx@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== @@ -2297,7 +1640,7 @@ unist-builder "2.0.3" unist-util-visit "2.0.3" -"@mdx-js/react@^1.6.21": +"@mdx-js/react@^1.6.22": version "1.6.22" resolved "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== @@ -2307,51 +1650,36 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== -"@mrmlnc/readdir-enhanced@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" - integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== - dependencies: - call-me-maybe "^1.0.1" - glob-to-regexp "^0.3.0" - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^1.1.2": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" - integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.3" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/move-file@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464" - integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw== - dependencies: - mkdirp "^1.0.4" +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== -"@sideway/address@^4.1.0": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.1.tgz#9e321e74310963fdf8eebfbee09c7bd69972de4d" - integrity sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ== +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== dependencies: "@hapi/hoek" "^9.0.0" @@ -2370,108 +1698,119 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz#81ef61947bb268eb9d50523446f9c638fb355906" - integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== +"@slorber/static-site-generator-webpack-plugin@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz#2bf4a2545e027830d2aa5eb950437c26a289b0f1" + integrity sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g== + dependencies: + bluebird "^3.7.1" + cheerio "^0.22.0" + eval "^0.1.8" + webpack-sources "^1.4.3" -"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz#6b2c770c95c874654fd5e1d5ef475b78a0a962ef" - integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== +"@svgr/babel-plugin-add-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz#bd6d1ff32a31b82b601e73672a789cc41e84fe18" + integrity sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA== -"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz#25621a8915ed7ad70da6cea3d0a6dbc2ea933efd" - integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== +"@svgr/babel-plugin-remove-jsx-attribute@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz#58654908beebfa069681a83332544b17e5237e89" + integrity sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw== -"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz#0b221fc57f9fcd10e91fe219e2cd0dd03145a897" - integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== - -"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz#139b546dd0c3186b6e5db4fefc26cb0baea729d7" - integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== - -"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz#6543f69526632a133ce5cabab965deeaea2234a0" - integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== - -"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz#00bf9a7a73f1cad3948cdab1f8dfb774750f8c80" - integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== - -"@svgr/babel-plugin-transform-svg-component@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.4.0.tgz#a2212b4d018e6075a058bb7e220a66959ef7a03c" - integrity sha512-zLl4Fl3NvKxxjWNkqEcpdSOpQ3LGVH2BNFQ6vjaK6sFo2IrSznrhURIPI0HAphKiiIwNYjAfE0TNoQDSZv0U9A== - -"@svgr/babel-preset@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.4.0.tgz#da21854643e1c4ad2279239baa7d5a8b128c1f15" - integrity sha512-Gyx7cCxua04DBtyILTYdQxeO/pwfTBev6+eXTbVbxe4HTGhOUW6yo7PSbG2p6eJMl44j6XSequ0ZDP7bl0nu9A== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" - "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" - "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" - "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" - "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" - "@svgr/babel-plugin-transform-svg-component" "^5.4.0" - -"@svgr/core@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/core/-/core-5.4.0.tgz#655378ee43679eb94fee3d4e1976e38252dff8e7" - integrity sha512-hWGm1DCCvd4IEn7VgDUHYiC597lUYhFau2lwJBYpQWDirYLkX4OsXu9IslPgJ9UpP7wsw3n2Ffv9sW7SXJVfqQ== - dependencies: - "@svgr/plugin-jsx" "^5.4.0" - camelcase "^6.0.0" - cosmiconfig "^6.0.0" +"@svgr/babel-plugin-remove-jsx-empty-expression@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz#d06dd6e8a8f603f92f9979bb9990a1f85a4f57ba" + integrity sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA== -"@svgr/hast-util-to-babel-ast@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.4.0.tgz#bb5d002e428f510aa5b53ec0a02377a95b367715" - integrity sha512-+U0TZZpPsP2V1WvVhqAOSTk+N+CjYHdZx+x9UBa1eeeZDXwH8pt0CrQf2+SvRl/h2CAPRFkm+Ey96+jKP8Bsgg== - dependencies: - "@babel/types" "^7.9.5" +"@svgr/babel-plugin-replace-jsx-attribute-value@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz#0b85837577b02c31c09c758a12932820f5245cee" + integrity sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ== -"@svgr/plugin-jsx@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.4.0.tgz#ab47504c55615833c6db70fca2d7e489f509787c" - integrity sha512-SGzO4JZQ2HvGRKDzRga9YFSqOqaNrgLlQVaGvpZ2Iht2gwRp/tq+18Pvv9kS9ZqOMYgyix2LLxZMY1LOe9NPqw== - dependencies: - "@babel/core" "^7.7.5" - "@svgr/babel-preset" "^5.4.0" - "@svgr/hast-util-to-babel-ast" "^5.4.0" +"@svgr/babel-plugin-svg-dynamic-title@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz#28236ec26f7ab9d486a487d36ae52d58ba15676f" + integrity sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg== + +"@svgr/babel-plugin-svg-em-dimensions@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz#40267c5dea1b43c4f83a0eb6169e08b43d8bafce" + integrity sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA== + +"@svgr/babel-plugin-transform-react-native-svg@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz#eb688d0a5f539e34d268d8a516e81f5d7fede7c9" + integrity sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ== + +"@svgr/babel-plugin-transform-svg-component@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz#7ba61d9fc1fb42b0ba1a04e4630019fa7e993c4f" + integrity sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg== + +"@svgr/babel-preset@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-6.2.0.tgz#1d3ad8c7664253a4be8e4a0f0e6872f30d8af627" + integrity sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^6.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^6.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "^6.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "^6.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "^6.0.0" + "@svgr/babel-plugin-transform-svg-component" "^6.2.0" + +"@svgr/core@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@svgr/core/-/core-6.2.1.tgz#195de807a9f27f9e0e0d678e01084b05c54fdf61" + integrity sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA== + dependencies: + "@svgr/plugin-jsx" "^6.2.1" + camelcase "^6.2.0" + cosmiconfig "^7.0.1" + +"@svgr/hast-util-to-babel-ast@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz#ae065567b74cbe745afae617053adf9a764bea25" + integrity sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ== + dependencies: + "@babel/types" "^7.15.6" + entities "^3.0.1" + +"@svgr/plugin-jsx@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz#5668f1d2aa18c2f1bb7a1fc9f682d3f9aed263bd" + integrity sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g== + dependencies: + "@babel/core" "^7.15.5" + "@svgr/babel-preset" "^6.2.0" + "@svgr/hast-util-to-babel-ast" "^6.2.1" svg-parser "^2.0.2" -"@svgr/plugin-svgo@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.4.0.tgz#45d9800b7099a6f7b4d85ebac89ab9abe8592f64" - integrity sha512-3Cgv3aYi1l6SHyzArV9C36yo4kgwVdF3zPQUC6/aCDUeXAofDYwE5kk3e3oT5ZO2a0N3lB+lLGvipBG6lnG8EA== - dependencies: - cosmiconfig "^6.0.0" - merge-deep "^3.0.2" - svgo "^1.2.2" - -"@svgr/webpack@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.4.0.tgz#b68bc86e29cf007292b96ced65f80971175632e0" - integrity sha512-LjepnS/BSAvelnOnnzr6Gg0GcpLmnZ9ThGFK5WJtm1xOqdBE/1IACZU7MMdVzjyUkfFqGz87eRE4hFaSLiUwYg== - dependencies: - "@babel/core" "^7.9.0" - "@babel/plugin-transform-react-constant-elements" "^7.9.0" - "@babel/preset-env" "^7.9.5" - "@babel/preset-react" "^7.9.4" - "@svgr/core" "^5.4.0" - "@svgr/plugin-jsx" "^5.4.0" - "@svgr/plugin-svgo" "^5.4.0" - loader-utils "^2.0.0" +"@svgr/plugin-svgo@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz#4cbe6a33ccccdcae4e3b63ded64cc1cbe1faf48c" + integrity sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q== + dependencies: + cosmiconfig "^7.0.1" + deepmerge "^4.2.2" + svgo "^2.5.0" + +"@svgr/webpack@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-6.2.1.tgz#ef5d51c1b6be4e7537fb9f76b3f2b2e22b63c58d" + integrity sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw== + dependencies: + "@babel/core" "^7.15.5" + "@babel/plugin-transform-react-constant-elements" "^7.14.5" + "@babel/preset-env" "^7.15.6" + "@babel/preset-react" "^7.14.5" + "@babel/preset-typescript" "^7.15.0" + "@svgr/core" "^6.2.1" + "@svgr/plugin-jsx" "^6.2.1" + "@svgr/plugin-svgo" "^6.2.0" "@szmarczak/http-timer@^1.1.2": version "1.1.2" @@ -2480,62 +1819,126 @@ dependencies: defer-to-connect "^1.0.1" -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" + integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.51": + version "0.0.51" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" + integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== dependencies: - "@types/minimatch" "*" "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" "@types/hast@^2.0.0": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz#b16872f2a6144c7025f296fb9636a667ebb79cd9" - integrity sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q== + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== dependencies: "@types/unist" "*" -"@types/html-minifier-terser@^5.0.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50" - integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA== +"@types/history@^4.7.11": + version "4.7.11" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" + integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== -"@types/json-schema@^7.0.5": - 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/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-proxy@^1.17.8": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== + dependencies: + "@types/node" "*" -"@types/json-schema@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" + integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== dependencies: "@types/unist" "*" -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/node@*": - version "14.11.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256" - integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA== +"@types/node@*", "@types/node@^17.0.5": + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.35.tgz#635b7586086d51fb40de0a2ec9d1014a5283ba4a" + integrity sha512-vu1SrqBjbbZ3J6vwY17jBs8Sr/BKA+/a/WtjRG+whKg1iuLFOosq872EXS0eXWILdO36DHQQeku/ZcL6hz2fpg== "@types/parse-json@^4.0.0": version "4.0.0" @@ -2548,216 +1951,225 @@ integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== "@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + 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/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/react-toggle@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/react-toggle/-/react-toggle-4.0.2.tgz#46ffa5af1a55de5f25d0aa78ef0b557b5c8bf276" - integrity sha512-sHqfoKFnL0YU2+OC4meNEC8Ptx9FE8/+nFeFvNcdBa6ANA8KpAzj3R9JN8GtrvlLgjKDoYgI7iILgXYcTPo2IA== +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-router-config@*": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" + integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router-dom@*": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" + integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router" "*" + +"@types/react-router@*": + version "5.1.18" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3" + integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g== dependencies: + "@types/history" "^4.7.11" "@types/react" "*" "@types/react@*": - version "16.9.49" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.49.tgz#09db021cf8089aba0cdb12a49f8021a69cce4872" - integrity sha512-DtLFjSj0OYAdVLBbyjhuV9CdGVHCkHn2R+xr3XkBvK2rS1Y1tkc14XSGjYgm5Fjjr90AxH9tiSzc1pCFMGO06g== + version "18.0.9" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.9.tgz#d6712a38bd6cd83469603e7359511126f122e878" + integrity sha512-9bjbg1hJHUm4De19L1cHiW0Jvx3geel6Qczhjd0qY5VKVE2X5+x77YxAepuCwVh4vrgZJdgEJw48zrhRIeF4Nw== dependencies: "@types/prop-types" "*" + "@types/scheduler" "*" csstype "^3.0.2" -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/tapable@*", "@types/tapable@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" - integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== +"@types/sax@^1.2.1": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" + integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + dependencies: + "@types/node" "*" -"@types/uglify-js@*": - version "3.9.3" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.3.tgz#d94ed608e295bc5424c9600e6b8565407b6b4b6b" - integrity sha512-KswB5C7Kwduwjj04Ykz+AjvPcfgv/37Za24O2EDzYNbwyzOo8+ydtvzUfZ5UMguiVu29Gx44l1A6VsPPcmYu9w== +"@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== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== dependencies: - source-map "^0.6.1" + "@types/express" "*" -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" -"@types/webpack-sources@*": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-1.4.2.tgz#5d3d4dea04008a779a90135ff96fb5c0c9e6292c" - integrity sha512-77T++JyKow4BQB/m9O96n9d/UUHWLQHlcqXb9Vsf4F1+wKNrrlWNFPDLKNT92RJnCSL6CieTc+NDXtCVZswdTw== +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== dependencies: "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" -"@types/webpack@^4.41.0", "@types/webpack@^4.41.8": - version "4.41.22" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.22.tgz#ff9758a17c6bd499e459b91e78539848c32d0731" - integrity sha512-JQDJK6pj8OMV9gWOnN1dcLCyU9Hzs6lux0wBO4lr1+gyEhIBR9U3FMrz12t2GPkg110XAxEAw2WHF6g7nZIbRQ== +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== dependencies: - "@types/anymatch" "*" "@types/node" "*" - "@types/tapable" "*" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: - "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -2770,33 +2182,33 @@ 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== +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + mime-types "~2.1.34" + negotiator "0.6.3" -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.1.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== +acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -address@1.1.2, address@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== +address@^1.0.1, address@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== aggregate-error@^3.0.0: version "3.1.0" @@ -2806,27 +2218,26 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -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-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +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.12.4: - version "6.12.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" - integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + fast-deep-equal "^3.1.3" -ajv@^6.12.5: +ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2836,83 +2247,66 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -algoliasearch-helper@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.2.2.tgz#12451c8e368935348453c8879785b20e1788c33c" - integrity sha512-/3XvE33R+gQKaiPdy3nmHYqhF8hqIu8xnlOicVxb1fD6uMFmxW8rGLzzrRfsPfxgAfm+c1NslLb3TzQVIB8aVA== - dependencies: - events "^1.1.1" - -algoliasearch@^4.0.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.5.1.tgz#fd20cd76f6ba3fbecdd4e11bdaefefb44abc0b38" - integrity sha512-b6yT1vWMlBdVObQipKxvt0M6SEvGetVj+FFFlo0Fy06gkdj6WCJaS4t10Q/hC3I2VG9QmpCqlK3Esgg1y1E+uw== - dependencies: - "@algolia/cache-browser-local-storage" "4.5.1" - "@algolia/cache-common" "4.5.1" - "@algolia/cache-in-memory" "4.5.1" - "@algolia/client-account" "4.5.1" - "@algolia/client-analytics" "4.5.1" - "@algolia/client-common" "4.5.1" - "@algolia/client-recommendation" "4.5.1" - "@algolia/client-search" "4.5.1" - "@algolia/logger-common" "4.5.1" - "@algolia/logger-console" "4.5.1" - "@algolia/requester-browser-xhr" "4.5.1" - "@algolia/requester-common" "4.5.1" - "@algolia/requester-node-http" "4.5.1" - "@algolia/transporter" "4.5.1" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== +ajv@^8.0.0, ajv@^8.8.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: - string-width "^3.0.0" - -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== + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" -ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== +algoliasearch-helper@^3.8.2: + version "3.8.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz#35726dc6d211f49dbab0bf6d37b4658165539523" + integrity sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg== + dependencies: + "@algolia/events" "^4.0.1" + +algoliasearch@^4.0.0, algoliasearch@^4.13.0: + version "4.13.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.13.1.tgz#54195c41c9e4bd13ed64982248cf49d4576974fe" + integrity sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA== + dependencies: + "@algolia/cache-browser-local-storage" "4.13.1" + "@algolia/cache-common" "4.13.1" + "@algolia/cache-in-memory" "4.13.1" + "@algolia/client-account" "4.13.1" + "@algolia/client-analytics" "4.13.1" + "@algolia/client-common" "4.13.1" + "@algolia/client-personalization" "4.13.1" + "@algolia/client-search" "4.13.1" + "@algolia/logger-common" "4.13.1" + "@algolia/logger-console" "4.13.1" + "@algolia/requester-browser-xhr" "4.13.1" + "@algolia/requester-common" "4.13.1" + "@algolia/requester-node-http" "4.13.1" + "@algolia/transporter" "4.13.1" + +ansi-align@^3.0.0, ansi-align@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: - type-fest "^0.11.0" - -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= + string-width "^4.1.0" -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +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== @@ -2920,33 +2314,29 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - "@types/color-name" "^1.1.1" color-convert "^2.0.1" -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" +ansi-styles@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +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== +arg@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== argparse@^1.0.7: version "1.0.10" @@ -2955,149 +2345,67 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -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= +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-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= + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.0: +array-flatten@^2.1.2: 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-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -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= - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== 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-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -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" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -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== - -autoprefixer@^9.4.7, autoprefixer@^9.6.1: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== +autoprefixer@^10.3.7, autoprefixer@^10.4.5: + version "10.4.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" -axios@^0.21.1: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.14.7" -babel-code-frame@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-loader@^8.2.1: - version "8.2.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" - integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== +babel-loader@^8.2.5: + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== dependencies: find-cache-dir "^3.3.1" - loader-utils "^1.4.0" + loader-utils "^2.0.0" make-dir "^3.1.0" schema-utils "^2.6.5" @@ -3130,380 +2438,166 @@ babel-plugin-extract-import-names@1.6.22: dependencies: "@babel/helper-plugin-utils" "7.10.4" +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" + integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.21.0" + +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base16@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha1-4pf2DX7BAUp6lxo568ipjAtoHnA= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -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" + integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bfj@^6.1.1: - version "6.1.2" - resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f" - integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw== - dependencies: - bluebird "^3.5.5" - check-types "^8.0.3" - hoopy "^0.1.4" - tryer "^1.0.1" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== 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.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== - -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" + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bluebird@^3.5.5, bluebird@^3.7.1: +bluebird@^3.7.1: 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.1.1: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" - integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== - -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== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: - bytes "3.1.0" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" 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" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.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.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" - -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" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "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== +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -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== +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: - pako "~1.0.5" + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +boxen@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" + integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== + dependencies: + ansi-align "^3.0.1" + camelcase "^6.2.0" + chalk "^4.1.2" + cli-boxes "^3.0.0" + string-width "^5.0.1" + type-fest "^2.5.0" + widest-line "^4.0.1" + wrap-ansi "^8.0.1" -browserslist@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.10.0.tgz#f179737913eaf0d2b98e4926ac1ca6a15cbcc6a9" - integrity sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA== +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: - caniuse-lite "^1.0.30001035" - electron-to-chromium "^1.3.378" - node-releases "^1.1.52" - pkg-up "^3.1.0" + balanced-match "^1.0.0" + concat-map "0.0.1" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.4, browserslist@^4.8.5: - version "4.14.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.5.tgz#1c751461a102ddc60e40993639b709be7f2c4015" - integrity sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA== +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: - caniuse-lite "^1.0.30001135" - electron-to-chromium "^1.3.571" - escalade "^3.1.0" - node-releases "^1.1.61" + fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.16.1: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^2.0.3" + picocolors "^1.0.0" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -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-json@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23" - integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw== - -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= + 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== 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" - -cacache@^15.0.5: - version "15.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" - integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== - dependencies: - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.0" - tar "^6.0.2" - unique-filename "^1.1.1" - -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" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -cache-loader@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e" - integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw== - dependencies: - buffer-json "^2.0.0" - find-cache-dir "^3.0.0" - loader-utils "^1.2.3" - mkdirp "^0.5.1" - neo-async "^2.6.1" - schema-utils "^2.0.0" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-request@^6.0.0: version "6.1.0" @@ -3518,57 +2612,36 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + 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== -camel-case@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" - integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== dependencies: - pascal-case "^3.1.1" - tslib "^1.10.0" + pascal-case "^3.1.2" + tslib "^2.0.3" camelcase-css@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-api@^3.0.0: version "3.0.0" @@ -3580,22 +2653,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: - version "1.0.30001137" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001137.tgz#6f0127b1d3788742561a25af3607a17fc778b803" - integrity sha512-54xKQZTqZrKVHmVz0+UvdZR6kQc7pJDgfhsMYDG19ID1BWoNnDMFm5Q3uSBSU401pBvKYMsHAt9qhEDcxmk8aw== - -caniuse-lite@^1.0.30001181: - version "1.0.30001187" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001187.tgz#5706942631f83baa5a0218b7dfa6ced29f845438" - integrity sha512-w7/EP1JRZ9552CyrThUnay2RkZ1DXxKe/Q2swTC4+LElLh9RRYrL1Z+27LlakB8kzY0fSmHw9mc7XYDUKAKWMA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: + version "1.0.30001342" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz#87152b1e3b950d1fbf0093e23f00b6c8e8f1da96" + integrity sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA== ccount@^1.0.0, ccount@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.5.tgz#ac82a944905a65ce204eb03023157edf29425c17" - integrity sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" + integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3604,29 +2672,10 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== +chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -3646,20 +2695,22 @@ character-reference-invalid@^1.0.0: resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -check-types@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" - integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" cheerio@^0.22.0: version "0.22.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" - integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= + integrity sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA== dependencies: css-select "~1.2.0" dom-serializer "~0.1.0" @@ -3678,109 +2729,49 @@ cheerio@^0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" -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.3.0, chokidar@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.4.0" - optionalDependencies: - fsevents "~2.1.2" - -chokidar@^3.4.3: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== - dependencies: - anymatch "~3.1.1" +cheerio@^1.0.0-rc.10: + version "1.0.0-rc.11" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.11.tgz#1be84be1a126958366bcc57a11648cd9b30a60c2" + integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + tslib "^2.4.0" + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" - -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== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + fsevents "~2.3.2" chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -ci-info@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -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.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== - -clean-css@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78" - integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA== +clean-css@^5.2.2, clean-css@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== dependencies: source-map "~0.6.0" @@ -3789,47 +2780,33 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.0: +cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cli-width@^3.0.0: +cli-boxes@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== +cli-table3@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" -clone-deep@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.2.4.tgz#4e73dd09e9fb971cc38670c5dced9c1896481cc6" - integrity sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY= +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: - for-own "^0.1.3" - is-plain-object "^2.0.1" - kind-of "^3.0.2" - lazy-cache "^1.0.3" - shallow-clone "^0.1.2" + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" clone-response@^1.0.2: version "1.0.2" @@ -3843,29 +2820,12 @@ clsx@^1.1.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== -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, color-convert@^1.9.1: +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== @@ -3884,57 +2844,56 @@ 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, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" - integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== -color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" +colorette@^2.0.10: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -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== +combine-promises@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" + integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== comma-separated-tokens@^1.0.0: version "1.0.8" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== -commander@^2.18.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1, commander@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== 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" @@ -3960,16 +2919,6 @@ concat-map@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" - configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" @@ -3987,32 +2936,22 @@ connect-history-api-fallback@^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== -consola@^2.10.0: - version "2.15.0" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.0.tgz#40fc4eefa4d2f8ef2e2806147f056ea207fcc0e9" - integrity sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ== - -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= +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -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== +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== dependencies: - safe-buffer "5.1.2" + safe-buffer "5.2.1" content-type@~1.0.4: version "1.0.4" @@ -4020,9 +2959,9 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -4031,95 +2970,50 @@ cookie-signature@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= +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -copy-text-to-clipboard@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-2.2.0.tgz#329dd6daf8c42034c763ace567418401764579ae" - integrity sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ== +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== -copy-webpack-plugin@^6.3.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" - integrity sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA== +copy-webpack-plugin@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" + integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== dependencies: - cacache "^15.0.5" - fast-glob "^3.2.4" - find-cache-dir "^3.3.1" - glob-parent "^5.1.1" - globby "^11.0.1" - loader-utils "^2.0.0" + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" normalize-path "^3.0.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - webpack-sources "^1.4.3" - -core-js-compat@^3.6.2: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" - integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== - dependencies: - browserslist "^4.8.5" - semver "7.0.0" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" -core-js-compat@^3.8.0: - version "3.8.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.3.tgz#9123fb6b9cad30f0651332dc77deba48ef9b0b3f" - integrity sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog== +core-js-compat@^3.21.0, core-js-compat@^3.22.1: + version "3.22.7" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.7.tgz#8359eb66ecbf726dd0cfced8e48d5e73f3224239" + integrity sha512-uI9DAQKKiiE/mclIC5g4AjRpio27g+VMRhe6rQoz+q4Wm4L6A/fJhiLtBw+sfOpDG9wZ3O0pxIw7GbfOlBgjOA== dependencies: - browserslist "^4.16.1" + browserslist "^4.20.3" semver "7.0.0" -core-js-pure@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" - integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== +core-js-pure@^3.20.2: + version "3.22.7" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.7.tgz#f58489d9b309fa7b26486a0f70d4ec19a418084e" + integrity sha512-wTriFxiZI+C8msGeh7fJcbC/a0V8fdInN1oS2eK79DMBGs8iIJiXhtFJCiT3rBa8w6zroHWW3p8ArlujZ/Mz+w== -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-js@^2.6.5: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js@^3.22.3: + version "3.22.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.7.tgz#8d6c37f630f6139b8732d10f2c114c3f1d00024f" + integrity sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg== core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.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@^6.0.0: version "6.0.0" @@ -4132,58 +3026,25 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" -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@7.0.1: +cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + "@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" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cross-fetch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" + node-fetch "2.6.7" -cross-spawn@^7.0.0: +cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4192,88 +3053,65 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" -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" - crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" +css-declaration-sorter@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz#bfd2f6f50002d6a3ae779a87d3a0c5d5b10e0f02" + integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== + +css-loader@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" + +css-minimizer-webpack-plugin@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" -css-loader@^3.4.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" -css-select@^1.1.0, css-select@~1.2.0: +css-select@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= @@ -4283,30 +3121,12 @@ css-select@^1.1.0, css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: - mdn-data "2.0.6" + mdn-data "2.0.14" source-map "^0.6.1" css-what@2.1: @@ -4314,154 +3134,103 @@ css-what@2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -css-what@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" - integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -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== - -cssnano-preset-advanced@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz#d981527b77712e2f3f3f09c73313e9b71b278b88" - integrity sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw== - dependencies: - autoprefixer "^9.4.7" - cssnano-preset-default "^4.0.7" - postcss-discard-unused "^4.0.1" - postcss-merge-idents "^4.0.1" - postcss-reduce-idents "^4.0.2" - postcss-zindex "^4.0.1" - -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== +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== + +cssnano-preset-advanced@^5.3.3: + version "5.3.5" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.5.tgz#b01dda0f76ff762b58bccd17c59701176b9be131" + integrity sha512-KgrfLQaTBB4bov/Xsi0+y5iGM5gg5QChP1PTMJ9t7U6p9geKHYcPS9AC6gmfwurm0GKxhTRafDx55E8FKHX8eg== + dependencies: + autoprefixer "^10.3.7" + cssnano-preset-default "^5.2.9" + postcss-discard-unused "^5.1.0" + postcss-merge-idents "^5.1.1" + postcss-reduce-idents "^5.2.0" + postcss-zindex "^5.1.0" + +cssnano-preset-default@^5.2.9: + version "5.2.9" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz#63f6aa9a9f0b21d9a526371dd308253b656a9784" + integrity sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw== + dependencies: + css-declaration-sorter "^6.2.2" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.1" + postcss-discard-comments "^5.1.1" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.5" + postcss-merge-rules "^5.1.1" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.0" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.0" + postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.1" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== +cssnano@^5.0.6, cssnano@^5.1.7: + version "5.1.9" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.9.tgz#e6cb286c4907cbd55678eb315837a21008be21be" + integrity sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg== dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" + cssnano-preset-default "^5.2.9" + lilconfig "^2.0.3" + yaml "^1.10.2" -csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== dependencies: - css-tree "1.0.0-alpha.39" + css-tree "^1.1.2" csstype@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" - integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: +debug@2.6.9, debug@^2.6.0: 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.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - debug@^4.1.0, debug@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity 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= - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -4469,109 +3238,69 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -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" - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -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== +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + execa "^5.0.0" defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== -define-properties@^1.1.2, 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-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -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== +define-properties@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.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" - -del@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" - integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== +del@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" + integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== dependencies: - globby "^10.0.1" - graceful-fs "^4.2.2" + globby "^11.0.1" + graceful-fs "^4.2.4" is-glob "^4.0.1" is-path-cwd "^2.2.0" - is-path-inside "^3.0.1" - p-map "^3.0.0" - rimraf "^3.0.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" slash "^3.0.0" +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity 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= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detab@2.0.4: version "2.0.4" @@ -4581,11 +3310,11 @@ detab@2.0.4: repeat-string "^1.5.4" detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port-alt@1.1.6: +detect-port-alt@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== @@ -4601,23 +3330,6 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" -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" - -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4630,22 +3342,14 @@ dns-equal@^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= +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== dependencies: - buffer-indexof "^1.0.0" + "@leichtgewicht/ip-codec" "^2.0.1" -dom-converter@^0.2: +dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== @@ -4660,6 +3364,24 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + dom-serializer@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -4668,20 +3390,15 @@ dom-serializer@~0.1.0: domelementtype "^1.3.0" entities "^1.1.1" -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== - domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971" - integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA== +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^2.3.0: version "2.4.2" @@ -4690,6 +3407,20 @@ domhandler@^2.3.0: dependencies: domelementtype "1" +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -4698,7 +3429,7 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.5.1, domutils@^1.7.0: +domutils@^1.5.1: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -4706,13 +3437,31 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" -dot-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" - integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: - no-case "^3.0.3" - tslib "^1.10.0" + no-case "^3.0.4" + tslib "^2.0.3" dot-prop@^5.2.0: version "5.3.0" @@ -4726,73 +3475,35 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexer@^0.1.1: +duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -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" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 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= -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.571: - version "1.3.573" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.573.tgz#6a21e13ee894eb441677333d5fe9fa3a449689a1" - integrity sha512-oypaNmexr8w0m2GX67fGLQ0Xgsd7uXz7GcwaHZ9eW3ZdQ8uA2+V/wXmLdMTk3gcacbqQGAN7CXWG3fOkfKYftw== - -electron-to-chromium@^1.3.649: - version "1.3.664" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.664.tgz#8fb039e2fa8ef3ab2568308464a28425d4f6e2a3" - integrity sha512-yb8LrTQXQnh9yhnaIHLk6CYugF/An50T20+X0h++hjjhVfgSp1DGoMSYycF8/aD5eiqS4QwaNhiduFvK8rifRg== - -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" - -"emoji-regex@>=6.0.0 <=6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" - integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +electron-to-chromium@^1.4.118: + version "1.4.138" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.138.tgz#3ec41ca589aaf505dfe2034fde913329af801730" + integrity sha512-IOyp2Seq3w4QLln+yZWcMF3VXhhduz4bwg9gfI+CnP5TkzwNXQ8FCZuwwPsnes73AfWdf5J2n2OXdUwDUspDPQ== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -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= +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== emojis-list@^3.0.0: version "3.0.0" @@ -4809,28 +3520,20 @@ 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: +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.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== +enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" + graceful-fs "^4.2.4" + tapable "^2.2.0" entities@^1.1.1, entities@~1.1.1: version "1.1.2" @@ -4838,16 +3541,19 @@ entities@^1.1.1, entities@~1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" +entities@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + +entities@^4.2.0, entities@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.3.0.tgz#62915f08d67353bb4eb67e3d62641a4059aec656" + integrity sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg== error-ex@^1.3.1: version "1.3.2" @@ -4856,54 +3562,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-abstract@^1.18.0-next.0: - version "1.18.0-next.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" - integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" - integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== escalade@^3.1.1: version "3.1.1" @@ -4920,22 +3582,22 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +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.3: - 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== +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@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" esprima@^4.0.0: @@ -4943,7 +3605,7 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.1.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -4956,30 +3618,31 @@ estraverse@^4.1.1: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eta@^1.11.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.1.tgz#d985766591676c323f02dfc48a67539212745937" - integrity sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA== +eta@^1.12.3: + version "1.12.3" + resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1" + integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg== etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -eval@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.4.tgz#e05dbe0dab4b9330215cbb7bf4886eb24bd58700" - integrity sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw== +eval@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" + integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== dependencies: + "@types/node" "*" require-like ">= 0.1.1" eventemitter3@^4.0.0: @@ -4987,105 +3650,59 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= - -events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== - dependencies: - original "^1.0.0" +events@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -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== +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - 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" - -execa@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.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" - -express@^4.16.3, express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== +express@^4.17.3: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" + body-parser "1.20.0" + content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.0" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" + proxy-addr "~2.0.7" + qs "6.10.3" 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" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -5097,70 +3714,26 @@ extend-shallow@^2.0.1: 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" - extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -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: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^2.0.2: - version "2.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" - integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== - dependencies: - "@mrmlnc/readdir-enhanced" "^2.2.1" - "@nodelib/fs.stat" "^1.1.2" - glob-parent "^3.1.0" - is-glob "^4.0.0" - merge2 "^1.2.3" - micromatch "^3.1.10" - -fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" - integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== +fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -5175,65 +3748,51 @@ fast-url-parser@1.1.3: punycode "^1.3.2" fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" -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= +faye-websocket@^0.11.3: + 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" -faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== +fbemitter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" + integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== dependencies: - websocket-driver ">=0.5.1" + fbjs "^3.0.0" -fbemitter@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-2.1.1.tgz#523e14fdaf5248805bb02f62efc33be703f51865" - integrity sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU= - dependencies: - fbjs "^0.8.4" +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== -fbjs@^0.8.0, fbjs@^0.8.4: - version "0.8.17" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" - integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= +fbjs@^3.0.0, fbjs@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" + integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" + cross-fetch "^3.1.5" + fbjs-css-vars "^1.0.0" loose-envify "^1.0.0" object-assign "^4.1.0" promise "^7.1.1" setimmediate "^1.0.5" - ua-parser-js "^0.7.18" + ua-parser-js "^0.7.30" -feed@^4.2.1: +feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== dependencies: xml-js "^1.6.11" -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== - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -5242,30 +3801,10 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.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" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filesize@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.0.1.tgz#f850b509909c7c86f7e450ea19006c31c2ed3d2f" - integrity sha512-u4AYWPgbI5GBhs6id1KdImZWn5yfyFrrQ8OWZdN7ZMfA8Bf4HcO0BGo9bmUIEV8yrp8I1xVfJ/dn90GtFNNJcg== - -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== - -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" +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== fill-range@^7.0.1: version "7.0.1" @@ -5274,45 +3813,28 @@ fill-range@^7.0.1: 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== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" 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-cache-dir@^3.0.0, find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@4.1.0, find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -5320,89 +3842,79 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -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== +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" + locate-path "^5.0.0" + path-exists "^4.0.0" -flux@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/flux/-/flux-3.1.3.tgz#d23bed515a79a22d933ab53ab4ada19d05b2f08a" - integrity sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io= +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - fbemitter "^2.0.0" - fbjs "^0.8.0" - -follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== - -for-in@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= - -for-in@^1.0.1, 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= + locate-path "^6.0.0" + path-exists "^4.0.0" -for-own@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= +flux@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.3.tgz#573b504a24982c4768fdfb59d8d2ea5637d72ee7" + integrity sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw== dependencies: - for-in "^1.0.1" + fbemitter "^3.0.0" + fbjs "^3.0.1" -fork-ts-checker-webpack-plugin@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-3.1.1.tgz#a1642c0d3e65f50c2cc1742e9c0a80f441f86b19" - integrity sha512-DuVkPNrM12jR41KM2e+N+styka0EgLkTnXmNcXdgOM37vtGeY+oCBK/Jx0hzSeEU6memFCtWb4htrHPMDfwwUQ== +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== dependencies: - babel-code-frame "^6.22.0" - chalk "^2.4.1" - chokidar "^3.3.0" - micromatch "^3.1.10" + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" minimatch "^3.0.4" - semver "^5.6.0" + schema-utils "2.7.0" + semver "^7.3.2" tapable "^1.0.0" - worker-rpc "^0.1.0" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +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" +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== 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= +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" -fs-extra@^9.0.1: +fs-extra@^9.0.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -5412,42 +3924,17 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-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-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity 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.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fsevents@~2.3.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== @@ -5457,87 +3944,88 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + 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-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.1.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-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" -get-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= +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -github-slugger@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9" - integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q== - dependencies: - emoji-regex ">=6.0.0 <=6.1.1" +github-slugger@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" + integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== -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= +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + is-glob "^4.0.1" -glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - is-glob "^4.0.1" + is-glob "^4.0.3" -glob-to-regexp@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" - integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== dependencies: - ini "^1.3.5" + ini "2.0.0" -global-modules@2.0.0: +global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== @@ -5558,55 +4046,29 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== +globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" got@^9.6.0: version "9.6.0" @@ -5625,41 +4087,33 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -gray-matter@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454" - integrity sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw== +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== dependencies: - js-yaml "^3.11.0" + js-yaml "^3.13.1" kind-of "^6.0.2" section-matter "^1.0.0" strip-bom-string "^1.0.0" -gzip-size@5.1.1, gzip-size@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: - duplexer "^0.1.1" - pify "^4.0.1" + duplexer "^0.1.2" 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-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -5670,75 +4124,34 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -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: +has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" + get-intrinsic "^1.1.1" -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-symbols@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== -has@^1.0.0, has@^1.0.3: +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" - hast-to-hyperscript@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.0.tgz#768fb557765fe28749169c885056417342d71e83" - integrity sha512-NJvMYU3GlMLs7hN3CRbsNlMzusVNkYBogVWDGybsuuVQ336gFLiD+q9qtFZT2meSHzln3pNISZWTASWothMSMg== + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" + integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== dependencies: "@types/unist" "^2.0.3" comma-separated-tokens "^1.0.0" @@ -5760,21 +4173,21 @@ hast-util-from-parse5@^5.0.0: xtend "^4.0.1" hast-util-from-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.0.tgz#b38793c81e1a99f5fd592a4a88fc2731dccd0f30" - integrity sha512-3ZYnfKenbbkhhNdmOQqgH10vnvPivTdsOJCri+APn0Kty+nRkDHArnaX9Hiaf8H+Ig+vkNptL+SRY/6RwWJk1Q== + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== dependencies: "@types/parse5" "^5.0.0" - ccount "^1.0.0" - hastscript "^5.0.0" + hastscript "^6.0.0" property-information "^5.0.0" vfile "^4.0.0" + vfile-location "^3.2.0" web-namespaces "^1.0.0" hast-util-parse-selector@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz#60c99d0b519e12ab4ed32e58f150ec3f61ed1974" - integrity sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA== + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== hast-util-raw@6.0.1: version "6.0.1" @@ -5813,16 +4226,22 @@ hastscript@^5.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -5835,15 +4254,6 @@ history@^4.9.0: 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@^3.1.0: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -5851,11 +4261,6 @@ hoist-non-react-statics@^3.1.0: dependencies: react-is "^16.7.0" -hoopy@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" - integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -5866,65 +4271,46 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-entities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" - integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== +html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== -html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== +html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" he "^1.2.0" - param-case "^3.0.3" + param-case "^3.0.4" relateurl "^0.2.7" - terser "^4.6.3" + terser "^5.10.0" -html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== +html-tags@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" + integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== html-void-elements@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== -html-webpack-plugin@^4.5.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.1.tgz#40aaf1b5cb78f2f23a83333999625c20929cda65" - integrity sha512-yzK7RQZwv9xB+pcdHNTjcqbaaDZ+5L0zJHXfi89iWIZmb/FtzxhLk0635rmJihcQbs3ZUF27Xp4oWGx6EK56zg== - dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.20" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" -htmlparser2@^3.3.0, htmlparser2@^3.9.1: +htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -5936,6 +4322,26 @@ htmlparser2@^3.3.0, htmlparser2@^3.9.1: inherits "^2.0.1" readable-stream "^3.1.1" +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -5946,16 +4352,16 @@ http-deceiver@^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== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" http-errors@~1.6.2: version "1.6.3" @@ -5967,33 +4373,23 @@ http-errors@~1.6.2: 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.2" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" - integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== + version "0.5.6" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.6.tgz#2e02406ab2df8af8a7abfba62e0da01c62b95afd" + integrity sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA== -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" -http-proxy@^1.17.0: +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== @@ -6002,86 +4398,41 @@ http-proxy@^1.17.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= - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24, iconv-lite@^0.4.24: +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.2" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - -ignore@^5.1.1, ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -immer@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" - integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" +ignore@^5.1.9, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= +image-size@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.1.tgz#86d6cfc2b1d19eab5d2b368d4b9194d9e48541c5" + integrity sha512-VAwkvNSNGClRw9mDHhc5Efax8PLlsOGcUTh0T/LIriC8vPA3U5PdqXWqkz406MoYHMKW8Uf9gWr05T/rYB44kQ== dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" + queue "6.0.2" -import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" +immer@^9.0.7: + version "9.0.14" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.14.tgz#e05b83b63999d26382bb71676c9d827831248a48" + integrity sha512-ubBeqQutOSLIFCUBN03jGeOS6a3DoYlSYwYJTa+gSKEZKU5redJIqkIdZ3JVv/4RZpfcXdAWH5zCNLWPRv2WDw== -import-fresh@^3.2.2: +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -6089,26 +4440,11 @@ import-fresh@^3.2.2: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -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" @@ -6119,20 +4455,10 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -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, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -infima@0.2.0-alpha.18: - version "0.2.0-alpha.18" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.18.tgz#8ac62711f13ef99b1f4a45b3ac14571722a2ccf6" - integrity sha512-ndSEffXzjgM/eiSm5jpLTX6ON9MmylzxqBnV2bTiC3kCSyDYdvzTs+bSwf+C4TWayuqnRTnBK1JUePo3m6Bnfg== +infima@0.2.0-alpha.39: + version "0.2.0-alpha.39" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.39.tgz#054b13ac44f3e9a42bc083988f1a1586add2f59c" + integrity sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw== inflight@^1.0.4: version "1.0.6" @@ -6142,21 +4468,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, 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@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -6167,102 +4493,27 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.4.tgz#99af5bde47153abca23f5c7fc30db247f39da703" - integrity sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@^7.2.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -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.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -invariant@^2.2.2, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" -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: +ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -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" +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== is-alphabetical@1.0.4, is-alphabetical@^1.0.0: version "1.0.4" @@ -6277,28 +4528,11 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -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" @@ -6306,20 +4540,10 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^1.0.2, 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-buffer@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-ci@^2.0.0: version "2.0.0" @@ -6328,108 +4552,42 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -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== +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + has "^1.0.3" is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== -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-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: +is-extendable@^0.1.0: 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: +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@^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-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-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.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -6438,30 +4596,18 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== +is-installed-globally@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - -is-negative-zero@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" - integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + global-dirs "^3.0.0" + is-path-inside "^3.0.2" -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - -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-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== is-number@^7.0.0: version "7.0.0" @@ -6478,92 +4624,47 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: +is-path-cwd@^2.2.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-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +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, is-regex@^1.1.0, is-regex@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-root@2.1.0, is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -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-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typedarray@^1.0.0: version "1.0.0" @@ -6575,22 +4676,12 @@ is-whitespace-character@^1.0.0: resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== -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-word-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== -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= - -is-wsl@^2.1.1: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6607,7 +4698,7 @@ isarray@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: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -6617,43 +4708,28 @@ isexe@^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: +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" - -jest-worker@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" - integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== +jest-worker@^27.0.2, jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: "@types/node" "*" merge-stream "^2.0.0" - supports-color "^7.0.0" + supports-color "^8.0.0" -joi@^17.2.1, joi@^17.3.0: - version "17.4.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20" - integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg== +joi@^17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.0" + "@sideway/address" "^4.1.3" "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" @@ -6662,19 +4738,21 @@ joi@^17.2.1, joi@^17.3.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@^3.11.0, js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -6690,12 +4768,7 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-better-errors@^1.0.1, 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-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -6705,24 +4778,15 @@ json-schema-traverse@^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@^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" +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -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" +json5@^2.1.2, json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== jsonfile@^6.0.1: version "6.1.0" @@ -6740,116 +4804,62 @@ keyv@^3.0.0: dependencies: json-buffer "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@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" - integrity sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU= - dependencies: - is-buffer "^1.0.2" - -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== -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -latest-version@^5.0.0: +latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== dependencies: package-json "^6.3.0" -lazy-cache@^0.2.3: - version "0.2.7" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" - integrity sha1-f+3fLctu23fRHvHRF6tf/fCrG2U= - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" +lilconfig@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -loader-runner@^2.4.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.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" + 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-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.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-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== 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== + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -6865,10 +4875,12 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" lodash.assignin@^4.0.9: version "4.2.0" @@ -6880,21 +4892,16 @@ lodash.bind@^4.1.4: resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -lodash.chunk@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" - integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= - lodash.curry@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" integrity sha1-JI42By7ekGUB11lmIAqG2riyMXA= +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.defaults@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -6905,11 +4912,6 @@ lodash.filter@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= -lodash.flatmap@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" - integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= - lodash.flatten@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -6925,31 +4927,6 @@ lodash.foreach@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= -lodash.groupby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" - integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= - -lodash.has@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" - integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= - lodash.map@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -6965,21 +4942,11 @@ lodash.merge@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.padstart@^4.6.1: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" - integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= - -lodash.pick@^4.2.1, lodash.pick@^4.4.0: +lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= -lodash.pickby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" - integrity sha1-feoh2MGNdwOifHBMFdO4SmfjOv8= - lodash.reduce@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" @@ -6995,46 +4962,21 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.6.0, lodash.sortby@^4.7.0: +lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.toarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" - integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= - lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5: +lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loglevel@^1.6.8: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== - loose-envify@^1.0.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" @@ -7042,12 +4984,12 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3 dependencies: js-tokens "^3.0.0 || ^4.0.0" -lower-case@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" - integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: - tslib "^1.10.0" + tslib "^2.0.3" lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" @@ -7059,13 +5001,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -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" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -7073,14 +5008,6 @@ lru-cache@^6.0.0: 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" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -7088,32 +5015,11 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.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" - markdown-escapes@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== -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" - mdast-squeeze-paragraphs@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" @@ -7142,20 +5048,15 @@ mdast-util-to-hast@10.0.1: unist-util-position "^3.0.0" unist-util-visit "^2.0.0" -mdast-util-to-string@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" - integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdast-util-to-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" + integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== mdurl@^1.0.0: version "1.0.1" @@ -7167,30 +5068,12 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -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-deep@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/merge-deep/-/merge-deep-3.0.3.tgz#1a2b2ae926da8b2ae93a0ac15d90cd1922766003" - integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== +memfs@^3.1.2, memfs@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.3.tgz#fc08ac32363b6ea6c95381cabb4d67838180d4e1" + integrity sha512-eivjfi7Ahr6eQTn44nvTnR60e4a1Fs1Via2kCR5lHo/kyNoiMWaXCNJ/GpSd0ilXas2JSOl9B5FTIhflXu0hlg== dependencies: - arr-union "^3.1.0" - clone-deep "^0.2.4" - kind-of "^3.0.2" + fs-monkey "1.0.3" merge-descriptors@1.0.1: version "1.0.1" @@ -7202,7 +5085,7 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.2.3, merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -7212,55 +5095,18 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -micromatch@^3.1.10, micromatch@^3.1.4: - 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" - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -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== +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + braces "^3.0.2" + picomatch "^2.3.1" -mime-db@1.45.0, "mime-db@>= 1.43.0 < 2": - version "1.45.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" - integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-db@~1.33.0: version "1.33.0" @@ -7274,30 +5120,18 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.27: - version "2.1.28" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" - integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.45.0" - -mime-types@~2.1.17, mime-types@~2.1.24: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" + mime-db "1.52.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -7309,280 +5143,118 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== mini-create-react-context@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" - integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== + version "0.4.1" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" + integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== dependencies: - "@babel/runtime" "^7.5.5" + "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-css-extract-plugin@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161" - integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw== +mini-css-extract-plugin@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" + schema-utils "^4.0.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: +minimalistic-assert@^1.0.0: 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, minimatch@^3.0.4: +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== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -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" - -mixin-object@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= - dependencies: - for-in "^0.1.3" - is-extendable "^0.1.1" - -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - minimist "^1.2.5" + brace-expansion "^1.1.7" -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -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" +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== 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, ms@^2.1.1: +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== -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= +ms@2.1.3: + 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@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== +multicast-dns@^7.2.4: + version "7.2.5" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== dependencies: - dns-packet "^1.3.1" + dns-packet "^5.2.2" thunky "^1.0.2" -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - -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" +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== -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== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.1: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -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== - -no-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" - integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: - lower-case "^2.0.1" - tslib "^1.10.0" + lower-case "^2.0.2" + tslib "^2.0.3" node-emoji@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" - integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== dependencies: - lodash.toarray "^4.4.0" + lodash "^4.17.21" -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== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" + whatwg-url "^5.0.0" -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-forge@^1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-libs-browser@^2.2.1: - 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" - -node-releases@^1.1.52, node-releases@^1.1.61: - version "1.1.61" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e" - integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g== - -node-releases@^1.1.70: - version "1.1.70" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" - integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== - -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" +node-releases@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7594,34 +5266,17 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== -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" +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -7633,109 +5288,54 @@ nprogress@^0.2.0: resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" integrity sha1-y480xTIT2JVyP8urkH6UIq28r7E= -nth-check@^1.0.2, nth-check@~1.0.1: +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== dependencies: boolbase "~1.0.0" -null-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" - integrity sha512-hf5sNLl8xdRho4UPBOOeoIwT3WhjYcMUQm0zj44EhD6UscMAz72o2udpoDFBgykucdEDGIcd6SXbc/G6zssbzw== - dependencies: - loader-utils "^1.2.3" - schema-utils "^1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.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-inspect@^1.7.0, object-inspect@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-is@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" +object-inspect@^1.9.0: + version "1.12.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.1.tgz#28a661153bad7e470e4b01479ef1cb91ce511191" + integrity sha512-Y/jF6vnvEtOPGiKD1+q+X0CiUYRQtEHp89MLLUJ7TUivtH8Ugn2+3A7Rynqk7BRsAoqeOQWnFnjpDrKSxDgIGA== -object-keys@^1.0.12, object-keys@^1.1.1: +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.assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -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" - -object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" + has-symbols "^1.0.1" + object-keys "^1.1.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= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -7751,73 +5351,32 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open@^7.0.2: - version "7.2.1" - resolved "https://registry.yarnpkg.com/open/-/open-7.2.1.tgz#07b0ade11a43f2a8ce718480bdf3d7563a095195" - integrity sha512-xbYCJib4spUdmcs0g/2mK1nKo/jO2T7INClWd/beL7PFkXRWgr8B23ssDHX/USPn2M2IjDR5UdpYs6I67SnTSA== +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" -opener@^1.5.1: +opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -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" - -optimize-css-assets-webpack-plugin@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" - integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.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-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== -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-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -7826,11 +5385,11 @@ p-limit@^2.0.0, p-limit@^2.2.0: p-try "^2.0.0" p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-try "^2.0.0" + yocto-queue "^0.1.0" p-locate@^3.0.0: version "3.0.0" @@ -7846,17 +5405,12 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.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-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - aggregate-error "^3.0.0" + p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" @@ -7865,12 +5419,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - retry "^0.12.0" + "@types/retry" "0.12.0" + retry "^0.13.1" p-try@^2.0.0: version "2.2.0" @@ -7887,27 +5442,13 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" -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" - -param-case@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" - integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== dependencies: - dot-case "^3.0.3" - tslib "^1.10.0" + dot-case "^3.0.4" + tslib "^2.0.3" parent-module@^1.0.0: version "1.0.1" @@ -7916,17 +5457,6 @@ parent-module@^1.0.0: 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" - 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-entities@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" @@ -7939,28 +5469,28 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - parse-json@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" - integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + 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-numeric-range@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz#aa70b00f29624ed13e9f943e9461b306e386b0fa" - integrity sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg== +parse-numeric-range@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" + integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" parse5@^5.0.0: version "5.1.1" @@ -7972,33 +5502,25 @@ parse5@^6.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.0.0.tgz#51f74a5257f5fcc536389e8c2d0b3802e1bfa91a" + integrity sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g== + dependencies: + entities "^4.3.0" + 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== -pascal-case@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" - integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== dependencies: - no-case "^3.0.3" - tslib "^1.10.0" - -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= + no-case "^3.0.4" + tslib "^2.0.3" path-exists@^3.0.0: version "3.0.0" @@ -8015,22 +5537,17 @@ path-is-absolute@^1.0.0: 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, path-is-inside@^1.0.2: +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-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +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== @@ -8052,67 +5569,20 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - 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.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== - 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.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -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= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -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" +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pkg-dir@^4.1.0: version "4.2.0" @@ -8121,755 +5591,336 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" -pkg-up@3.1.0, pkg-up@^3.1.0: +pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" -pnp-webpack-plugin@^1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -portfinder@^1.0.26: - 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= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-calc@^7.0.1: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.4.tgz#5e177ddb417341e6d4a193c5d9fd8ada79094f8b" - integrity sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw== - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-combine-duplicated-selectors@^9.1.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/postcss-combine-duplicated-selectors/-/postcss-combine-duplicated-selectors-9.4.0.tgz#dae866debae5f93b58e13e6cc69419105e91336a" - integrity sha512-rMnO1H3wgR1T6QSlK3i8Slz9p3xD+0yOi4J7qwh/5PGR3z8jbgYvRlNKAIvXDtGBQbJKoWs4df5skL3a/fdUEA== - dependencies: - postcss "^7.0.0" - postcss-selector-parser "^6.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: - postcss "^7.0.0" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== dependencies: - postcss "^7.0.0" + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== +postcss-convert-values@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz#31c8ffba650e86dc750631cafcf1db022c5bb6f1" + integrity sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q== dependencies: - postcss "^7.0.0" + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" +postcss-discard-comments@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz#e90019e1a0e5b99de05f63516ce640bd0df3d369" + integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== -postcss-discard-unused@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz#ee7cc66af8c7e8c19bd36f12d09c4bde4039abea" - integrity sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA== - dependencies: - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - uniqs "^2.0.0" +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== +postcss-discard-unused@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" + integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== dependencies: - postcss "^7.0.2" + postcss-selector-parser "^6.0.5" -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== dependencies: - postcss "^7.0.2" + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" -postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== +postcss-merge-idents@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" + integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== dependencies: - postcss "^7.0.2" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== +postcss-merge-longhand@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz#b0e03bee3b964336f5f33c4fc8eacae608e91c05" + integrity sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== +postcss-merge-rules@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz#d327b221cd07540bcc8d9ff84446d8b404d00162" + integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" -postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: - lodash.template "^4.5.0" - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-load-config@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.1.tgz#0a684bb8beb05e55baf922f7ab44c3edb17cf78e" - integrity sha512-D2ENobdoZsW0+BHy4x1CAkXtbXtYWYRIxL/JbtRBqrRGOPtJ2zoga/bEZWhV/ShWB5saVxJMzbMdSyA/vv4tXw== +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== +postcss-minify-selectors@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz#17c2be233e12b28ffa8a421a02fc8b839825536c" + integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" + postcss-selector-parser "^6.0.5" -postcss-logical@^3.0.0: +postcss-modules-extract-imports@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" + 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-media-minmax@^4.0.0: +postcss-modules-local-by-default@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-idents@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz#b7df282a92f052ea0a66c62d8f8812e6d2cbed23" - integrity sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A== - dependencies: - cssnano-util-same-parent "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + 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: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" + icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: +postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-selector-parser "^6.0.4" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +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: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + icss-utils "^5.0.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== +postcss-normalize-positions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" + integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== +postcss-normalize-repeat-style@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" + integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@^6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + postcss-value-parser "^4.2.0" -postcss-reduce-idents@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz#30447a6ec20941e78e21bd4482a11f569c4f455b" - integrity sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw== +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== +postcss-ordered-values@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz#0b41b610ba02906a3341e92cab01ff8ebc598adb" + integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-selector-not@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" - integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== +postcss-reduce-idents@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" + integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + browserslist "^4.16.6" + caniuse-api "^3.0.0" -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + postcss-value-parser "^4.2.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-sort-media-queries@^1.7.26: - version "1.31.21" - resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz#3225ec6eb490402602284ac99963b80461783cee" - integrity sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg== +postcss-sort-media-queries@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-4.2.1.tgz#a99bae69ef1098ee3b64a5fa94d258ec240d0355" + integrity sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ== dependencies: - postcss "^7.0.27" - sort-css-media-queries "1.5.0" + sort-css-media-queries "2.0.4" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" + postcss-value-parser "^4.2.0" + svgo "^2.7.0" -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + postcss-selector-parser "^6.0.5" -postcss-value-parser@^4.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-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss-zindex@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz#8db6a4cec3111e5d3fd99ea70abeda61873d10c1" - integrity sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" +postcss-zindex@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" + integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== +postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.13, postcss@^8.4.7: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -pretty-error@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" - integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: - renderkid "^2.0.1" - utila "~0.4" + lodash "^4.17.20" + renderkid "^3.0.0" pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.1.1.tgz#1c1be61b1eb9446a146ca7a50b7bcf36f2a70a44" - integrity sha512-MgMhSdHuHymNRqD6KM3eGS0PNqgK9q4QF5P0yoQQvpB6jNjeSAi3jcSAz0Sua/t9fa4xDOMar9HJbLa08gl9ug== +prism-react-renderer@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz#9b5a4211a6756eee3c96fee9a05733abc0b0805c" + integrity sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ== -prismjs@^1.22.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" - integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== +prismjs@^1.28.0: + version "1.28.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" + integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== 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" @@ -8877,55 +5928,38 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -prop-types@^15.5.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.6.2, prop-types@^15.7.2: + 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.8.1" + react-is "^16.13.1" property-information@^5.0.0, property-information@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.5.0.tgz#4dc075d493061a82e2b7d096f406e076ed859943" - integrity sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA== + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== dependencies: xtend "^4.0.0" -proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + 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" @@ -8934,21 +5968,7 @@ pump@^3.0.0: 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, punycode@^1.3.2: +punycode@^1.3.2: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= @@ -8958,10 +5978,10 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== dependencies: escape-goat "^2.0.0" @@ -8970,54 +5990,32 @@ pure-color@^1.2.0: resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" integrity sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4= -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -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== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" + side-channel "^1.0.4" -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= +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -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== +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +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.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -9028,13 +6026,13 @@ range-parser@^1.2.1, range-parser@~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== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.0" - http-errors "1.7.2" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -9058,100 +6056,94 @@ react-base16-styling@^0.6.0: lodash.flow "^3.3.0" pure-color "^1.2.0" -react-dev-utils@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" - integrity sha512-XxTbgJnYZmxuPtY3y/UV0D8/65NKkmaia4rXzViknVnZeVlklSh8u6TnaEYPfAi/Gh1TP4mEOXHI6jQOPbeakQ== - dependencies: - "@babel/code-frame" "7.8.3" - address "1.1.2" - browserslist "4.10.0" - chalk "2.4.2" - cross-spawn "7.0.1" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.0.1" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "3.1.1" - global-modules "2.0.0" - globby "8.0.2" - gzip-size "5.1.1" - immer "1.10.0" - inquirer "7.0.4" - is-root "2.1.0" - loader-utils "1.2.3" - open "^7.0.2" - pkg-up "3.1.0" - react-error-overlay "^6.0.7" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" - -react-dom@^16.8.4: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" - integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-dom@^16.14.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" scheduler "^0.19.1" -react-error-overlay@^6.0.7: - version "6.0.7" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" - integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== -react-fast-compare@^3.1.1: +react-fast-compare@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-helmet@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" - integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== +react-helmet-async@*, react-helmet-async@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" + integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== dependencies: - object-assign "^4.1.1" + "@babel/runtime" "^7.12.5" + invariant "^2.2.4" prop-types "^15.7.2" - react-fast-compare "^3.1.1" - react-side-effect "^2.1.0" + react-fast-compare "^3.2.0" + shallowequal "^1.1.0" -react-is@^16.6.0, 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: 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-json-view@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.19.1.tgz#95d8e59e024f08a25e5dc8f076ae304eed97cf5c" - integrity sha512-u5e0XDLIs9Rj43vWkKvwL8G3JzvXSl6etuS5G42a8klMohZuYFQzSN6ri+/GiBptDqlrXPTdExJVU7x9rrlXhg== +react-json-view@^1.21.3: + version "1.21.3" + resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" + integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== dependencies: - flux "^3.1.3" + flux "^4.0.1" react-base16-styling "^0.6.0" react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^6.1.0" + react-textarea-autosize "^8.3.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-loadable-ssr-addon@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz#ae9b2d3b11721930f8d8255476d288c0e9f9290f" - integrity sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw== +react-loadable-ssr-addon-v5-slorber@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" + integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== dependencies: "@babel/runtime" "^7.10.3" -react-loadable@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz#582251679d3da86c32aae2c8e689c59f1196d8c4" - integrity sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg== - dependencies: - prop-types "^15.5.0" - react-router-config@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" @@ -9160,24 +6152,24 @@ react-router-config@^5.1.1: "@babel/runtime" "^7.1.2" react-router-dom@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" - integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + version "5.3.3" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.3.tgz#8779fc28e6691d07afcaf98406d3812fe6f11199" + integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng== dependencies: - "@babel/runtime" "^7.1.2" + "@babel/runtime" "^7.12.13" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.2.0" + react-router "5.3.3" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.2.0, react-router@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" - integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== +react-router@5.3.3, react-router@^5.2.0: + version "5.3.3" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.3.tgz#8e3841f4089e728cf82a429d92cdcaa5e4a3a288" + integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w== dependencies: - "@babel/runtime" "^7.1.2" + "@babel/runtime" "^7.12.13" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" @@ -9188,35 +6180,25 @@ react-router@5.2.0, react-router@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-side-effect@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.0.tgz#1ce4a8b4445168c487ed24dab886421f74d380d3" - integrity sha512-IgmcegOSi5SNX+2Snh1vqmF0Vg/CbkycU9XZbOHJlZ6kMzTmi3yc254oB1WCkgA7OQtIAoLmcSFuHTc/tlcqXg== - -react-textarea-autosize@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-6.1.0.tgz#df91387f8a8f22020b77e3833c09829d706a09a5" - integrity sha512-F6bI1dgib6fSvG8so1HuArPUv+iVEfPliuLWusLF+gAKz0FbB4jLrWUrTAeq1afnPT2c9toEZYUdz/y1uKMy4A== - dependencies: - prop-types "^15.6.0" - -react-toggle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.1.tgz#2317f67bf918ea3508a96b09dd383efd9da572af" - integrity sha512-+wXlMcSpg8SmnIXauMaZiKpR+r2wp2gMUteroejp2UTSqGTVvZLN+m9EhMzFARBKEw7KpQOwzCyfzeHeAndQGw== +react-textarea-autosize@^8.3.2: + version "8.3.4" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524" + integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== dependencies: - classnames "^2.2.5" + "@babel/runtime" "^7.10.2" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" -react@^16.8.4: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" - integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== +react@^16.14.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" -"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: +readable-stream@^2.0.1: 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== @@ -9229,7 +6211,7 @@ react@^16.8.4: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.1.1: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9238,33 +6220,17 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: 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.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== - dependencies: - picomatch "^2.2.1" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +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" -reading-time@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.2.0.tgz#ced71c06715762f805506328dcc1fd45d8249ac4" - integrity sha512-5b4XmKK4MEss63y0Lw0vn0Zn6G5kiHP88mUnD8UeEsyORj3sh1ghTH0/u6m1Ax9G2F4wUZrknlp6WlIsCvoXVA== +reading-time@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" + integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== rechoir@^0.6.2: version "0.6.2" @@ -9273,69 +6239,53 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -recursive-readdir@2.2.2: +recursive-readdir@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== dependencies: minimatch "3.0.4" -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +regenerate-unicode-properties@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56" + integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw== dependencies: - regenerate "^1.4.0" + regenerate "^1.4.2" -regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + 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-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== +regenerator-transform@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537" + integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== dependencies: "@babel/runtime" "^7.8.4" -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.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -regexpu-core@^4.7.0, regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== +regexpu-core@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" + integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.0.1" + regjsgen "^0.6.0" + regjsparser "^0.8.2" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: rc "^1.2.8" @@ -9346,15 +6296,15 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" -regjsgen@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== +regjsgen@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" + integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== -regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== +regjsparser@^0.8.2: + version "0.8.4" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" + integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA== dependencies: jsesc "~0.5.0" @@ -9381,14 +6331,14 @@ remark-admonitions@^1.2.1: unified "^8.4.2" unist-util-visit "^2.0.1" -remark-emoji@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.1.0.tgz#69165d1181b98a54ad5d9ef811003d53d7ebc7db" - integrity sha512-lDddGsxXURV01WS9WAiS9rO/cedO1pvr9tahtLhr6qCGFhHG4yZSJW3Ha4Nw9Uk1hLNmUBtPC0+m45Ms+xEitg== +remark-emoji@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" + integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== dependencies: emoticon "^3.2.0" node-emoji "^1.10.0" - unist-util-visit "^2.0.2" + unist-util-visit "^2.0.3" remark-footnotes@2.0.0: version "2.0.0" @@ -9438,69 +6388,37 @@ remark-squeeze-paragraphs@4.0.0: dependencies: mdast-squeeze-paragraphs "^4.0.0" -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= - -renderkid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" - integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: - css-select "^1.1.0" - dom-converter "^0.2" - htmlparser2 "^3.3.0" - strip-ansi "^3.0.0" - utila "^0.4.0" + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.5.4: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -replace-ext@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - -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-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== "require-like@>= 0.1.1": version "0.1.2" resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" integrity sha1-rW8wwTvs15cBDEaK+ndcDAprR/o= -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - 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-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-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -9511,17 +6429,14 @@ resolve-pathname@^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= - -resolve@^1.1.6, resolve@^1.3.2: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== +resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: - path-parse "^1.0.6" + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" @@ -9530,108 +6445,68 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.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== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -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" - -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -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" +rtl-detect@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" + integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +rtlcss@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" + integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== + dependencies: + find-up "^5.0.0" + picocolors "^1.0.0" + postcss "^8.3.11" + strip-json-comments "^3.1.1" run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -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= + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - aproba "^1.1.1" + queue-microtask "^1.2.2" -rxjs@^6.5.3, rxjs@^6.6.0, rxjs@^6.6.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== +rxjs@^7.5.4: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: - tslib "^1.9.0" + tslib "^2.1.0" 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: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.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: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -9644,16 +6519,16 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -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== +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" -schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -9662,15 +6537,25 @@ schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7 ajv "^6.12.4" ajv-keywords "^3.5.2" -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== +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: - "@types/json-schema" "^7.0.6" + "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -9684,12 +6569,12 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^1.10.7: - version "1.10.8" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" - integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== dependencies: - node-forge "^0.10.0" + node-forge "^1" semver-diff@^3.1.1: version "3.1.1" @@ -9703,46 +6588,46 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== +semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "~1.7.2" + http-errors "2.0.0" mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" + ms "2.1.3" + on-finished "2.4.1" 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" + statuses "2.0.1" -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -9773,32 +6658,17 @@ serve-index@^1.9.1: 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== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 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" + send "0.18.0" -setimmediate@^1.0.4, setimmediate@^1.0.5: +setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -9808,35 +6678,22 @@ setprototypeof@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" +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -shallow-clone@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060" - integrity sha1-WQnodLp3EG1zrEFM/sH/yofZcGA= +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: - is-extendable "^0.1.1" - kind-of "^2.0.1" - lazy-cache "^0.2.3" - mixin-object "^2.0.1" + kind-of "^6.0.2" -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" +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== shebang-command@^2.0.0: version "2.0.0" @@ -9845,155 +6702,106 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.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= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== -shelljs@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" - integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== +shelljs@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" interpret "^1.0.0" rechoir "^0.6.2" -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: - is-arrayish "^0.3.1" + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sitemap@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-3.2.2.tgz#3f77c358fa97b555c879e457098e39910095c62b" - integrity sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg== +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== dependencies: - lodash.chunk "^4.2.0" - lodash.padstart "^4.6.1" - whatwg-url "^7.0.0" - xmlbuilder "^13.0.0" + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +sitemap@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" + integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== + dependencies: + "@types/node" "^17.0.5" + "@types/sax" "^1.2.1" + arg "^5.0.0" + sax "^1.2.4" slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -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.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - 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" +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== dependencies: - faye-websocket "^0.10.0" - uuid "^3.4.0" - websocket-driver "0.6.5" - -sort-css-media-queries@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz#8f605ad372caad0b81be010311882c046e738093" - integrity sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw== + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" +sort-css-media-queries@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" + integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== 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-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-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@~0.5.12: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -10003,10 +6811,12 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" space-separated-tokens@^1.0.0: version "1.1.5" @@ -10034,34 +6844,13 @@ spdy@^4.0.2: 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" + spdy-transport "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -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" - -ssri@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.0.tgz#79ca74e21f8ceaeddfcb4b90143c458b8d988808" - integrity sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA== - dependencies: - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" @@ -10072,98 +6861,40 @@ state-toggle@^1.0.0: resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -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@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -std-env@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-2.2.1.tgz#2ffa0fdc9e2263e0004c1211966e960948a40f6b" - integrity sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ== - dependencies: - ci-info "^1.6.0" - -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== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" +std-env@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.1.1.tgz#1f19c4d3f6278c52efd08a94574a2a8d32b7d092" + integrity sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw== -string-width@^4.0.0, string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + strip-ansi "^6.0.1" -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== +string-width@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -string_decoder@^1.0.0, string_decoder@^1.1.1: +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== @@ -10186,42 +6917,35 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@6.0.0, strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.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= +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^2.0.0" + ansi-regex "^5.0.1" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== dependencies: - ansi-regex "^4.1.0" + ansi-regex "^6.0.1" strip-bom-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" integrity sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI= -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= - strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -10234,19 +6958,13 @@ style-to-object@0.3.0, style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" supports-color@^5.3.0: version "5.5.0" @@ -10255,196 +6973,104 @@ supports-color@^5.3.0: 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" - -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-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== + svg-parser@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^1.0.0, svgo@^1.2.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" +svgo@^2.5.0, svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" -tapable@^1.0.0, tapable@^1.1.3: +tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - -terser-webpack-plugin@^1.4.3: - 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" +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^4.1.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.2.tgz#d86200c700053bba637913fe4310ba1bdeb5568e" - integrity sha512-3qAQpykRTD5DReLu5/cwpsg7EZFzP3Q0Hp2XUWJUw2mpq2jfgOKTZr8IZKKnNieRVVo1UauROTdhbQJZveGKtQ== +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.3.0" - p-limit "^3.0.2" - schema-utils "^2.7.1" - serialize-javascript "^5.0.1" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" source-map "^0.6.1" - terser "^5.3.2" - webpack-sources "^1.4.3" - -terser@^4.1.2, terser@^4.6.3: - 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" + terser "^5.7.2" -terser@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.2.tgz#f4bea90eb92945b2a028ceef79181b9bb586e7af" - integrity sha512-H67sydwBz5jCUA32ZRL319ULu+Su1cAoZnnc+lXnenGRYWyLE3Scgkt8mNoAsMx0h5kdo758zdoS0LG9rYZXDQ== +terser@^5.10.0, terser@^5.7.2: + version "5.13.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== dependencies: + acorn "^8.5.0" commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + source-map "~0.8.0-beta.0" + source-map-support "~0.5.20" -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -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" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - 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.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - tiny-invariant@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" - integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + 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.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== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -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-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 sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -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-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -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" @@ -10452,20 +7078,15 @@ to-regex-range@^5.0.1: 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.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -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== +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== tr46@^1.0.1: version "1.0.1" @@ -10474,10 +7095,15 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + trim-trailing-lines@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94" - integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA== + version "1.1.4" + resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" + integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== trim@0.0.1: version "0.0.1" @@ -10489,37 +7115,22 @@ trough@^1.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== -tryer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" - integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tslib@^1.10.0, tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -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= +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^2.5.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.13.0.tgz#d1ecee38af29eb2e863b22299a3d68ef30d2abfb" + integrity sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw== -type-is@~1.6.17, type-is@~1.6.18: +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== @@ -10534,15 +7145,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -ua-parser-js@^0.7.18: - version "0.7.28" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" - integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== +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== unherit@^1.0.4: version "1.1.3" @@ -10552,28 +7158,28 @@ unherit@^1.0.4: inherits "^2.0.0" xtend "^4.0.0" -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== unified@9.2.0: version "9.2.0" @@ -10598,40 +7204,6 @@ unified@^8.4.2: trough "^1.0.0" vfile "^4.0.0" -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" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -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" - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -10645,14 +7217,14 @@ unist-builder@2.0.3, unist-builder@^2.0.0: integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== unist-util-generated@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.5.tgz#1e903e68467931ebfaea386dae9ea253628acd42" - integrity sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" + integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== unist-util-is@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" - integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== unist-util-position@^3.0.0: version "3.1.0" @@ -10667,9 +7239,9 @@ unist-util-remove-position@^2.0.0: unist-util-visit "^2.0.0" unist-util-remove@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.0.tgz#32c2ad5578802f2ca62ab808173d505b2c898488" - integrity sha512-HwwWyNHKkeg/eXRnE11IpzY8JT55JNM1YCwwU9YNCnfzk6s8GhPXrVBBZWiwLeATJbI7euvoGSzcy9M29UeW3g== + version "2.1.0" + resolved "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" + integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== dependencies: unist-util-is "^4.0.0" @@ -10681,14 +7253,14 @@ unist-util-stringify-position@^2.0.0: "@types/unist" "^2.0.2" unist-util-visit-parents@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz#4dd262fb9dcfe44f297d53e882fc6ff3421173d5" - integrity sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== dependencies: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.2: +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -10707,55 +7279,33 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -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== - -update-notifier@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.1.tgz#895fc8562bbe666179500f9f2cebac4f26323746" - integrity sha512-9y+Kds0+LoLG6yN802wVXoIfxYEwh3FlZwzMwpCZp62S2i1/Jzeqb9Eeeju3NSHccGGasfGlK5/vEHbAifYRDg== +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== dependencies: - boxen "^4.2.0" - chalk "^3.0.0" + boxen "^5.0.0" + chalk "^4.1.0" configstore "^5.0.1" has-yarn "^2.1.0" import-lazy "^2.1.0" is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" semver-diff "^3.1.1" xdg-basedir "^4.0.0" uri-js@^4.2.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" - integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + 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-loader@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" @@ -10772,65 +7322,29 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -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" +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== -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-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== -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== +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.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= -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -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" - -utila@^0.4.0, utila@~0.4: +utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= @@ -10845,10 +7359,10 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== value-equal@^1.0.1: version "1.0.1" @@ -10860,15 +7374,10 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -vfile-location@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.1.0.tgz#81cd8a04b0ac935185f4fce16f270503fc2f692f" - integrity sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g== +vfile-location@^3.0.0, vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== vfile-message@^2.0.0: version "2.0.4" @@ -10879,49 +7388,33 @@ vfile-message@^2.0.0: unist-util-stringify-position "^2.0.0" vfile@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.0.tgz#26c78ac92eb70816b01d4565e003b7e65a2a0e01" - integrity sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw== + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== dependencies: "@types/unist" "^2.0.0" is-buffer "^2.0.0" - replace-ext "1.0.0" unist-util-stringify-position "^2.0.0" vfile-message "^2.0.0" -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== - -wait-on@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-5.2.1.tgz#05b66fcb4d7f5da01537f03e7cf96e8836422996" - integrity sha512-H2F986kNWMU9hKlI9l/ppO6tN8ZSJd35yBljMLa1/vjzWP++Qh6aXyt77/u7ySJFZQqBtQxnvm/xgG48AObXcw== +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== dependencies: - axios "^0.21.1" - joi "^17.3.0" - lodash "^4.17.20" + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" minimist "^1.2.5" - rxjs "^6.6.3" - -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== - dependencies: - chokidar "^2.1.8" + rxjs "^7.5.4" -watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== dependencies: + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -10935,96 +7428,85 @@ web-namespaces@^1.0.0, web-namespaces@^1.1.2: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-bundle-analyzer@^3.6.1: - version "3.9.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c" - integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - bfj "^6.1.1" - chalk "^2.4.1" - commander "^2.18.0" - ejs "^2.6.1" - express "^4.16.3" - filesize "^3.6.1" - gzip-size "^5.0.0" - lodash "^4.17.19" - mkdirp "^0.5.1" - opener "^1.5.1" - ws "^6.0.0" - -webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" + schema-utils "^4.0.0" + +webpack-dev-server@^4.8.1: + version "4.9.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz#737dbf44335bb8bde68f8f39127fc401c97a1557" + integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" + sockjs "^0.3.21" spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" - -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-dev-middleware "^5.3.1" + ws "^8.4.2" -webpack-merge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== +webpack-merge@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: - lodash "^4.17.15" + clone-deep "^4.0.1" + wildcard "^2.0.0" -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -11032,57 +7514,52 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.44.1: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.72.0: + version "5.72.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13" + integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -webpackbar@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-4.0.0.tgz#ee7a87f16077505b5720551af413c8ecd5b1f780" - integrity sha512-k1qRoSL/3BVuINzngj09nIwreD8wxV4grcuhHTD8VJgUbGcy8lQSPqv+bM00B7F+PffwIsQ8ISd4mIwRbr23eQ== + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + +webpackbar@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" + integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - consola "^2.10.0" - figures "^3.0.0" + chalk "^4.1.0" + consola "^2.15.3" pretty-time "^1.1.0" - std-env "^2.2.1" - text-table "^0.2.0" - wrap-ansi "^6.0.0" - -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= - dependencies: - websocket-extensions ">=0.1.1" + std-env "^3.0.1" -websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -11096,10 +7573,13 @@ 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.4.1" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" - integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" whatwg-url@^7.0.0: version "7.1.0" @@ -11110,12 +7590,7 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -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.9, which@^1.3.1: +which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -11136,38 +7611,36 @@ widest-line@^3.1.0: dependencies: string-width "^4.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" - -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== dependencies: - microevent.ts "~0.1.1" + string-width "^5.0.1" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -wrap-ansi@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.0.1.tgz#2101e861777fec527d0ea90c57c6b03aac56a5b3" + integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -11183,12 +7656,15 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^6.0.0, ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" +ws@^7.3.1: + version "7.5.7" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" + integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== + +ws@^8.4.2: + version "8.6.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== xdg-basedir@^4.0.0: version "4.0.0" @@ -11202,59 +7678,25 @@ xml-js@^1.6.11: dependencies: sax "^1.2.4" -xmlbuilder@^13.0.0: - version "13.0.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-13.0.2.tgz#02ae33614b6a047d1c32b5389c1fdacb2bce47a7" - integrity sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ== - -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +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@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -yallist@^3.0.2: - version "3.1.1" - 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== -yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zwitch@^1.0.0: version "1.0.5" From 3b805b34b079c6d06ebb26b982fb36db0c729c2a Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 24 May 2022 20:52:43 -0700 Subject: [PATCH 034/245] Add versioned docs for zio-grpc 0.5.x --- .../versioned_docs/version-0.5.x/basics.md | 594 ++++++++++++++++++ .../versioned_docs/version-0.5.x/context.md | 175 ++++++ .../versioned_docs/version-0.5.x/deadlines.md | 106 ++++ .../version-0.5.x/decorating.md | 51 ++ .../version-0.5.x/generated-code.md | 177 ++++++ .../version-0.5.x/installation.md | 63 ++ website/versioned_docs/version-0.5.x/intro.md | 33 + .../version-0.5.x/quickstart.md | 137 ++++ .../versioned_docs/version-0.5.x/scala.js.md | 9 + .../version-0.5.x-sidebars.json | 54 ++ website/versions.json | 3 + 11 files changed, 1402 insertions(+) create mode 100644 website/versioned_docs/version-0.5.x/basics.md create mode 100644 website/versioned_docs/version-0.5.x/context.md create mode 100644 website/versioned_docs/version-0.5.x/deadlines.md create mode 100644 website/versioned_docs/version-0.5.x/decorating.md create mode 100644 website/versioned_docs/version-0.5.x/generated-code.md create mode 100644 website/versioned_docs/version-0.5.x/installation.md create mode 100644 website/versioned_docs/version-0.5.x/intro.md create mode 100644 website/versioned_docs/version-0.5.x/quickstart.md create mode 100644 website/versioned_docs/version-0.5.x/scala.js.md create mode 100644 website/versioned_sidebars/version-0.5.x-sidebars.json create mode 100644 website/versions.json diff --git a/website/versioned_docs/version-0.5.x/basics.md b/website/versioned_docs/version-0.5.x/basics.md new file mode 100644 index 000000000..8451d3575 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/basics.md @@ -0,0 +1,594 @@ +--- +title: Basics Tutorial +description: A basic tutorial introduction to ZIO gRPC +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/basics.md +--- + +This tutorial provides a basic introduction to Scala programmers to working with ZIO gRPC. + +By walking through this example you'll learn how to: + +- Define a service in a .proto file. +- Generate server and client code using ZIO gRPC code generator. +- Use ZIO gRPC API to write a simple client and server for your service. + +It assumes that you have read the [Introduction to +gRPC](https://grpc.io/docs/what-is-grpc/introduction/) and are familiar with +[protocol buffers](https://developers.google.com/protocol-buffers/docs/overview). Note +that the example in this tutorial uses the +proto3 version of the protocol buffers language: you can find out more in the [proto3 language +guide](https://developers.google.com/protocol-buffers/docs/proto3) and [ScalaPB +generated code +guide](https://scalapb.github.io/generated-code.html). + +## Why use gRPC? + +Our example is a simple route mapping application that lets clients get information about features on their route, create a summary of their route, and exchange route information such as traffic updates with the server and other clients. + +With gRPC we can define our service once in a `.proto` file and generate clients and servers in any of gRPC’s supported languages, which in turn can be run in environments ranging from servers inside a large data center to your own tablet — all the complexity of communication between different languages and environments is handled for you by gRPC. We also get all the advantages of working with protocol buffers, including efficient serialization, a simple IDL, and easy interface updating. + +## Example code and setup + +The example code for our tutorial is in +[scalapb/zio-grpc/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide](https://github.com/scalapb/zio-grpc/tree/master/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide). +To download the example, clone the latest release in `zio-grpc` repository by +running the following command: + +```bash +$ git clone -b v0.5.0 https://github.com/scalapb/zio-grpc.git +``` + +Then change your current directory to `zio-grpc/examples`: + +```bash +$ cd zio-grpc/examples/routeguide +``` + +## Defining the service + +Our first step (as you'll know from the [Introduction to gRPC](https://grpc.io/docs/what-is-grpc/introduction/)) is to +define the gRPC *service* and the method *request* and *response* types using +[protocol buffers](https://developers.google.com/protocol-buffers/docs/overview). You can see the complete .proto file in +[scalapb/zio-grpc/examples/src/main/protobuf/route_guide.proto](https://github.com/scalapb/zio-grpc/blob/master/examples/src/main/protobuf/route_guide.proto). + +ZIO gRPC generates code into the same Scala package that ScalaPB uses. Since `java_package` is +specified, the Scala package will be the `java_package` with the proto file name appended to it. In +this case, the package name would be `io.grpc.examples.routeguide.route_guide`. + +```protobuf +option java_package = "io.grpc.examples.routeguide"; +``` + +You can read more on how ScalaPB determines the Scala package name and how can this be customized +in [ScalaPB's documentation](https://scalapb.github.io/generated-code.html#default-package-structure). + +To define a service, we specify a named `service` in the .proto file: + +```protobuf +service RouteGuide { + ... +} +``` + +Then we define `rpc` methods inside our service definition, specifying their +request and response types. gRPC lets you define four kinds of service methods, +all of which are used in the `RouteGuide` service: + +- A *simple RPC* where the client sends a request to the server and waits for a response to come back. + + ```protobuf + // Obtains the feature at a given position. + rpc GetFeature(Point) returns (Feature) {} + ``` + +- A *server-side streaming RPC* where the client sends a request to the server + and gets a stream to read a sequence of messages back. The client reads from + the returned stream until there are no more messages. As you can see in our + example, you specify a server-side streaming method by placing the `stream` + keyword before the *response* type. + + ```protobuf + // Obtains the Features available within the given Rectangle. Results are + // streamed rather than returned at once (e.g. in a response message with a + // repeated field), as the rectangle may cover a large area and contain a + // huge number of features. + rpc ListFeatures(Rectangle) returns (stream Feature) {} + ``` + +- A *client-side streaming RPC* where the client sends a stream of messages + to the server. Once the client has finished writing the messages, + it waits for the server to read them all and return its response. + You specify a client-side streaming method by placing the `stream` keyword + before the *request* type. + + ```protobuf + // Accepts a stream of Points on a route being traversed, returning a + // RouteSummary when traversal is completed. + rpc RecordRoute(stream Point) returns (RouteSummary) {} + ``` + +- A *bidirectional streaming RPC* where both sides send a sequence of +messages. The two streams operate independently, so clients and servers can +read and write in whatever order they like: for example, the server could +wait to receive all the client messages before writing its responses, or it +could alternately read a message then write a message, or some other +combination of reads and writes. The order of messages in each stream is +preserved. You specify this type of method by placing the `stream` keyword +before both the request and the response. + ```protobuf + // Accepts a stream of RouteNotes sent while a route is being traversed, + // while receiving other RouteNotes (e.g. from other users). + rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} + ``` + +Our `.proto` file also contains protocol buffer message type definitions for all +the request and response types used in our service methods - for example, here's +the `Point` message type: + +```protobuf +// Points are represented as latitude-longitude pairs in the E7 representation +// (degrees multiplied by 10**7 and rounded to the nearest integer). +// Latitudes should be in the range +/- 90 degrees and longitude should be in +// the range +/- 180 degrees (inclusive). +message Point { + int32 latitude = 1; + int32 longitude = 2; +} +``` + +## Generating client and server code + +When you compile the application in SBT (using `compile`), an SBT plugin named +`sbt-protoc` invokes two code generators. The first code generator is ScalaPB +which generates case classes for all messages and some gRPC-related code that +ZIO-gRPC interfaces with. The second generator is ZIO gRPC code generator, which +generates a ZIO interface to your service. + +The following classes are generated from our service definition in `target/scala_2.13/src_managed`: + +- `Feature.scala`, `Point.scala`, `Rectangle.scala`, and others which contain all + the protocol buffer code to populate, serialize, and retrieve our request and + response message types. +- `ZioRouteGuide.scala` which contains (along with some other useful code): + - a base trait for `RouteGuide` servers to implement, + `ZioRouteGuide.ZRouteGuide`, with all the methods definitions in the + `RouteGuide` service. + - `ZioRouteGuide.RouteGuideClient`, contains ZIO accessor methods that clients can + use to talk to a `RouteGuide` server. + +## Creating the server + +First let's look at how we create a `RouteGuide` server. If you're only +interested in creating gRPC clients, you can skip this section and go straight +to [Creating the client](#creating-the-client) (though you might find it interesting +anyway!). + +There are two parts to making our `RouteGuide` service do its job: + +- Implementing the trait `ZRouteGuide` generated from our service definition: returning the + ZIO effects that do the actual "work" of our service. +- Putting an instance of ZRouteGuide behind a gRPC server to listen for requests from + clients and return the service responses. + +You can find our example `RouteGuide` server in +[scalapb/zio-grpc/examples/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala](https://github.com/scalapb/zio-grpc/blob/master/examples/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala). +Let's take a closer look at how it works. + +### Implementing ZRouteGuide + +As you can see, our server has a `RouteGuideService` class that extends the +generated `ZioRouteGuide.ZRouteGuide` base trait: + +```scala +class RouteGuideService( + features: Seq[Feature], + routeNotesRef: Ref[Map[Point, List[RouteNote]]] +) extends ZioRouteGuide.ZRouteGuide[ZEnv, Any] { +``` + +The trait `ZRouteGuide[R, Context]` takes two type parameters: +* `R` represents the environment. These can be dependencies that the server needs in order to do its job. In our example `R` is `ZEnv` which is ZIO's default environment which contains basic services such as `Clock` and `Console`. +* `Context` represents data that is unique to each request, for example, Metadata headers, or the identity of the user making the request. We will learn about `Context` in a future example. + +### Simple RPC + +`RouteGuideService` implements all our service methods. Let's +look at the simplest method first, `GetFeature()`, which just gets a `Point` from +the client and returns the corresponding feature information from its database +in a `Feature`. +```scala +def getFeature(request: Point): ZIO[ZEnv, Status, Feature] = + ZIO.fromOption(findFeature(request)).mapError(_ => Status.NOT_FOUND) +``` +```scala +def findFeature(point: Point): Option[Feature] = + features.find(f => f.getLocation == point && f.name.nonEmpty) +``` + +The `getFeature()` method takes the request (of type `Point`), and returns a ZIO +effect that represents the work of computing the response. The value that is returned represents +a suspended effect: nothing actually happens until ZIO runtime +ultimately runs the effect. The type of the effect is `ZIO[ZEnv, Status, Feature]` which means +it is a computation: +* can fail with value of type `Status` (this type comes from grpc-java and represents a gRPC status code). +* can succeed with value of type `Feature`. +* requires an environment of type `ZEnv` to run. + +In this case, our effect is built on top of a pure function `findFeature` that returns `Some(feature)` +if there is a feature in the database that corresponds to the given point, or `None` otherwise. + +We use `ZIO.fromOption` to turn the `Option[Feature]` into an effect of type `IO[Option[Nothing], Feature]` +which means that it can either succeed with a value of type `Feature` or fail with a value of type `Option[Nothing]` (the only possible value of this type is `None` since there are no instances of type `Nothing`). We +then use `mapError` to map the case of an error to gRPC's `NOT_FOUND` status. + +### Server-side streaming RPC + +Next let's look at one of our streaming RPCs. `ListFeatures` is a server-side +streaming RPC, so we need to send back multiple `Feature`s to our client. + +```scala +def listFeatures(request: Rectangle): ZStream[ZEnv, Status, Feature] = { + val left = request.getLo.longitude min request.getHi.longitude + val right = request.getLo.longitude max request.getHi.longitude + val top = request.getLo.latitude max request.getHi.latitude + val bottom = request.getLo.latitude min request.getHi.latitude + + ZStream.fromIterable( + features.filter { feature => + val lat = feature.getLocation.latitude + val lon = feature.getLocation.longitude + lon >= left && lon <= right && lat >= bottom && lat <= top + } + ) +} +``` + +Like the simple RPC, this method gets a request object (the `Rectangle` in which +our client wants to find `Feature`s) and returns a `ZStream[ZEnv, Status, Feature]`, which represents an effectful stream that can produce, provided an environment of type + `ZEnv` zero or more elements of type `Feature` and fail with a value of type of `Status`. + + This time, the stream does not need the environment and can not ever fail (since + our database is a constant in the same process!) + + We build the stream from a Scala collection we build by filtering through the features + sequence. ZIO gRPC takes over streaming the response to the client when the stream + gets executed. + +### Client-side streaming RPC + +Now let's look at something a little more complicated: the client-side streaming +method `RecordRoute()`, where we get a stream of `Point`s from the client and +return a single `RouteSummary` with information about their trip once the stream finishes. + +```scala +def recordRoute( + request: zio.stream.Stream[Status, Point] +): ZIO[Clock, Status, RouteSummary] = { + // Zips each element with the previous element, initially accompanied by None. + request.zipWithPrevious + .fold(RouteSummary()) { + case (summary, (maybePrevPoint, currentPoint)) => + // Compute the next status based on the current status. + summary.copy( + pointCount = summary.pointCount + 1, + featureCount = + summary.featureCount + (if (findFeature(currentPoint).isDefined) 1 + else 0), + distance = summary.distance + maybePrevPoint + .map(calcDistance(_, currentPoint)) + .getOrElse(0) + ) + } + .timed // returns a new effect that times the execution + .map { + case (duration, summary) => + summary.copy(elapsedTime = (duration.toMillis / 1000).toInt) + } +} +``` + +Here, our method gets a stream that is produced by the client. As you can see +from the signature of this method, our goal would be to turn this stream into an +effect that results in a `RouteSummary`. + +`RouteSummary` contains the number of points, number of features on the trip, total distance passed, and the time it took. As this summary can be built iteratively we use fold, which takes the summary and new input to compute the next summary. Since we are +adding up the distance between successive pair of points, we will use `zipWithPrevious` +that gives us a pair `(Option[Point], Point)` where the left element represents the previous element in the stream (which is initially None). + +The `fold` method gives us a `IO[Status, RouteSummary]`. Using the `timed` method we are getting a new ZIO effect that upon success gives us the a tuple `(zio.duration.Duration, RouteSummary)` where the duration represents the time it took to process +the effect thus far. We then use `map` to turn it back to a `RouteSummary` that contains the elapsed time in seconds. + +### Bidirectional streaming RPC + +Finally, let's look at our bidirectional streaming RPC `RouteChat()`. + +```scala +def routeChat( + request: zio.stream.Stream[Status, RouteNote] +): ZStream[ZEnv, Status, RouteNote] = + request.flatMap { note => + // By using flatMap, we can map each RouteNote we receive to a stream with + // the existing RouteNotes for that location, and those sub-streams are going + // to get concatenated. + // We start from an effect that updates the map with the new RouteNote, + // and returns the notes associated with the location just before the update. + val updateMapEffect: UIO[List[RouteNote]] = + routeNotesRef.modify { routeNotes => + val messages = routeNotes.getOrElse(note.getLocation, Nil) + (messages, routeNotes.updated(note.getLocation, note :: messages)) + } + // We create a stream from the effect. + ZStream.fromIterableM(updateMapEffect) + } +``` + +As with our client-side streaming example, we are getting a `Stream` of +`RouteNote`s, except this time we are also returning a stream of +`RouteNote`s. Although each side will always get the other's messages in the +order they were written, both the client and server can read and write in any +order — the streams operate completely independently. + +In this example, we are using `flatMap` on the incoming stream to map each input to a new +effectful stream representing the notes that are available in that location. We are using `Ref#modify` to mutate the collection of notes in the given location and return the list of notes available just prior to the update. + +## Starting the server + +Once we've implemented all our methods, we also need to start up a gRPC server +so that clients can actually use our service. The following snippet shows how we +do this for our `RouteGuide` service: + +```scala +object RouteGuideServer extends ServerMain { + override def port: Int = 8980 + + val featuresDatabase = JsonFormat.fromJsonString[FeatureDatabase]( + Source.fromResource("route_guide_db.json").mkString + ) + + val createRouteGuide = for { + routeNotes <- Ref.make(Map.empty[Point, List[RouteNote]]) + } yield new RouteGuideService(featuresDatabase.feature, routeNotes) + + def services: ServiceList[zio.ZEnv] = + ServiceList.addM(createRouteGuide) +} +``` + +ZIO gRPC provides a base trait to quickly set up gRPC services with zero boilerplate. + +1. We override the port we are going to use (default is 9000) +2. Create an effect that constructs an instance of our service (we need an effectful construction since + our service constructor takes a `zio.Ref`) +3. Override `def services` to return a `ServiceList` that contains our service. + +`ServerMain` is meant to be used for simple applications. If you need to do more in your initialization, you can take a look at the source code of `ServerMain` and customize. + +## Creating the client + +In this section, we'll look at creating a client for our `RouteGuide` +service. You can see our complete example client code in +[RouteGuideClientApp.scala](https://github.com/scalapb/zio-grpc/blob/master/examples/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala). + +### Instantiating a client + +To call service methods, we first need to create a client. There are two patterns +to work with clients: +- Use `RouteGuideClient.managed` to instantiate a client inside a `zio.ZManaged`. Then through calling its `use` method, the client can be accessed and method can be called on it. +- Use `RouteGuideClient.live` to create a `ZLayer` that can be used to provide a client as a singleton to our program through the environment. In that case, throughout the program we use accessor methods, defined statically in `RouteGuideClient` that expect the client to be available in the environment. + +Throughout this tutorial, we will follow the second pattern. We create a `Layer` that can provide a `RouteGuideClient` like this: + +```scala +val clientLayer: Layer[Throwable, RouteGuideClient] = + RouteGuideClient.live( + ZManagedChannel( + ManagedChannelBuilder.forAddress("localhost", 8980).usePlaintext() + ) + ) +``` + +### Calling service methods + +Now let's look at how we call our service methods. + +As described above, `RouteGuideClient` contains accessor methods for each RPC +that return an effect or a stream that needs a client in the environment to be ran: + +```scala +def getFeature(req: Point): + ZIO[RouteGuideClient, Status, Feature] + +def listFeatures(req: Rectangle): + ZStream[RouteGuideClient, Status, Feature] + +def recordRoute[R0](req: ZStream[R0, Status, Point]): + ZIO[RouteGuideClient with R0, Status, RouteSummary] + +def routeChat[R0](req: ZStream[R0, Status, RouteNote]): + ZStream[RouteGuideClient with R0, Status, RouteNote] +``` + +### Simple RPC +Calling the simple RPC `GetFeature` on the static accessor stub is as +straightforward as instantiating a local effect: + +```scala +def getFeature( + lat: Int, + lng: Int +): ZIO[RouteGuideClient with Console, Status, Unit] = + (for { + f <- RouteGuideClient.getFeature(Point(lat, lng)) + _ <- putStrLn(s"""Found feature called "${f.name}".""") + } yield ()).catchSome { + case status if status == Status.NOT_FOUND => + putStrLn(s"Feature not found: ${status.toString()}") + } +``` + +We create and populate a request protocol buffer object (in our case +`Point`), pass it to the `getFeature()` method on our accessor, and get +back an effect that needs a `RouteGuideClient` environment. We chain +the response with a call to `putStrLn` to print the result on the console, +and we catch the `NOT_FOUND` response and print an error. All other errors +are not handled at this level and will "bubble up" up to the program's `exitCode` handler. + +### Server-side streaming RPC + +Next, let's look at a server-side streaming call to `ListFeatures`, which +returns a stream of geographical `Feature`s: + +```scala +_ <- + RouteGuideClient + .listFeatures( + Rectangle( + lo = Some(Point(400000000, -750000000)), + hi = Some(Point(420000000, -730000000)) + ) + ) + .zipWithIndex + .foreach { + case (feature, index) => + putStrLn(s"Result #${index + 1}: $feature") + } +``` + +Now `listFeatures` returns a `ZStream`. We use `zipWithIndex` to get a stream +where each of the original elements are accompanied with a zero-based index. We turn +this stream into a single effect that processes the entire stream by calling `foreach` + and providing it with a function that maps each element into an effect. In this case, + the effect prints the feature. + +### Client-side streaming RPC +Now for something a little more complicated: the client-side streaming method +`RecordRoute`, where we send a stream of `Point`s to the server and get back +a single `RouteSummary`. + +```scala +def recordRoute(numPoints: Int) = + for { + summary <- RouteGuideClient.recordRoute( + ZStream + .repeatEffect( + nextIntBetween(0, features.size).map(features(_).getLocation) + ) + .tap(p => putStrLn(s"Visiting (${p.latitude}, ${p.longitude})")) + .schedule(Schedule.spaced(300.millis)) + .take(numPoints) + ) + _ <- putStrLn( + s"Finished trip with ${summary.pointCount} points. " + + s"Passed ${summary.featureCount} features. " + + s"Travelled ${summary.distance} meters. " + + s"It took ${summary.elapsedTime} seconds." + ) + } yield () +``` + +Here, we pass into `recordRoute` an effectful stream that randomly picks an element from the `features` collection (a constant), and insert random delay between elements. + +Like all the other accessor methods it's worth noting that no side effect happens upon calling `recordRoute`. The method returns immediately giving us an effect that represents sending this stream to the server. When the effect ultimately run it can succeed with a value of type `RouteSummary` once the entire stream has been sent to the server. + +In this example, we chain to this effect an effect to print the summary to the console. + +### Bidirectional streaming RPC +Finally, let's look at our bidirectional streaming RPC `RouteChat()`. + +```scala +val routeChat = + for { + res <- + RouteGuideClient + .routeChat( + ZStream( + RouteNote( + location = Some(Point(0, 0)), + message = "First message" + ), + RouteNote( + location = Some(Point(0, 10_000_000)), + message = "Second Message" + ), + RouteNote( + location = Some(Point(10_000_000, 0)), + message = "Third Message" + ), + RouteNote( + location = Some(Point(10_000_000, 10_000_000)), + message = "Four Message" + ) + ).tap { note => + putStrLn( + s"""Sending message "${note.message}" at ${note.getLocation.latitude}, ${note.getLocation.longitude}""" + ) + } + ) + .foreach { note => + putStrLn( + s"""Got message "${note.message}" at ${note.getLocation.latitude}, ${note.getLocation.longitude}""" + ) + } + } yield () +``` + +In this method, we both get and return a `Stream` of +RouteNotes. Here both streams execute independently at the same time. Although each side will always +get the other's messages in the order they were written, both the client and +server can read and write in any order — the streams operate completely +independently. + +### Providing the client layer into the application logic + +All the effects we created were dependent on a `RouteGuideClient` available in the environment. We earlier instantiated a `clientLayer`, so we can provide it to our application logic at the top-level (the `run` method): + +```scala +val myAppLogic = + for { + // Looking for a valid feature + _ <- getFeature(409146138, -746188906) + // Looking for a missing feature + _ <- getFeature(0, 0) + + // Calls listFeatures with a rectangle of interest. Prints + // each response feature as it arrives. + // start: listFeatures + _ <- + RouteGuideClient + .listFeatures( + Rectangle( + lo = Some(Point(400000000, -750000000)), + hi = Some(Point(420000000, -730000000)) + ) + ) + .zipWithIndex + .foreach { + case (feature, index) => + putStrLn(s"Result #${index + 1}: $feature") + } + // end: listFeatures + + _ <- recordRoute(10) + + _ <- routeChat + } yield () + +final def run(args: List[String]) = + myAppLogic.provideCustomLayer(clientLayer).exitCode +``` + +## Try it out! + +1. Run the server: + ```bash + sbt "runMain zio_grpc.examples.routeguide.RouteGuideServer" + ``` + +2. From another terminal, run the client: + ```bash + sbt "runMain zio_grpc.examples.routeguide.RouteGuideClientApp" + ``` + +:::note +This document, "ZIO gRPC: Basics Tutorial", is a derivative of ["gRPC – Basics Tutorial"](https://grpc.io/docs/languages/java/basics/) by [gRPC Authors](https://grpc.io/), used under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0). "ZIO gRPC: Basics Tutorial" is licensed under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0) by Nadav Samet. +::: diff --git a/website/versioned_docs/version-0.5.x/context.md b/website/versioned_docs/version-0.5.x/context.md new file mode 100644 index 000000000..320fd95ae --- /dev/null +++ b/website/versioned_docs/version-0.5.x/context.md @@ -0,0 +1,175 @@ +--- +title: Context and Dependencies +sidebar_label: Context and Dependencies +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/context.md +--- + +When implementing a server, ZIO gRPC allows you to specify that your service +depends on an environment of type `R` and a context of type `Context`. + +`Context` and `R` can be of any Scala type, however when they are not `Any` they have to be wrapped in an `Has[]`. This allows ZIO gRPC to combine two values (`Context with R`) when providing the values at effect execution time. + +For example, we can define a service for which the effects depend on `Console`, and for each request we expect to get a context of type `User`. Note that `Console` is a type-alias to `Has[Console.Service]` so there is no need wrap it once more in an `Has`. + +```scala +import zio.{Has, ZIO} +import zio.console._ +import scalapb.zio_grpc.RequestContext +import myexample.testservice.ZioTestservice.ZSimpleService +import myexample.testservice.{Request, Response} +import io.grpc.Status + +case class User(name: String) + +object MyService extends ZSimpleService[Console, Has[User]] { + def sayHello(req: Request): ZIO[Console with Has[User], Status, Response] = + for { + user <- ZIO.service[User] + _ <- putStrLn("I am here!").orDie + } yield Response(s"Hello, ${user.name}") +} +``` + +As you can see above, we can access both the `User` and the `Console` in our effects. If one of the methods does not need to access the dependencies or context, the returned type from the method can be cleaned up to reflect that certain things are not needed. + +## Context transformations + +In order to be able to bind our service to a gRPC server, we need to have the +service's Context type to be one of the supported types: +* `Has[scalapb.zio_grpc.RequestContext]` +* `Has[scalapb.zio_grpc.SafeMetadata]` +* `Any` + +The service `MyService` as defined above expects `Has[User]` as a context. In order to be able to bind it, we will transform it into a service that depends on a context of type `Has[RequestContext]`. To do this, we need to provide the function to produce a `User` out of a `RequestContext`. This way, when a request comes in, ZIO gRPC can take the `RequestContext` (which is request metadata such as headers and options), and use our function to construct a `User` and provide it into the environment of our original service. + +In many typical cases, we may need to retrieve the user from a database, and thus we are using an effectful function `RequestContext => IO[Status, User]` to find the user. + +For example, we can provide a function that returns an effect that always succeeds: + +```scala +val fixedUserService = + MyService.transformContextM((rc: RequestContext) => ZIO.succeed(User("foo"))) +// fixedUserService: ZSimpleService[Console, Has[RequestContext]] = myexample.testservice.ZioTestservice$ZSimpleService$$anon$6$$anon$7@5d50c6f9 +``` + +and we got our service, which still depends on an environment of type `Console`, however the context is now `Has[RequestContext]` so it can be bound to a gRPC server. + +### Accessing metadata + +Here is how we would extract a user from a metadata header: +```scala +import zio.IO +import scalapb.zio_grpc.{ServiceList, ServerMain} + +val UserKey = io.grpc.Metadata.Key.of( + "user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) +// UserKey: io.grpc.Metadata.Key[String] = Key{name='user-key'} + +def findUser(rc: RequestContext): IO[Status, User] = + rc.metadata.get(UserKey).flatMap { + case Some(name) => IO.succeed(User(name)) + case _ => IO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + } + +val rcService = + MyService.transformContextM(findUser) +// rcService: ZSimpleService[Console, Has[RequestContext]] = myexample.testservice.ZioTestservice$ZSimpleService$$anon$6$$anon$7@6e4166f6 + +object MyServer extends ServerMain { + def services = ServiceList.add(rcService) +} +``` + +### Depending on a service + +A context transformation may introduce a dependency on another service. For example, you +may want to organize your code such that there is a `UserDatabase` service that provides +a `fetchUser` effect that retrieves users from a database. Here is how you can do this: + +```scala +type UserDatabase = Has[UserDatabase.Service] +object UserDatabase { + trait Service { + def fetchUser(name: String): IO[Status, User] + } + + // accessor + def fetchUser(name: String): ZIO[UserDatabase, Status, User] = + ZIO.accessM[UserDatabase](_.get.fetchUser(name)) + + val live = zio.ZLayer.succeed( + new Service { + def fetchUser(name: String): IO[Status, User] = + IO.succeed(User(name)) + }) +} +``` + +Now, +The context transformation effect we apply may introduce an additional environmental dependency to our service. For example: +```scala +import zio.clock._ +import zio.duration._ + +val myServiceAuthWithDatabase = + MyService.transformContextM { + (rc: RequestContext) => + rc.metadata.get(UserKey) + .someOrFail(Status.UNAUTHENTICATED) + .flatMap(UserDatabase.fetchUser) + } +// myServiceAuthWithDatabase: ZSimpleService[Console with UserDatabase, Has[RequestContext]] = myexample.testservice.ZioTestservice$ZSimpleService$$anon$6$$anon$7@46db627e +``` + +And now our service not only depends on a `Console`, but also on a `UserDatabase`. + +## Using a service as ZLayer +We can turn our service into a ZLayer: + +```scala +val myServiceLive = myServiceAuthWithDatabase.toLayer +// myServiceLive: zio.ZLayer[Console with UserDatabase, Nothing, Has[ZSimpleService[Any, Has[RequestContext]]]] = Managed( +// self = zio.ZManaged$$anon$2@15f00ea8 +// ) +``` + +notice how the dependencies moved to the input side of the `Layer` and the resulting layer is of +type `ZSimpleService[Any, Has[RequestContext]]]`, which means no environment is expected, and it assumes +a `Has[RequestContext]` context. To use this layer in an app, we can wire it like so: + +```scala +import scalapb.zio_grpc.ServerLayer + +val serverLayer = + ServerLayer.fromServiceLayer( + io.grpc.ServerBuilder.forPort(9000) + )(myServiceLive) +// serverLayer: zio.ZLayer[Console with UserDatabase, Throwable, Has[scalapb.zio_grpc.Server.Service]] = Fold( +// self = Managed(self = zio.ZManaged$$anon$2@15f00ea8), +// failure = Managed(self = zio.ZManaged$$anon$2@25f715d6), +// success = Managed(self = zio.ZManaged$$anon$2@3fcc59f7) +// ) + +val ourApp = (UserDatabase.live ++ Console.any) >>> + serverLayer +// ourApp: zio.ZLayer[Any with Console, Throwable, Has[scalapb.zio_grpc.Server.Service]] = Fold( +// self = ZipWithPar( +// self = Managed(self = zio.ZManaged$$anon$2@519de9b2), +// that = Managed(self = zio.ZManaged$$anon$2@64403fed), +// f = zio.ZLayer$$Lambda$16816/0x0000000803ee6040@2bba085b +// ), +// failure = Managed(self = zio.ZManaged$$anon$2@54989ce3), +// success = Fold( +// self = Managed(self = zio.ZManaged$$anon$2@15f00ea8), +// failure = Managed(self = zio.ZManaged$$anon$2@25f715d6), +// success = Managed(self = zio.ZManaged$$anon$2@3fcc59f7) +// ) +// ) + +object LayeredApp extends zio.App { + def run(args: List[String]) = ourApp.build.useForever.exitCode +} +``` + +`serverLayer` wraps around our service layer to produce a server. Then, `ourApp` layer is constructed such that it takes `UserDatabase.live` in conjuction to a passthrough layer for `Console` to satisfy the two input requirements of `serverLayer`. The outcome, `ourApp`, is a `ZLayer` that can produce a `Server` from a `Console`. In the `run` method we build the layer and run it. Note that we are directly using a `zio.App` rather than `ServerMain` which does +not support this use case yet. diff --git a/website/versioned_docs/version-0.5.x/deadlines.md b/website/versioned_docs/version-0.5.x/deadlines.md new file mode 100644 index 000000000..93423f232 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/deadlines.md @@ -0,0 +1,106 @@ +--- +title: ZIO gRPC and Deadlines +description: Setting deadlines with ZIO gRPC +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/deadlines.md +--- + +When you use a gRPC it is [a very important to set deadlines](https://grpc.io/blog/deadlines/). +In gRPC, deadlines are absolute timestamps that tell our system when the response of an RPC call is +no longer needed. The deadline is sent to the server, and the computation is automatically interrupted +when the deadline is exceeded. The client call automatically ends with a `Status.DEADLINE_EXCEEDED` error. + +When you don't specify a deadline, client requests never timeout. All in-flight requests take +resources on the server, and possibly upstream servers, which can ultimately hurt latency or crash +the entire process. + +In ZIO gRPC you can easily set deadlines (absolute timestamps), or timeouts which are relative to +the time the outbound call is made. + +## Setting timeout for all requests + +To set the same timeout for all requests, it is possible to provide an effect that produces `CallOptions` +when constructing the client. This effect is invoked before each request, and can determine the deadline +relative to the system clock at the time the effect is executed. + +```scala +import myexample.testservice.ZioTestservice.ServiceNameClient +import myexample.testservice.{Request, Response} +import scalapb.zio_grpc.{ZManagedChannel, SafeMetadata} +import io.grpc.ManagedChannelBuilder +import io.grpc.CallOptions +import java.util.concurrent.TimeUnit +import zio._ +import zio.console._ + +val channel = ZManagedChannel( + ManagedChannelBuilder + .forAddress("localhost", 8980) + .usePlaintext() +) +// channel: ZManagedChannel[Any] = zio.ZManaged$$anon$2@255dfc3d + +// create layer: +val clientLayer = ServiceNameClient.live( + channel, + options=ZIO.effectTotal( + CallOptions.DEFAULT.withDeadlineAfter(3000, TimeUnit.MILLISECONDS)), + headers=SafeMetadata.make) +// clientLayer: ZLayer[Any, Throwable, Has[ServiceNameClient.ZService[Any, Any]]] = Managed( +// self = zio.ZManaged$$anon$2@318ff46a +// ) + +val myAppLogicNeedsEnv = for { + // use layer through accessor methods: + res <- ServiceNameClient.unary(Request()) + _ <- putStrLn(res.toString) +} yield () +// myAppLogicNeedsEnv: ZIO[Has[ServiceNameClient.ZService[Any, Any]] with Any with Console, Object, Unit] = zio.ZIO$FlatMap@1f020e5d +``` + +## Setting timeout for each request + +As in the previous example, assuming there is a client in the environment, we can set the timeout +for each request like this: + +```scala +ServiceNameClient.withTimeoutMillis(3000).unary(Request()) +// res0: ZIO[Has[ServiceNameClient.ZService[Any, Any]] with Any, io.grpc.Status, Response] = zio.ZIO$Read@32d8914a +``` + +Clients provide (through the `CallOptionsMethods` trait) a number of methods that make it possible +to specify a deadline or a timeout for each request: + +```scala +// Provide a new absolute deadline +def withDeadline(deadline: Deadline): Service + +// Sets a new timeout for this service +def withTimeout(duration: zio.duration.Duration): Service + +// Sets a new timeout in millis +def withTimeoutMillis(millis: Long): Service + +// Replace the call options with the provided call options +def withCallOptions(callOptions: CallOptions): Service + +// Effectfully update the CallOptions for this service +def mapCallOptionsM(f: CallOptions => zio.IO[Status, CallOptions]): Service +``` + +If you are using a client instance, the above methods are available to provide you with a new +client that has a modified `CallOptions` effect. Making the copy of those clients is cheap and can +be safely done for each individual call: + +```scala +val clientManaged = ServiceNameClient.managed(channel) +// clientManaged: Managed[Throwable, ServiceNameClient.ZService[Any, Any]] = zio.ZManaged$$anon$2@168ab14e + +val myAppLogic = for { + res <- clientManaged.use( + client => + client.withTimeoutMillis(3000).unary(Request()) + .mapError(_.asRuntimeException) + ) +} yield res +// myAppLogic: ZIO[Any with Any, Throwable, Response] = zio.ZIO$FlatMap@2be1bc9f +``` diff --git a/website/versioned_docs/version-0.5.x/decorating.md b/website/versioned_docs/version-0.5.x/decorating.md new file mode 100644 index 000000000..1e8c0cc59 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/decorating.md @@ -0,0 +1,51 @@ +--- +title: Decorating services +description: Transformation of an effect or a stream. +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/decorating.md +--- + +When implementing a server, sometimes you might want to decorate all methods (effects or streams) +in the service, for example to add access and error logging. + +It can be done with the help of `ZTransform`. Instances of this class can be used +to apply a transformation to all methods of a service to generate a new "decorated" service. +This can be used for pre- or post-processing of requests/responses and also for environment +and context transformations. + +We define decoration: + +```scala +import io.grpc.Status +import scalapb.zio_grpc.{ RequestContext, ZTransform } +import zio._ +import zio.stream.ZStream + +class LoggingTransform[R] extends ZTransform[R, Status, R with Has[RequestContext]] { + + def logCause(cause: Cause[Status]): URIO[Has[RequestContext], Unit] = ??? + + def accessLog: URIO[Has[RequestContext], Unit] = ??? + + override def effect[A](io: ZIO[R, Status, A]): ZIO[R with Has[RequestContext], Status, A] = + io.zipLeft(accessLog).tapCause(logCause) + + override def stream[A](io: ZStream[R, Status, A]): ZStream[R with Has[RequestContext], Status, A] = + (io ++ ZStream.fromEffect(accessLog).drain).onError(logCause) +} +``` + +and then we apply it to our service: + +```scala +import myexample.testservice.ZioTestservice.ZSimpleService +import myexample.testservice.{Request, Response} + +object MyService extends ZSimpleService[Any, Any] { + def sayHello(req: Request): ZIO[Any, Status, Response] = + ZIO.succeed(Response(s"Hello user")) +} + +val decoratedService = + MyService.transform(new LoggingTransform[Any]) +// decoratedService: ZSimpleService[Has[RequestContext], Any] = myexample.testservice.ZioTestservice$ZSimpleService$$anon$6$$anon$7@67739b99 +``` \ No newline at end of file diff --git a/website/versioned_docs/version-0.5.x/generated-code.md b/website/versioned_docs/version-0.5.x/generated-code.md new file mode 100644 index 000000000..81298ef24 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/generated-code.md @@ -0,0 +1,177 @@ +--- +title: Generated Code Reference +sidebar_label: Generated code +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/generated-code.md +--- + +## Packages and code location + +For each proto file that contains services definition, ZIO gRPC generates a Scala +object that will contain service definitions for all services in that file. The +object name would be the proto file name prefixed with `Zio`. It would reside in the same Scala package that ScalaPB will use for definitions in that file. + +You can read more on how ScalaPB determines the Scala package name and how can this be customized in [ScalaPB's documentation](https://scalapb.github.io/generated-code.html#default-package-structure). + +## Service trait + +Inside the object, for each service `ServiceName` that is defined in a `.proto` file, the following structure is generated: + +```scala +trait ZServiceName[R, Context] { + // methods for each RPC + def sayHello(request: HelloRequest): + ZIO[R with Context, Status, HelloReply] +} +type ServiceName = ZServiceName[Any, Any] +``` + +The trait `ZServiceName` is to be extended when implementing a server for this service. The trait takes two type parameters: `R` and `Context`: + +* `R` representes the dependencies of the service. All the effects being returned by these methods depend on `R` to encode this dependency. +* `Context` represents any domain object that you would like your RPC methods to have available in the environment. + +You can set both `R` and `Context` to be `Any` when implementing a service to indicate that the service does not have any dependencies or expectations from the environment. Since it is very common situation, especially when getting started, you can have your service implementation extends `ServiceName` which is a type alias to `ZServiceName[Any, Any]`: + + +```scala +trait ServiceNameImpl extends ServiceName { +} +``` + +Learn more about using [context and dependencies](context.md) in the next section. + +:::info +**Why `Any` means that there are no dependencies?** All Scala objects are instances of `Any`. Therefore, any object that is provided as a dependency to our service would satisfy being of type `Any`. In other words, there is no specific instance type required. +::: + +### Running the server + +The easiest way to run a service, is to create an object that extends `scalapb.zio_grpc.ServerMain`: + +```scala +import scalapb.zio_grpc.{ServerMain, ServiceList} + +object MyMain extends ServerMain { + def services = ServiceList.add(ServiceNameImpl) + + // Default port is 9000 + override def port: Int = 8980 +} +``` + +You can also override `def port: Int` to set a port number (by default port 9000 is used). + +`ServiceList` contains additional methods to add services to the service list that can be used when the service must be created effectfully, or wrapped in a managed, or provided to you as a layer. + +## Client trait + +The generated client follows [ZIO's module pattern](https://zio.dev/docs/howto/howto_use_layers): + +```scala +type ServiceNameClient = Has[ServiceNameClient.Service] +object ServiceNameClient { + trait ZService[R] { + // methods for use as a client + def sayHello(request: HelloRequest): + ZIO[R, Status, HelloReply] + } + type Service = ZService[Any] + + // accessor methods + def sayHello(request: HelloRequest): + ZIO[ServiceNameClient, Status, HelloReply] + + def managed[R]( + managedChannel: ZManagedChannel[R], + options: CallOptions = + io.grpc.CallOptions.DEFAULT, + headers: zio.UIO[SafeMetadata] = + scalapb.zio_grpc.SafeMetadata.make + ): zio.Managed[Throwable, ZService[R]] + + def live[R]( + managedChannel: ZManagedChannel[R], + options: CallOptions = + io.grpc.CallOptions.DEFAULT, + headers: zio.UIO[scalapb.zio_grpc.SafeMetadata] = + scalapb.zio_grpc.SafeMetadata.make + ): zio.ZLayer[R, Throwable, ServiceNameClient] +} +``` + +We have two ways to use a client: through a managed resource, or through a layer. In both cases, we start by creating a `ZManagedChannel`, which represents a communication channel to a gRPC server as a managed resource. Since it is wrapped in [ZIO's `Managed`](https://zio.dev/docs/datatypes/datatypes_managed), proper shutdown of the channel is guaranteed: + +```scala +type ZManagedChannel[R] = Managed[Throwable, ZChannel[R]] +``` + +Creating a channel: +```scala +import scalapb.zio_grpc.ZManagedChannel +import io.grpc.ManagedChannelBuilder + +val channel = ZManagedChannel( + ManagedChannelBuilder + .forAddress("localhost", 8980) + .usePlaintext() +) +// channel: ZManagedChannel[Any] = zio.ZManaged$$anon$2@69497154 +``` + +### Using the client as a layer + +A single `ZManagedChannel` represent a virtual connection to a conceptual endpoint to perform RPCs. A channel can have many actual connection to the endpoint. Therefore, it is very common to have a single service client for each RPC service you need to connect to. You can create a `ZLayer` to provide this service using the `live` method on the client companion object. Then simply write your logic using the accessor methods. Finally, inject the layer using `provideCustomLayer` at the top of your app: + +```scala +import myexample.testservice.ZioTestservice.ServiceNameClient +import myexample.testservice.{Request, Response} +import zio._ +import zio.console._ + +// create layer: +val clientLayer = ServiceNameClient.live(channel) +// clientLayer: ZLayer[Any, Throwable, Has[ServiceNameClient.ZService[Any, Any]]] = Managed( +// self = zio.ZManaged$$anon$2@25f8138d +// ) + +val myAppLogicNeedsEnv = for { + // use layer through accessor methods: + res <- ServiceNameClient.unary(Request()) + _ <- putStrLn(res.toString) +} yield () +// myAppLogicNeedsEnv: ZIO[Has[ServiceNameClient.ZService[Any, Any]] with Any with Console, Object, Unit] = zio.ZIO$FlatMap@2aacd69 + +// myAppLogicNeedsEnv needs access to a ServiceNameClient. We turn it into +// a self-contained effect (IO) by providing the layer to it: +val myAppLogic1 = myAppLogicNeedsEnv.provideCustomLayer(clientLayer) +// myAppLogic1: ZIO[ZEnv, Object, Unit] = zio.ZIO$CheckInterrupt@71b27fca + +object LayeredApp extends zio.App { + def run(args: List[String]): URIO[ZEnv, ExitCode] = myAppLogic1.exitCode +} +``` + +Here the application is broken to multiple value assignments so you can see the types. +The first effect `myAppLogicNeedsEnv` uses accessor functions, which makes it depend on an environment of type `ServiceNameClient`. It chains the `unary` RPC with printing the result to the console, and hence the final inferred effect type is `ServiceNameClient with Console`. Once we provide our custom layer, the effect type is `ZEnv`, which we can use with ZIO's run method. + +### Using a Managed Client + +As an alternative to using ZLayer, you can use the client through a managed resource: + +```scala +import myexample.testservice.ZioTestservice.ServiceNameClient +import myexample.testservice.{Request, Response} + +val clientManaged = ServiceNameClient.managed(channel) +// clientManaged: Managed[Throwable, ServiceNameClient.ZService[Any, Any]] = zio.ZManaged$$anon$2@66c5251c + +val myAppLogic = for { + res <- clientManaged.use( + client => + client.unary(Request()).mapError(_.asRuntimeException) + ) +} yield res +// myAppLogic: ZIO[Any with Any, Throwable, Response] = zio.ZIO$FlatMap@1a4cd330 +``` + +Since the service acquistion (through the ZManaged) can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. \ No newline at end of file diff --git a/website/versioned_docs/version-0.5.x/installation.md b/website/versioned_docs/version-0.5.x/installation.md new file mode 100644 index 000000000..3e473d5d2 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/installation.md @@ -0,0 +1,63 @@ +--- +title: Installing ZIO gRPC +sidebar_label: Installing +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/installation.md +--- + +## Determining the right version + +The version of zio-grpc needs to be compatible with the version of ScalaPB in order to +avoid unintended evictions and ensure binary compatibility: + +| ScalaPB | ZIO gRPC | +| --------- |-----------------| +| 0.11.x | 0.5.x | +| 0.10.x | 0.4.x | + +## Installation using SBT (Recommended) + +If you are building with sbt, add the following to your `project/plugins.sbt`: + +```scala +addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") + +libraryDependencies += + "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % "0.5.0" +``` + +Then, add the following lines to your `build.sbt`: + +```scala +PB.targets in Compile := Seq( + scalapb.gen(grpc = true) -> (sourceManaged in Compile).value / "scalapb", + scalapb.zio_grpc.ZioCodeGenerator -> (sourceManaged in Compile).value / "scalapb" +) + +libraryDependencies ++= Seq( + "io.grpc" % "grpc-netty" % "1.41.0", + "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion +) +``` + +This configuration will set up the ScalaPB code generator alongside the ZIO gRPC code generator. +Upon compilation, the source generator will process all proto files under `src/main/protobuf`. +The ScalaPB generator will generate case classes for all messages as well as methods to serialize and deserialize those messages. The ZIO gRPC code generator will generate code as described in the [generated code section](generated-code.md). + +## Generating code using ScalaPBC (CLI) + +:::note See [installation instructions for ScalaPBC](http://scalapb.github.io/scalapbc.html). +::: + +If you are using ScalaPBC to generate Scala code from the CLI, you can invoke the zio code generator like this: + +```bash +scalapbc \ +--plugin-artifact=com.thesamet.scalapb.zio-grpc:protoc-gen-zio:0.5.0:default,classifier=unix,ext=sh,type=jar\ +-- e2e/src/main/protobuf/service.proto --zio_out=/tmp/out --scala_out=grpc:/tmp/out \ +-Ie2e/src/main/protobuf -Ithird_party -Iprotobuf +``` + +You will need to add to your project the following libraries: +* `com.thesamet.scalapb::scalapb-runtime-grpc:0.11.8` +* `com.thesamet.scalapb.zio-grpc:zio-grpc-core:0.5.0` +* `io.grpc:grpc-netty:1.41.0` diff --git a/website/versioned_docs/version-0.5.x/intro.md b/website/versioned_docs/version-0.5.x/intro.md new file mode 100644 index 000000000..12e7bdfa0 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/intro.md @@ -0,0 +1,33 @@ +--- +title: Introduction +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/intro.md +--- + +ZIO-gRPC lets you write purely functional gRPC servers and clients. It is built on top of [ZIO](https://zio.dev/), a library for asynchronous and concurrent functional programming in Scala. + +## Highlights +* Supports all types of RPCs (unary, client streaming, server streaming, bidirectional). +* Cancellable RPCs: easily cancel RPCs by calling `interrupt` on the effect. Server will immediately abort execution. +* Scala.js support: call your service from Scala code running on the browser. + +## Why ZIO gRPC? + +One of the advantages of a microservice architecture is the ability to write different microservices using different technogies. ZIO gRPC might be a great choice for your project if you value: +* **Type-safety**: Your business logic and the data types are checked at compile time. +* **Resource safety**: Managed resources (such as database connections) are guaranteed to be released. +* **Reusable behaviors**: Create complex behaviors by easily combining basic building blocks. For example: + * Exponential backoff, is a `retry` method call that gets an exponential schedule as a parameter. + * Sending a few identical requests to a number of servers and waiting only until the first response. + * Sending different requests in parallel and collecting all the results as a list. +* **Living on the edge**: Yes, this is a word of warning. Both ZIO and ZIO gRPC are new technologies. While a lot of effort has been put to test, it is possible that you will encounter bugs. For ZIO gRPC, APIs may change between minor releases without notice. + +## Effects as pure values + +In ZIO gRPC, the services you will write will be purely functional. When a client makes an RPC call to your service, a "handler" method in your service will be invoked. In contrast to imperative programming, instead of actually handling the call, this handler method will return a pure immutable value of type `ZIO`. This value, on its own, doesn't do anything - it represents the work that needs to get done to fulfill the request, for example: reading from a database, making a network call, or calling a local function. ZIO's runtime is going to run the effect immediately after you return it. As you will see, structuring your program by combining functional effects will lead to reusable code that is easier to reason about and more likely to be correct once you get it to compile. + +There are also technical advantages: in case the client aborts the request, ZIO gRPC can interrupt the server computation even if the server is executing an effect that is unrelated to ZIO gRPC (in grpc-java for example, this can only be accomplished by the server occassionally checking for a cancellation). Using ZIO building blocks such as `ZIO.bracket`, `ZIO#onExit`, `ZIO.uninterruptible` you remain in control over the behavior of the program in case of interruptions. + +# Try it out + +* Got 5 to 10 more minutes? Check out our [Quick Start tutorial](quickstart.md). You will clone an existing ZIO gRPC client and a server. You will run them and add a new RPC method. +* Got up to an hour? Take a look at the [Basics tutorial](basics.md). You will learn how to implement gRPC servers and clients, including all sort of streaming requests available in gRPC. The tutorial will also show you how to hook the clients and servers into a full working ZIO application. diff --git a/website/versioned_docs/version-0.5.x/quickstart.md b/website/versioned_docs/version-0.5.x/quickstart.md new file mode 100644 index 000000000..2f46f7a71 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/quickstart.md @@ -0,0 +1,137 @@ +--- +title: Quick Start +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/quickstart.md +--- + +This guide gets you started with ZIO gRPC with a simple working example. + +## Prerequisites + +* [JDK](https://jdk.java.net) version 8 or higher +* [SBT](https://www.scala-sbt.org/) + +## Get the example code + +The example code is part of the [zio-grpc](https://github.com/scalapb/zio-grpc) repository. + +1. [Download the repo as a zip file](https://github.com/scalapb/zio-grpc/archive/v0.5.0.zip) and unzip it, or clone the repo: + ```bash + git clone https://github.com/scalapb/zio-grpc + ``` + +2. Change to the examples directory: + ```bash + cd zio-grpc/examples/helloworld + ``` + +## Run the example + +From the `examples` directory: + +1. Run the server: + ```bash + sbt "runMain zio_grpc.examples.helloworld.HelloWorldServer" + ``` + +2. From another terminal, run the client: + ```bash + sbt "runMain zio_grpc.examples.helloworld.HelloWorldClient" + ``` + +Congratulations! You’ve just run a client-server application with ZIO gRPC. + +## Update a gRPC service + +In this section you’ll update the application by adding an extra server method. The gRPC service is defined using [protocol buffers](https://developers.google.com/protocol-buffers). To learn more about how to define a service in a `.proto` file see [Basics Tutorial](basics.md). For now, all you need to know is that both the server and the client stub have a `SayHello()` RPC method that takes a `HelloRequest` parameter from the client and returns a `HelloReply` from the server, and that the method is defined like this: + +```protobuf +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} +``` + +Open `src/main/protobuf/helloworld.proto` and add a new `SayHelloAgain()` method with the same request and response types as `SayHello()`. + +```protobuf +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} + // Sends another greeting + rpc SayHelloAgain (HelloRequest) returns (HelloReply) {} +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings +message HelloReply { + string message = 1; +} +``` + +Remember to save the file! + +## Update the app + +The next time we compile the app (using `compile` in sbt), ZIO gRPC will regenerate `ZioHelloworld.scala` which contains a trait with the service definition. The trait has an abstract method for which RPC method. Therefore, with the new method added to the trait, we expect the compilation of `HelloWorldServer.scala` to fail, since the method `sayHelloAgain` will be undefined. + +Let's implement the new method in the server and call it from the client. + +### Update the server + +Open `src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala`, and add the following method to `GreeterImpl`: + +```scala +def sayHelloAgain(request: HelloRequest) = + ZIO.succeed(HelloReply(s"Hello again, ${request.name}")) +``` + +### Update the client + +Open `src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala`, and update the definition of the `myAppLogic` method in `GreeterImpl`: + +```scala +def myAppLogic = + for { + r <- GreeterClient.sayHello(HelloRequest("World")) + _ <- putStrLn(r.message) + s <- GreeterClient.sayHelloAgain(HelloRequest("World")) + _ <- putStrLn(s.message) + } yield () +``` + +## Run the updated app + +If you still have the previous version of the server running, stop it by hitting `Ctrl-C`. Then run the server and client like you did before inside the `examples` directory: + +1. Run the server: + ```bash + sbt "runMain zio_grpc.examples.helloworld.HelloWorldServer" + ``` + +2. From another terminal, run the client: + ```bash + sbt "runMain zio_grpc.examples.helloworld.HelloWorldClient" + ``` + +## What's next +* Work through the [Basics Tutorial](basics.md). + +:::note +This document, "ZIO gRPC: Quick Start", is a derivative of ["gRPC – Quick Start"](https://grpc.io/docs/languages/java/quickstart/) by [gRPC Authors](https://grpc.io/), used under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0). "ZIO gRPC: Quick Start" is licensed under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0) by Nadav Samet. +::: diff --git a/website/versioned_docs/version-0.5.x/scala.js.md b/website/versioned_docs/version-0.5.x/scala.js.md new file mode 100644 index 000000000..fedf2db21 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/scala.js.md @@ -0,0 +1,9 @@ +--- +title: Using with Scala.js +sidebar_label: Scala.js +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/scala.js.md +--- + +More information will come here soon. In the mean time, take a look at +this [example project](https://github.com/thesamet/AnyHike) for using zio-grpc with Scala.js. + diff --git a/website/versioned_sidebars/version-0.5.x-sidebars.json b/website/versioned_sidebars/version-0.5.x-sidebars.json new file mode 100644 index 000000000..78afcb7f6 --- /dev/null +++ b/website/versioned_sidebars/version-0.5.x-sidebars.json @@ -0,0 +1,54 @@ +{ + "version-0.5.x/someSidebar": [ + { + "collapsed": true, + "type": "category", + "label": "Getting Started", + "items": [ + { + "type": "doc", + "id": "version-0.5.x/intro" + }, + { + "type": "doc", + "id": "version-0.5.x/quickstart" + }, + { + "type": "doc", + "id": "version-0.5.x/basics" + } + ] + }, + { + "collapsed": true, + "type": "category", + "label": "Guides", + "items": [ + { + "type": "doc", + "id": "version-0.5.x/installation" + }, + { + "type": "doc", + "id": "version-0.5.x/generated-code" + }, + { + "type": "doc", + "id": "version-0.5.x/context" + }, + { + "type": "doc", + "id": "version-0.5.x/decorating" + }, + { + "type": "doc", + "id": "version-0.5.x/deadlines" + }, + { + "type": "doc", + "id": "version-0.5.x/scala.js" + } + ] + } + ] +} diff --git a/website/versions.json b/website/versions.json new file mode 100644 index 000000000..2ec90bddd --- /dev/null +++ b/website/versions.json @@ -0,0 +1,3 @@ +[ + "0.5.x" +] From 2d456bd643964a5d2c6a3bc08f0f6330a8eefbc5 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 24 May 2022 21:23:23 -0700 Subject: [PATCH 035/245] Fix for versioned docs --- website/docusaurus.config.js | 15 ++++++++++++++- website/versioned_docs/version-0.5.x/intro.md | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index aed7a1d64..434c3a347 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -22,6 +22,10 @@ module.exports = { position: 'left', }, // {to: 'blog', label: 'Blog', position: 'left'}, + { + 'type': 'docsVersionDropdown', + 'position': 'right' + }, { href: 'https://github.com/scalapb/zio-grpc', label: 'GitHub', @@ -91,7 +95,16 @@ module.exports = { sidebarCollapsible: false, // Please change this to your repo. // editUrl: 'https://github.com/scalapb/zio-grpc/edit/master/foo/docs/', - path: '../zio-grpc-docs/target/mdoc' + path: '../zio-grpc-docs/target/mdoc', + + versions: { + current: { + label: '0.6.x (WIP)' + }, + '0.5.x': { + label: '0.5.x' + } + } }, blog: { showReadingTime: true, diff --git a/website/versioned_docs/version-0.5.x/intro.md b/website/versioned_docs/version-0.5.x/intro.md index 12e7bdfa0..0b68058af 100644 --- a/website/versioned_docs/version-0.5.x/intro.md +++ b/website/versioned_docs/version-0.5.x/intro.md @@ -1,6 +1,7 @@ --- title: Introduction custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/intro.md +slug: / --- ZIO-gRPC lets you write purely functional gRPC servers and clients. It is built on top of [ZIO](https://zio.dev/), a library for asynchronous and concurrent functional programming in Scala. From f7f6e0f6012be3e4ec9ffb8aef106d6ea00f0f73 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 24 May 2022 22:24:49 -0700 Subject: [PATCH 036/245] Update checkout and node on github actions --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e528ed22f..3b31af982 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,10 +7,10 @@ jobs: publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: - node-version: '12.x' + node-version: '16.x' - name: Set up JDK 1.8 uses: actions/setup-java@v1 with: From 8984493615f56de569222357c2de4f0550097fef Mon Sep 17 00:00:00 2001 From: denis_savitsky Date: Tue, 31 May 2022 21:45:04 +0300 Subject: [PATCH 037/245] Update examples --- examples/helloworld/project/plugins.sbt | 4 ++-- .../examples/helloworld/HelloWorldClientMetadata.scala | 6 +++--- examples/routeguide/project/plugins.sbt | 4 ++-- .../zio_grpc/examples/routeguide/RouteGuideServer.scala | 8 ++------ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 0e59be5e4..394ade426 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -2,9 +2,9 @@ resolvers += Resolver.sonatypeRepo("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") -addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") +addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test2" +val zioGrpcVersion = "0.6.0-test3" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index bae0c42be..92010a790 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -68,7 +68,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { // Option 2: through a managed client val userClientManaged : ZIO[Scope, Throwable, GreeterClient.ZService[Any, User]] = - GreeterClient.managed(channel, headers = userEnvToMetadata) + GreeterClient.scoped(channel, headers = userEnvToMetadata) def appLogic2 = ZIO.scoped { @@ -89,7 +89,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { } // Option 3: by changing the stub - val clientManaged = GreeterClient.managed(channel) + val clientManaged = GreeterClient.scoped(channel) def appLogic3 = ZIO.scoped { clientManaged.flatMap { client => @@ -97,7 +97,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { // Pass metadata effectfully r1 <- client - .withMetadataM(userToMetadata(User("hello"))) + .withMetadataZIO(userToMetadata(User("hello"))) .sayHello(HelloRequest("World")) _ <- printLine(r1.message) } yield () diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 0e59be5e4..394ade426 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -2,9 +2,9 @@ resolvers += Resolver.sonatypeRepo("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") -addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.2") +addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test2" +val zioGrpcVersion = "0.6.0-test3" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index d3e53133b..16c942c68 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -5,15 +5,11 @@ import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList import zio.{Ref, ZIO} import zio.stream.ZStream -import zio.Console._ import io.grpc.examples.routeguide.route_guide._ import scala.math._ -import zio.IO import scalapb.json4s.JsonFormat import scala.io.Source -import zio.Clock -import zio.Clock._ import zio.UIO class RouteGuideService( @@ -29,7 +25,7 @@ class RouteGuideService( */ // start: getFeature def getFeature(request: Point): ZIO[Any, Status, Feature] = - ZIO.fromOption(findFeature(request)).mapError(_ => Status.NOT_FOUND) + ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND) // end: getFeature /** @@ -156,6 +152,6 @@ object RouteGuideServer extends ServerMain { } yield new RouteGuideService(featuresDatabase.feature, routeNotes) def services: ServiceList[Any] = - ServiceList.addM(createRouteGuide) + ServiceList.addZIO(createRouteGuide) } // end: serverMain From 214749591819212e09fda9d452d807bc8406c510 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 8 Jul 2022 07:30:50 +0200 Subject: [PATCH 038/245] Update scala-java-time to 2.4.0 (#403) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index ccec62948..4606579b9 100644 --- a/build.sbt +++ b/build.sbt @@ -61,7 +61,7 @@ lazy val core = projectMatrix .settings( libraryDependencies ++= Seq( "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.4", - "io.github.cquiroz" %%% "scala-java-time" % "2.3.0" % "test" + "io.github.cquiroz" %%% "scala-java-time" % "2.4.0" % "test" ), Compile / npmDependencies += "grpc-web" -> "1.2.1" ) From 3956c89b1f3e74e0341fde4605c473b904917cb5 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 8 Jul 2022 07:41:45 +0200 Subject: [PATCH 039/245] Update scala3-library to 3.1.3 (#407) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 4606579b9..6ce29e52c 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import Settings.stdSettings -val Scala3 = "3.1.1" +val Scala3 = "3.1.3" val Scala213 = "2.13.7" From 981361f9f4861ca4282f1504c8b5c6f1f6f61d36 Mon Sep 17 00:00:00 2001 From: Denis Savitsky Date: Fri, 8 Jul 2022 21:26:05 +0300 Subject: [PATCH 040/245] bump zio2 and libs (#400) Co-authored-by: denis_savitsky Co-authored-by: Nadav Samet --- build.sbt | 6 +- .../client/StreamingClientCallListener.scala | 27 ++++-- .../client/UnaryClientCallListener.scala | 84 ++++++++++--------- .../scalapb/zio_grpc/server/CallDriver.scala | 50 +++++++---- .../zio_grpc/server/ZServerCallHandler.scala | 4 +- .../scalapb/zio_grpc/TestServiceImpl.scala | 2 +- examples/fullapp/build.sbt | 4 +- examples/helloworld/build.sbt | 4 +- examples/routeguide/build.sbt | 6 +- project/Versions.scala | 4 +- project/plugins.sbt | 2 +- 11 files changed, 114 insertions(+), 79 deletions(-) diff --git a/build.sbt b/build.sbt index 6ce29e52c..0524c36cd 100644 --- a/build.sbt +++ b/build.sbt @@ -2,9 +2,9 @@ import Settings.stdSettings val Scala3 = "3.1.3" -val Scala213 = "2.13.7" +val Scala213 = "2.13.8" -val Scala212 = "2.12.15" +val Scala212 = "2.12.16" val ScalaVersions = Seq(Scala212, Scala213, Scala3) @@ -132,7 +132,7 @@ lazy val docs = project moduleName := "zio-grpc-docs", mdocVariables := Map( "sbtProtocVersion" -> "1.0.6", - "grpcVersion" -> "1.41.2", + "grpcVersion" -> "1.47.0", "zioGrpcVersion" -> "0.6.0-M1", "scalapbVersion" -> scalapb.compiler.Version.scalapbVersion ), diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 2f9cec219..249be3b6a 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -5,6 +5,7 @@ import io.grpc.ClientCall import io.grpc.{Metadata, Status} import StreamingCallState._ import zio.stream.ZStream +import zio._ sealed trait StreamingCallState[+Res] @@ -24,19 +25,27 @@ class StreamingClientCallListener[R, Res]( ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = - runtime.unsafeRun( - state.update { - case Initial => HeadersReceived(headers) - case HeadersReceived(_) => Failure("onHeaders already called") - case f @ Failure(_) => f - }.unit - ) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe + .run( + state.update { + case Initial => HeadersReceived(headers) + case HeadersReceived(_) => Failure("onHeaders already called") + case f @ Failure(_) => f + }.unit + ) + .getOrThrowFiberFailure() + } override def onMessage(message: Res): Unit = - runtime.unsafeRun(queue.offer(Right(message)) *> call.request(1)) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(queue.offer(Right(message)) *> call.request(1)).getOrThrowFiberFailure() + } override def onClose(status: Status, trailers: Metadata): Unit = - runtime.unsafeRun(queue.offer(Left((status, trailers))).unit) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(queue.offer(Left((status, trailers))).unit).getOrThrowFiberFailure() + } def stream: ZStream[Any, Status, Res] = ZStream diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index 887a920db..0ccc96f3a 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -1,12 +1,8 @@ package scalapb.zio_grpc.client -import zio.Runtime -import zio.Ref - +import zio.{IO, Promise, Ref, Runtime, Unsafe} import io.grpc.ClientCall import io.grpc.{Metadata, Status} -import zio.Promise -import zio.IO import UnaryCallState._ sealed trait UnaryCallState[+Res] @@ -28,43 +24,55 @@ class UnaryClientCallListener[Res]( ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = - runtime.unsafeRun( - state.update { - case Initial => HeadersReceived(headers) - case HeadersReceived(_) => Failure("onHeaders already called") - case ResponseReceived(_, _) => Failure("onHeaders already called") - case f @ Failure(_) => f - }.unit - ) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe + .run( + state.update { + case Initial => HeadersReceived(headers) + case HeadersReceived(_) => Failure("onHeaders already called") + case ResponseReceived(_, _) => Failure("onHeaders already called") + case f @ Failure(_) => f + }.unit + ) + .getOrThrowFiberFailure() + } override def onMessage(message: Res): Unit = - runtime.unsafeRun( - state.update { - case Initial => Failure("onMessage called before onHeaders") - case HeadersReceived(headers) => ResponseReceived(headers, message) - case ResponseReceived(_, _) => - Failure("onMessage called more than once for unary call") - case f @ Failure(_) => f - }.unit - ) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe + .run( + state.update { + case Initial => Failure("onMessage called before onHeaders") + case HeadersReceived(headers) => ResponseReceived(headers, message) + case ResponseReceived(_, _) => + Failure("onMessage called more than once for unary call") + case f @ Failure(_) => f + }.unit + ) + .getOrThrowFiberFailure() + } override def onClose(status: Status, trailers: Metadata): Unit = - runtime.unsafeRun { - for { - s <- state.get - _ <- if (!status.isOk) promise.fail(status) - else - s match { - case ResponseReceived(headers, message) => - promise.succeed((headers, message)) - case Failure(errorMessage) => - promise.fail(Status.INTERNAL.withDescription(errorMessage)) - case _ => - promise.fail( - Status.INTERNAL.withDescription("No data received") - ) - } - } yield () + Unsafe.unsafeCompat { implicit u => + runtime.unsafe + .run { + for { + s <- state.get + _ <- if (!status.isOk) promise.fail(status) + else + s match { + case ResponseReceived(headers, message) => + promise.succeed((headers, message)) + case Failure(errorMessage) => + promise.fail(Status.INTERNAL.withDescription(errorMessage)) + case _ => + promise.fail( + Status.INTERNAL.withDescription("No data received") + ) + } + } yield () + } + .getOrThrowFiberFailure() } def getValue: IO[Status, (Metadata, Res)] = promise.await diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala index 008ae5a26..0cbcc6b0c 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala @@ -21,7 +21,7 @@ case class CallDriver[R, Req]( object CallDriver { def exitToStatus(ex: Exit[Status, Unit]): Status = - ex.fold( + ex.foldExit( failed = { cause => if (cause.isInterruptedOnly) Status.CANCELLED else cause.failureOption.getOrElse(Status.INTERNAL) @@ -40,21 +40,29 @@ object CallDriver { CallDriver( listener = new Listener[Req] { override def onCancel(): Unit = - runtime.unsafeRun(cancelled.succeed(()).unit) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(cancelled.succeed(()).unit).getOrThrowFiberFailure() + } override def onHalfClose(): Unit = - runtime.unsafeRun(completed.completeWith(ZIO.unit).unit) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(completed.completeWith(ZIO.unit).unit).getOrThrowFiberFailure() + } override def onMessage(message: Req): Unit = - runtime.unsafeRun { - request.succeed(message).flatMap { - case false => - completed - .fail(Status.INTERNAL.withDescription("Too many requests")) - .unit - case true => - ZIO.unit - } + Unsafe.unsafeCompat { implicit u => + runtime.unsafe + .run { + request.succeed(message).flatMap { + case false => + completed + .fail(Status.INTERNAL.withDescription("Too many requests")) + .unit + case true => + ZIO.unit + } + } + .getOrThrowFiberFailure() } }, run = ( @@ -106,15 +114,23 @@ object CallDriver { CallDriver( listener = new Listener[Req] { override def onCancel(): Unit = - runtime.unsafeRun(cancelled.succeed(()).unit) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(cancelled.succeed(()).unit).getOrThrowFiberFailure() + } override def onHalfClose(): Unit = - runtime.unsafeRun(queue.offer(None).unit) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(queue.offer(None).unit).getOrThrowFiberFailure() + } override def onMessage(message: Req): Unit = - runtime.unsafeRun( - call.request(1) *> queue.offer(Some(message)).unit - ) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe + .run( + call.request(1) *> queue.offer(Some(message)).unit + ) + .getOrThrowFiberFailure() + } }, run = { val requestStream = ZStream diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index ab3b373ff..c6bc2c6a0 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -31,7 +31,9 @@ class ZServerCallHandler[R, Req, Res]( _ <- driver.run.forkDaemon } yield driver.listener - runtime.unsafeRun(runner) + Unsafe.unsafeCompat { implicit u => + runtime.unsafe.run(runner).getOrThrowFiberFailure() + } } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index d9b5fe1fe..5733faebb 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -40,7 +40,7 @@ package object server { ): ZStream[Any, Status, Response] = ZStream .acquireReleaseExitWith(requestReceived.succeed(())) { (_, ex) => - ex.foldZIO( + ex.foldExit( failed => if (failed.isInterrupted || failed.isInterruptedOnly) exit.succeed(Exit.fail(Status.CANCELLED)) diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index aa3ae6688..11690634b 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -1,12 +1,12 @@ ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") -ThisBuild / scalaVersion := "2.13.5" +ThisBuild / scalaVersion := "2.13.8" ThisBuild / cancelable := true ThisBuild / connectInput := true -val grpcVersion = "1.41.2" +val grpcVersion = "1.47.0" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index 194dc618c..574781a90 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -1,8 +1,8 @@ -scalaVersion := "2.13.4" +scalaVersion := "2.13.8" resolvers += Resolver.sonatypeRepo("snapshots") -val grpcVersion = "1.41.2" +val grpcVersion = "1.47.0" Compile / PB.targets := Seq( scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 6da8e8374..2f8f60705 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -1,8 +1,8 @@ -scalaVersion := "2.13.4" +scalaVersion := "2.13.8" resolvers += Resolver.sonatypeRepo("snapshots") -val grpcVersion = "1.41.2" +val grpcVersion = "1.47.0" Compile / PB.targets := Seq( scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, @@ -12,7 +12,7 @@ Compile / PB.targets := Seq( libraryDependencies ++= Seq( "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.11.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" ) run / fork := true diff --git a/project/Versions.scala b/project/Versions.scala index ee539fc26..8f6b67a0a 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.0-RC6" - val grpc = "1.41.2" + val zio = "2.0.0" + val grpc = "1.47.0" } diff --git a/project/plugins.sbt b/project/plugins.sbt index fe0989088..8d2815607 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.8" +libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.11" addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") From 9caeaf4d65f69c74da0ee0495c3a7d212a71f71b Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 12 Jul 2022 03:36:50 +0200 Subject: [PATCH 041/245] Update scala-library to 2.12.16 (#406) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> From eeb19ca0b2912266692ee84399d9c03967386cf6 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 12 Jul 2022 03:39:23 +0200 Subject: [PATCH 042/245] Update compilerplugin, scalapb-runtime, ... to 0.11.11 (#401) From 58b995c1c24d2ef65e4bfffefd3b9c888b13a814 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 12 Jul 2022 03:42:37 +0200 Subject: [PATCH 043/245] Update sbt-scalajs-crossproject to 1.2.0 (#377) --- examples/fullapp/project/plugins.sbt | 4 ++-- project/plugins.sbt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 3b7f516fe..f1eb5e300 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -8,12 +8,12 @@ val zioGrpcVersion = "0.6.0-test2" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.1.0") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") diff --git a/project/plugins.sbt b/project/plugins.sbt index 8d2815607..63709f554 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -12,7 +12,7 @@ addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.1.0") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") From d7f1552aa5ac6f271f705d6a0cb8c6f915231ca5 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 11 Jul 2022 18:43:34 -0700 Subject: [PATCH 044/245] Update scalafmt to 3.3.3 --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index dce291292..11ae1d4b3 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.3.1" +version = "3.3.3" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 align.preset = most From 78c41c4f3942f317bb1f3ff70c4805aba22b05bd Mon Sep 17 00:00:00 2001 From: Pierre Ricadat Date: Thu, 14 Jul 2022 11:39:20 +0900 Subject: [PATCH 045/245] Support for response Metadata (trailers) (#411) Support response metadata Co-authored-by: Mingyu Chi --- .../main/scala/scalapb/zio_grpc/RequestContext.scala | 3 +++ .../scalajvm/scalapb/zio_grpc/server/CallDriver.scala | 10 ++++++---- .../scalapb/zio_grpc/server/ZServerCallHandler.scala | 9 +++++---- examples/fullapp/project/plugins.sbt | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/core/src/main/scala/scalapb/zio_grpc/RequestContext.scala b/core/src/main/scala/scalapb/zio_grpc/RequestContext.scala index ab48c977e..61dbc30e2 100644 --- a/core/src/main/scala/scalapb/zio_grpc/RequestContext.scala +++ b/core/src/main/scala/scalapb/zio_grpc/RequestContext.scala @@ -6,6 +6,7 @@ import io.grpc.ServerCall final case class RequestContext( metadata: SafeMetadata, + responseMetadata: SafeMetadata, authority: Option[String], methodDescriptor: MethodDescriptor[_, _], attributes: Attributes @@ -14,10 +15,12 @@ final case class RequestContext( object RequestContext { def fromServerCall[Req, Res]( metadata: SafeMetadata, + responseMetadata: SafeMetadata, sc: ServerCall[Req, Res] ): RequestContext = RequestContext( metadata, + responseMetadata, Option(sc.getAuthority()), sc.getMethodDescriptor(), sc.getAttributes() diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala index 0cbcc6b0c..bae2c2a41 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala @@ -35,6 +35,7 @@ object CallDriver { cancelled: Promise[Nothing, Unit], completed: Promise[Status, Unit], request: Promise[Nothing, Req], + requestContext: RequestContext, writeResponse: Req => ZIO[R, Status, Unit] ): CallDriver[R, Req] = CallDriver( @@ -70,7 +71,7 @@ object CallDriver { completed.await *> call.sendHeaders(new Metadata) *> request.await flatMap writeResponse - ).onExit(ex => call.close(CallDriver.exitToStatus(ex), new Metadata).ignore) + ).onExit(ex => call.close(CallDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) .ignore .race(cancelled.await) ) @@ -101,6 +102,7 @@ object CallDriver { cancelled, completed, request, + requestContext, writeResponse(_, requestContext, zioCall) ) @@ -109,6 +111,7 @@ object CallDriver { call: ZServerCall[Res], cancelled: Promise[Nothing, Unit], queue: Queue[Option[Req]], + requestContext: RequestContext, writeResponse: Stream[Status, Req] => ZIO[R, Status, Unit] ): CallDriver[R, Req] = CallDriver( @@ -140,9 +143,7 @@ object CallDriver { (call.request(1) *> call.sendHeaders(new Metadata) *> writeResponse(requestStream)) - .onExit { ex => - call.close(CallDriver.exitToStatus(ex), new Metadata).ignore - } + .onExit(ex => call.close(CallDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) .ignore .race(cancelled.await) } @@ -172,6 +173,7 @@ object CallDriver { zioCall, cancelled, queue, + requestContext, writeResponse(_, requestContext, zioCall) ) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index c6bc2c6a0..6f29650e3 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -21,14 +21,15 @@ class ZServerCallHandler[R, Req, Res]( ): Listener[Req] = { val zioCall = new ZServerCall(call) val runner = for { - driver <- SafeMetadata.fromMetadata(headers) flatMap { md => - mkDriver(zioCall, RequestContext.fromServerCall(md, call)) - } + responseMetadata <- SafeMetadata.make + driver <- SafeMetadata.fromMetadata(headers).flatMap { md => + mkDriver(zioCall, RequestContext.fromServerCall(md, responseMetadata, call)) + } // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener // back to grpc-java. If it was just fork, the call to unsafeRun would not return control, so grpc-java // won't have a listener to call on. The driver awaits on the calls to the listener to pass to the user's // service. - _ <- driver.run.forkDaemon + _ <- driver.run.forkDaemon } yield driver.listener Unsafe.unsafeCompat { implicit u => diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index f1eb5e300..4a7b18952 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -8,7 +8,7 @@ val zioGrpcVersion = "0.6.0-test2" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: From 843f4d254ea18e33f86a38ca78c428a8591c3935 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Jul 2022 19:08:25 -0700 Subject: [PATCH 046/245] Bump terser from 5.13.1 to 5.14.2 in /website (#412) Bumps [terser](https://github.com/terser/terser) from 5.13.1 to 5.14.2. - [Release notes](https://github.com/terser/terser/releases) - [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md) - [Commits](https://github.com/terser/terser/commits) --- updated-dependencies: - dependency-name: terser dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 80 ++++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index 5402c5fa7..4262fa9b7 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -1579,33 +1579,46 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -4962,11 +4975,6 @@ lodash.some@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -6811,13 +6819,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.8.0-beta.0: - version "0.8.0-beta.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" - integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== - dependencies: - whatwg-url "^7.0.0" - space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" @@ -7032,13 +7033,13 @@ terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: terser "^5.7.2" terser@^5.10.0, terser@^5.7.2: - version "5.13.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" - integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: + "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" commander "^2.20.0" - source-map "~0.8.0-beta.0" source-map-support "~0.5.20" text-table@^0.2.0: @@ -7088,13 +7089,6 @@ totalist@^1.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -7433,11 +7427,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== - webpack-bundle-analyzer@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" @@ -7581,15 +7570,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" - integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" - which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" From 09656bfb214aca5757fbb51bc699f34f6544ec10 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 22 Jul 2022 04:08:35 +0200 Subject: [PATCH 047/245] Update sbt to 1.7.1 (#408) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index c8fcab543..22af2628c 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.2 +sbt.version=1.7.1 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index c8fcab543..22af2628c 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.2 +sbt.version=1.7.1 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index c8fcab543..22af2628c 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.2 +sbt.version=1.7.1 diff --git a/project/build.properties b/project/build.properties index c8fcab543..22af2628c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.6.2 +sbt.version=1.7.1 From 6f0040ef89d970ca56873dd1da9538eb4098334c Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Thu, 21 Jul 2022 19:15:11 -0700 Subject: [PATCH 048/245] scalafmt update to 3.5.8 --- .scalafmt.conf | 2 +- examples/fullapp/.scalafmt.conf | 3 +- .../scala/ExampleServerWithMetadata.scala | 2 +- examples/helloworld/.scalafmt.conf | 3 +- examples/routeguide/.scalafmt.conf | 3 +- .../routeguide/RouteGuideClientApp.scala | 11 ++-- .../routeguide/RouteGuideServer.scala | 52 +++++++++++-------- 7 files changed, 43 insertions(+), 33 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 11ae1d4b3..b75ee794e 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.3.3" +version = "3.5.8" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 align.preset = most diff --git a/examples/fullapp/.scalafmt.conf b/examples/fullapp/.scalafmt.conf index 9df0d88b6..a30babc5e 100644 --- a/examples/fullapp/.scalafmt.conf +++ b/examples/fullapp/.scalafmt.conf @@ -1 +1,2 @@ -version = "2.6.3" +version = "3.5.8" +runner.dialect = scala213source3 diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index b309b8b33..76a604796 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -37,7 +37,7 @@ object GreeterServiceWithMetadata { def findUser(rc: RequestContext): IO[Status, User] = rc.metadata.get(UserKey).flatMap { case Some(name) => ZIO.succeed(User(name)) - case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) } val live: ZLayer[Clock, Nothing, ZGreeter[Any, RequestContext]] = diff --git a/examples/helloworld/.scalafmt.conf b/examples/helloworld/.scalafmt.conf index 9df0d88b6..a30babc5e 100644 --- a/examples/helloworld/.scalafmt.conf +++ b/examples/helloworld/.scalafmt.conf @@ -1 +1,2 @@ -version = "2.6.3" +version = "3.5.8" +runner.dialect = scala213source3 diff --git a/examples/routeguide/.scalafmt.conf b/examples/routeguide/.scalafmt.conf index 9df0d88b6..a30babc5e 100644 --- a/examples/routeguide/.scalafmt.conf +++ b/examples/routeguide/.scalafmt.conf @@ -1 +1,2 @@ -version = "2.6.3" +version = "3.5.8" +runner.dialect = scala213source3 diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index 1d6c968ee..eb61668e7 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -37,9 +37,9 @@ object RouteGuideClientApp extends ZIOAppDefault { val features = RouteGuideServer.featuresDatabase.feature - /** - * Sends numPoints randomly chosen points from [[features]] with a variable delay in between. - * Prints the statistics when they are sent from the server. + /** Sends numPoints randomly chosen points from [[features]] with a variable + * delay in between. Prints the statistics when they are sent from the + * server. */ // start: recordRoute def recordRoute(numPoints: Int) = @@ -121,9 +121,8 @@ object RouteGuideClientApp extends ZIOAppDefault { ) ) .zipWithIndex - .foreach { - case (feature, index) => - printLine(s"Result #${index + 1}: $feature") + .foreach { case (feature, index) => + printLine(s"Result #${index + 1}: $feature") } // end: listFeatures diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index 16c942c68..2f12bf8b0 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -17,21 +17,23 @@ class RouteGuideService( routeNotesRef: Ref[Map[Point, List[RouteNote]]] ) extends ZioRouteGuide.ZRouteGuide[Any, Any] { - /** - * Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the requested [[Point]]. If no feature at - * that location exists, a NOT FOUND error is returned. + /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the + * requested [[Point]]. If no feature at that location exists, a NOT FOUND + * error is returned. * - * @param request the requested location for the feature. + * @param request + * the requested location for the feature. */ // start: getFeature def getFeature(request: Point): ZIO[Any, Status, Feature] = ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND) // end: getFeature - /** - * Streams all features contained within the given bounding {@link Rectangle}. + /** Streams all features contained within the given bounding {@link + * Rectangle}. * - * @param request the bounding rectangle for the requested features. + * @param request + * the bounding rectangle for the requested features. */ // start: listFeatures def listFeatures(request: Rectangle): ZStream[Any, Status, Feature] = { @@ -50,11 +52,12 @@ class RouteGuideService( } // end: listFeatures - /** - * Gets a stream of points, and responds with statistics about the "trip": number of points, - * number of known features visited, total distance traveled, and total time spent. + /** Gets a stream of points, and responds with statistics about the "trip": + * number of points, number of known features visited, total distance + * traveled, and total time spent. * - * @param request a stream of points to process + * @param request + * a stream of points to process */ // start: recordRoute def recordRoute( @@ -76,9 +79,8 @@ class RouteGuideService( ) } .timed // returns a new effect that times the execution - .map { - case (duration, summary) => - summary.copy(elapsedTime = (duration.toMillis / 1000).toInt) + .map { case (duration, summary) => + summary.copy(elapsedTime = (duration.toMillis / 1000).toInt) } } // end: recordRoute @@ -105,21 +107,27 @@ class RouteGuideService( /** Gets the feature with the given point. * - * @param location the location to check - * @return A non-empty option if a feature is defined at that point, None otherwise. + * @param location + * the location to check + * @return + * A non-empty option if a feature is defined at that point, None + * otherwise. */ // start: findFeature def findFeature(point: Point): Option[Feature] = features.find(f => f.getLocation == point && f.name.nonEmpty) // end: findFeature - /** - * Calculate the distance between two points using the "haversine" formula. - * The formula is based on http://mathforum.org/library/drmath/view/51879.html. + /** Calculate the distance between two points using the "haversine" formula. + * The formula is based on + * http://mathforum.org/library/drmath/view/51879.html. * - * @param start The starting point - * @param end The end point - * @return The distance between the points in meters + * @param start + * The starting point + * @param end + * The end point + * @return + * The distance between the points in meters */ def calcDistance(start: Point, end: Point): Int = { val r = 6371000 // earth radius in meters From 0da9d13d25f6806e4791715f94ae26c69f0b3117 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 27 Jul 2022 19:38:06 +0200 Subject: [PATCH 049/245] Update mdoc, sbt-mdoc to 2.3.3 (#414) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 63709f554..de0bb96bf 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.2") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.3") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.8.0") From 8649bc9bdf5970f89596d4005f896de395037b27 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:20:56 +0100 Subject: [PATCH 050/245] Clean server shutdown (#416) * Clean server shutdown * Group imports * Add explicit timeout method * Use underlying timeout API Co-authored-by: Regis Kuckaertz --- .../scalajvm/scalapb/zio_grpc/Server.scala | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 36213eec2..0c0b38f35 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -1,8 +1,10 @@ package scalapb.zio_grpc -import zio.{Scope, Tag, Task, URIO, ZIO, ZLayer} +import zio.{Duration, Scope, Tag, Task, URIO, ZIO, ZLayer} import io.grpc.ServerBuilder import io.grpc.ServerServiceDefinition +import java.util.concurrent.TimeUnit +import java.time.temporal.ChronoUnit object Server { trait Service { @@ -16,6 +18,14 @@ object Server { } private[zio_grpc] class ServiceImpl(underlying: io.grpc.Server) extends Service { + private def awaitTermination(duration: Option[Duration]): Task[Unit] = + ZIO.attempt(duration match { + case None => + underlying.awaitTermination() + case Some(duration) => + val _ = underlying.awaitTermination(duration.get(ChronoUnit.MILLIS), TimeUnit.MILLISECONDS) + }) + def port: Task[Int] = ZIO.attempt(underlying.getPort()) def shutdown: Task[Unit] = ZIO.attempt(underlying.shutdown()).unit @@ -24,7 +34,11 @@ object Server { def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit - def toManaged: ZIO[Scope, Throwable, Service] = start.as(this).withFinalizer(_ => this.shutdown.ignore) + def toManaged: ZIO[Scope, Throwable, Service] = + start.as(this).withFinalizer(_ => this.shutdown.ignore *> this.awaitTermination(None).ignore) + + def toManaged(awaitTermination: Duration): ZIO[Scope, Throwable, Service] = + start.as(this).withFinalizer(_ => this.shutdown.ignore *> this.awaitTermination(Some(awaitTermination)).ignore) } @deprecated("Use ManagedServer.fromBuilder", "0.4.0") From f4415772bd116fa8b57993935e59d5a581fc4ba6 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Sun, 7 Aug 2022 04:24:05 +0100 Subject: [PATCH 051/245] fix: conversion to milliseconds (#420) Update api contract, add unit tests Co-authored-by: Regis Kuckaertz Co-authored-by: Nadav Samet --- .../scalajvm/scalapb/zio_grpc/Server.scala | 21 +++---- .../scala/scalapb/zio_grpc/ServerSpec.scala | 61 +++++++++++++++++++ 2 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 0c0b38f35..165fe3f47 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -4,10 +4,13 @@ import zio.{Duration, Scope, Tag, Task, URIO, ZIO, ZLayer} import io.grpc.ServerBuilder import io.grpc.ServerServiceDefinition import java.util.concurrent.TimeUnit -import java.time.temporal.ChronoUnit object Server { trait Service { + def awaitTermination: Task[Unit] + + def awaitTermination(duratio: Duration): Task[Boolean] + def port: Task[Int] def shutdown: Task[Unit] @@ -18,13 +21,10 @@ object Server { } private[zio_grpc] class ServiceImpl(underlying: io.grpc.Server) extends Service { - private def awaitTermination(duration: Option[Duration]): Task[Unit] = - ZIO.attempt(duration match { - case None => - underlying.awaitTermination() - case Some(duration) => - val _ = underlying.awaitTermination(duration.get(ChronoUnit.MILLIS), TimeUnit.MILLISECONDS) - }) + val awaitTermination: Task[Unit] = ZIO.attempt(underlying.awaitTermination()) + + def awaitTermination(duration: Duration): Task[Boolean] = + ZIO.attempt(underlying.awaitTermination(duration.toMillis(), TimeUnit.MILLISECONDS)) def port: Task[Int] = ZIO.attempt(underlying.getPort()) @@ -35,10 +35,7 @@ object Server { def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit def toManaged: ZIO[Scope, Throwable, Service] = - start.as(this).withFinalizer(_ => this.shutdown.ignore *> this.awaitTermination(None).ignore) - - def toManaged(awaitTermination: Duration): ZIO[Scope, Throwable, Service] = - start.as(this).withFinalizer(_ => this.shutdown.ignore *> this.awaitTermination(Some(awaitTermination)).ignore) + start.as(this).withFinalizer(_ => this.shutdown.ignore) } @deprecated("Use ManagedServer.fromBuilder", "0.4.0") diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala new file mode 100644 index 000000000..6c045dda0 --- /dev/null +++ b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala @@ -0,0 +1,61 @@ +package scalapb.zio_grpc + +import zio._ +import zio.test._ +import zio.test.Assertion._ +import java.util.concurrent.TimeUnit +import java.time.Duration + +object ServerSpec extends ZIOSpecDefault { + val spec = + suite("Server")( + test("awaitsTermination delegates to underlying implementation (without timeout)") { + for { + waitedRef <- Ref.make(false) + server = new io.grpc.Server { + def awaitTermination(): Unit = { + val _ = Unsafe.unsafe { implicit unsafe => + Runtime.default.unsafe.run(waitedRef.set(true)).getOrThrowFiberFailure() + } + } + + def start(): io.grpc.Server = ??? + def shutdown(): io.grpc.Server = ??? + def shutdownNow(): io.grpc.Server = ??? + def isShutdown(): Boolean = ??? + def isTerminated(): Boolean = ??? + def awaitTermination(timeout: Long, unit: TimeUnit): Boolean = ??? + } + pbServer = new Server.ServiceImpl(server) + _ <- pbServer.awaitTermination + waited <- waitedRef.get + } yield assert(waited)(isTrue) + }, + test("awaitsTermination delegates to underlying implementation (with timeout)") { + for { + waitedRef <- Ref.make[TestResult](assert(false)(isTrue)) + runtime <- ZIO.runtime[Any] + server = new io.grpc.Server { + def awaitTermination(timeout: Long, unit: TimeUnit): Boolean = { + val assertion1 = assert(timeout)(equalTo(2500L)) + val assertion2 = assert(unit)(equalTo(TimeUnit.MILLISECONDS)) + Unsafe.unsafe { implicit unsafe => + Runtime.default.unsafe.run(waitedRef.set(assertion1 && assertion2)).getOrThrowFiberFailure() + } + true + } + + def start(): io.grpc.Server = ??? + def shutdown(): io.grpc.Server = ??? + def shutdownNow(): io.grpc.Server = ??? + def isShutdown(): Boolean = ??? + def isTerminated(): Boolean = ??? + def awaitTermination(): Unit = ??? + } + pbServer = new Server.ServiceImpl(server) + _ <- pbServer.awaitTermination(Duration.ofSeconds(2, 500000000L)) + assertion <- waitedRef.get + } yield assertion + } + ) +} From e629df8ff8b93850229763b49616c3b042f344af Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 18 Aug 2022 20:04:11 +0200 Subject: [PATCH 052/245] Update zio, zio-streams, zio-test, ... to 2.0.1 (#424) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 8f6b67a0a..b9b060b43 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.0" + val zio = "2.0.1" val grpc = "1.47.0" } From 580e47981718a61f2adaa2a4e8c0f37d9b1442f6 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Wed, 24 Aug 2022 08:40:22 +0100 Subject: [PATCH 053/245] Enable scala 3 pipeline (#422) Enable scala 3 pipeline Co-authored-by: Regis Kuckaertz Co-authored-by: Nadav Samet --- .github/workflows/ci.yml | 12 ++++-- build.sbt | 4 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 21 ++++++++-- .../scalajvm/scalapb/zio_grpc/ZChannel.scala | 33 ++++++++++++++-- .../scalapb/zio_grpc/ClientCallsSpec.scala | 39 +++++++++---------- .../scala/scalapb/zio_grpc/ServerSpec.scala | 4 +- 6 files changed, 79 insertions(+), 34 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b384c27c..4db6ee7dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,7 +6,7 @@ jobs: build: strategy: matrix: - scala: [2_12, 2_13] + scala: [2_12, 2_13, 3] runs-on: ubuntu-latest steps: @@ -30,10 +30,14 @@ jobs: run: | sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck - - name: Compile and test + - name: Compile and test (JVM) run: | - sbt coreJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/test \ - coreJS${{matrix.scala}}/test + sbt coreJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/test + + - name: Compile and test (JS) + if: ${{ matrix.scala != 3 }} + run: | + sbt coreJS${{matrix.scala}}/test - name: Examples run: | diff --git a/build.sbt b/build.sbt index 0524c36cd..006d89160 100644 --- a/build.sbt +++ b/build.sbt @@ -8,7 +8,7 @@ val Scala212 = "2.12.16" val ScalaVersions = Seq(Scala212, Scala213, Scala3) -ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") +ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") publish / skip := true @@ -55,7 +55,7 @@ lazy val core = projectMatrix ) .customRow( true, - Seq(Scala212, Scala213), + Seq(Scala212, Scala213, Scala3), Seq(VirtualAxis.js), _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index 5746aba71..7cdf64bd8 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -46,9 +46,24 @@ object ClientCalls { scalajs.js.Dictionary[String](), method.methodInfo ) - .on("data", (res: Res) => cb(ZIO.succeed(Chunk.single(res)))) - .on("error", (ei: ErrorInfo) => cb(ZIO.fail(Some(Status.fromErrorInfo(ei))))) - .on("end", () => cb(ZIO.fail(None))) + .on( + "data", + { (res: Res) => + val _ = cb(ZIO.succeed(Chunk.single(res))) + } + ) + .on( + "error", + { (ei: ErrorInfo) => + val _ = cb(ZIO.fail(Some(Status.fromErrorInfo(ei)))) + } + ) + .on( + "end", + { () => + val _ = cb(ZIO.fail(None)) + } + ) .on( "status", (status: StatusInfo) => diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala index 74366596e..e0084076a 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala @@ -1,11 +1,12 @@ package scalapb.zio_grpc +import java.util.concurrent.TimeUnit import io.grpc.CallOptions +import io.grpc.ManagedChannel +import io.grpc.ManagedChannelBuilder import io.grpc.MethodDescriptor import scalapb.zio_grpc.client.ZClientCall -import zio.{Task, UIO, ZIO} -import io.grpc.ManagedChannel -import zio.ZEnvironment +import zio._ class ZChannel[-R]( private[zio_grpc] val channel: ManagedChannel, @@ -20,8 +21,34 @@ class ZChannel[-R]( )((call, interceptor) => interceptor.interceptCall(methodDescriptor, options, call)) ) + def awaitTermination(duration: Duration): Task[Boolean] = + ZIO.attempt(channel.awaitTermination(duration.toMillis(), TimeUnit.MILLISECONDS)) + def shutdown(): Task[Unit] = ZIO.attempt(channel.shutdown()).unit def provideEnvironment(r: ZEnvironment[R]): ZChannel[Any] = new ZChannel[Any](channel, interceptors.map(_.provideEnvironment(r))) } + +object ZChannel { + + /** Create a scoped channel that will be shutdown when the scope closes. + * + * @param builder + * The channel builder to use to create the channel. + * @param interceptors + * The client call interceptors to use. + * @param timeout + * The maximum amount of time to wait for the channel to shutdown. + * @return + */ + def scoped[R]( + builder: => ManagedChannelBuilder[_], + interceptors: Seq[ZClientInterceptor[R]], + timeout: Duration + ): RIO[Scope, ZChannel[R]] = + ZIO + .acquireRelease( + ZIO.attempt(new ZChannel[R](builder.build(), interceptors)) + )(channel => channel.shutdown().ignore *> channel.awaitTermination(timeout).ignore) +} diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala index b258694cd..67bb08914 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala @@ -4,9 +4,9 @@ import io.grpc.{CallOptions, ManagedChannelBuilder} import scalapb.zio_grpc.TestUtils._ import scalapb.zio_grpc.client.ClientCalls import scalapb.zio_grpc.testservice._ -import zio.Schedule -import zio.test.Assertion._ +import zio._ import zio.test._ +import zio.test.Assertion._ object ClientCallsSpec extends ZIOSpecDefault { @@ -14,24 +14,23 @@ object ClientCallsSpec extends ZIOSpecDefault { suite("unaryCall")( test("should not fail with 'INTERNAL: already started' on retry") { for { - meta <- SafeMetadata.make - res <- ClientCalls - .unaryCall( - // This test does not require working server - new ZChannel( - ManagedChannelBuilder - .forAddress("localhost", 0) - .usePlaintext() - .build(), - Nil - ), - scalapb.zio_grpc.testservice.TestServiceGrpc.METHOD_UNARY, - CallOptions.DEFAULT, - meta, - Request(Request.Scenario.DELAY, in = 12) - ) - .retry(Schedule.recurs(2)) - .exit + channel <- ZChannel.scoped[Any]( + ManagedChannelBuilder.forAddress("localhost", 0).usePlaintext(), + Nil, + 1.second + ) + meta <- SafeMetadata.make + res <- ClientCalls + .unaryCall( + // This test does not require working server + channel, + scalapb.zio_grpc.testservice.TestServiceGrpc.METHOD_UNARY, + CallOptions.DEFAULT, + meta, + Request(Request.Scenario.DELAY, in = 12) + ) + .retry(Schedule.recurs(2)) + .exit } yield // There was a bug, when call.start was invoked multiple times, so this test was failing diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala index 6c045dda0..482206868 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala @@ -14,7 +14,7 @@ object ServerSpec extends ZIOSpecDefault { waitedRef <- Ref.make(false) server = new io.grpc.Server { def awaitTermination(): Unit = { - val _ = Unsafe.unsafe { implicit unsafe => + val _ = Unsafe.unsafeCompat { implicit unsafe => Runtime.default.unsafe.run(waitedRef.set(true)).getOrThrowFiberFailure() } } @@ -39,7 +39,7 @@ object ServerSpec extends ZIOSpecDefault { def awaitTermination(timeout: Long, unit: TimeUnit): Boolean = { val assertion1 = assert(timeout)(equalTo(2500L)) val assertion2 = assert(unit)(equalTo(TimeUnit.MILLISECONDS)) - Unsafe.unsafe { implicit unsafe => + Unsafe.unsafeCompat { implicit unsafe => Runtime.default.unsafe.run(waitedRef.set(assertion1 && assertion2)).getOrThrowFiberFailure() } true From c09953746d685603fdd5e5be32e230c1330e1b3a Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Wed, 24 Aug 2022 01:06:13 -0700 Subject: [PATCH 054/245] Exclude Scala 3 from core JS build Follow up for #422 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 006d89160..f4d2b914d 100644 --- a/build.sbt +++ b/build.sbt @@ -55,7 +55,7 @@ lazy val core = projectMatrix ) .customRow( true, - Seq(Scala212, Scala213, Scala3), + Seq(Scala212, Scala213), Seq(VirtualAxis.js), _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( From 45bae25ea7a18797eb6ee53f73a47f47d0b6eb69 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 9 Sep 2022 20:30:19 +0200 Subject: [PATCH 055/245] Update scala3-library to 3.2.0 (#429) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index f4d2b914d..240e7a69c 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import Settings.stdSettings -val Scala3 = "3.1.3" +val Scala3 = "3.2.0" val Scala213 = "2.13.8" From 4d581389bf4565768ef652f9265b028252974efc Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 24 Sep 2022 08:10:35 -0700 Subject: [PATCH 056/245] Replace deprecated unsafeCompat with unsafe --- .../client/StreamingClientCallListener.scala | 6 +++--- .../zio_grpc/client/UnaryClientCallListener.scala | 6 +++--- .../scalapb/zio_grpc/server/CallDriver.scala | 12 ++++++------ .../scalapb/zio_grpc/server/ZServerCallHandler.scala | 2 +- e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 249be3b6a..487edb55d 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -25,7 +25,7 @@ class StreamingClientCallListener[R, Res]( ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe .run( state.update { @@ -38,12 +38,12 @@ class StreamingClientCallListener[R, Res]( } override def onMessage(message: Res): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(queue.offer(Right(message)) *> call.request(1)).getOrThrowFiberFailure() } override def onClose(status: Status, trailers: Metadata): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(queue.offer(Left((status, trailers))).unit).getOrThrowFiberFailure() } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index 0ccc96f3a..5209478b1 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -24,7 +24,7 @@ class UnaryClientCallListener[Res]( ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe .run( state.update { @@ -38,7 +38,7 @@ class UnaryClientCallListener[Res]( } override def onMessage(message: Res): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe .run( state.update { @@ -53,7 +53,7 @@ class UnaryClientCallListener[Res]( } override def onClose(status: Status, trailers: Metadata): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe .run { for { diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala index bae2c2a41..75779b336 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala @@ -41,17 +41,17 @@ object CallDriver { CallDriver( listener = new Listener[Req] { override def onCancel(): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(cancelled.succeed(()).unit).getOrThrowFiberFailure() } override def onHalfClose(): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(completed.completeWith(ZIO.unit).unit).getOrThrowFiberFailure() } override def onMessage(message: Req): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe .run { request.succeed(message).flatMap { @@ -117,17 +117,17 @@ object CallDriver { CallDriver( listener = new Listener[Req] { override def onCancel(): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(cancelled.succeed(()).unit).getOrThrowFiberFailure() } override def onHalfClose(): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(queue.offer(None).unit).getOrThrowFiberFailure() } override def onMessage(message: Req): Unit = - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe .run( call.request(1) *> queue.offer(Some(message)).unit diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 6f29650e3..55c8f6797 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -32,7 +32,7 @@ class ZServerCallHandler[R, Req, Res]( _ <- driver.run.forkDaemon } yield driver.listener - Unsafe.unsafeCompat { implicit u => + Unsafe.unsafe { implicit u => runtime.unsafe.run(runner).getOrThrowFiberFailure() } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala index 482206868..6c045dda0 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala @@ -14,7 +14,7 @@ object ServerSpec extends ZIOSpecDefault { waitedRef <- Ref.make(false) server = new io.grpc.Server { def awaitTermination(): Unit = { - val _ = Unsafe.unsafeCompat { implicit unsafe => + val _ = Unsafe.unsafe { implicit unsafe => Runtime.default.unsafe.run(waitedRef.set(true)).getOrThrowFiberFailure() } } @@ -39,7 +39,7 @@ object ServerSpec extends ZIOSpecDefault { def awaitTermination(timeout: Long, unit: TimeUnit): Boolean = { val assertion1 = assert(timeout)(equalTo(2500L)) val assertion2 = assert(unit)(equalTo(TimeUnit.MILLISECONDS)) - Unsafe.unsafeCompat { implicit unsafe => + Unsafe.unsafe { implicit unsafe => Runtime.default.unsafe.run(waitedRef.set(assertion1 && assertion2)).getOrThrowFiberFailure() } true From b90822565b9bc471c23b79df7fd0a2240c27b3a0 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 24 Sep 2022 17:19:14 +0200 Subject: [PATCH 057/245] Update zio, zio-streams, zio-test, ... to 2.0.2 (#426) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index b9b060b43..d0dc940ea 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.1" + val zio = "2.0.2" val grpc = "1.47.0" } From b3f129477667a7d674e41d0281655bda40f1c27e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 24 Sep 2022 08:22:02 -0700 Subject: [PATCH 058/245] Update deprecated snapshot repos --- examples/fullapp/build.sbt | 2 +- examples/fullapp/project/plugins.sbt | 2 +- examples/helloworld/project/plugins.sbt | 2 +- examples/routeguide/project/plugins.sbt | 2 +- project/plugins.sbt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 11690634b..63c28940a 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -1,4 +1,4 @@ -ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") +ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") ThisBuild / scalaVersion := "2.13.8" diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 4a7b18952..1d3a2e31b 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -1,4 +1,4 @@ -resolvers += Resolver.sonatypeRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepos("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 394ade426..9da7ee6b0 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -1,4 +1,4 @@ -resolvers += Resolver.sonatypeRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepo("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 394ade426..9da7ee6b0 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -1,4 +1,4 @@ -resolvers += Resolver.sonatypeRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepo("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") diff --git a/project/plugins.sbt b/project/plugins.sbt index de0bb96bf..2c5ce6ac1 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,4 @@ -ThisBuild / resolvers += Resolver.sonatypeRepo("snapshots") +ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") From d0e802e62b9c56a6bd1b2fac0118bf6d72056fa7 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 24 Sep 2022 08:33:16 -0700 Subject: [PATCH 059/245] Fix typo in sonaTypeOssRepos --- examples/helloworld/project/plugins.sbt | 2 +- examples/routeguide/project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 9da7ee6b0..2e5ec72f8 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -1,4 +1,4 @@ -resolvers ++= Resolver.sonatypeOssRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepos("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 9da7ee6b0..2e5ec72f8 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -1,4 +1,4 @@ -resolvers ++= Resolver.sonatypeOssRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepos("snapshots") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") From 1753d337b31ece1153bfeca43733fa3eb72640cf Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Thu, 20 Oct 2022 06:02:42 +0100 Subject: [PATCH 060/245] feat: Add client support for response metadata (#430) Co-authored-by: Regis Kuckaertz --- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 255 ++++++++++++++++-- .../scalapb/zio_grpc/ResponseContext.scala | 9 + .../scalapb/zio_grpc/ResponseFrame.scala | 12 + .../scalapb/zio_grpc/client/ClientCalls.scala | 227 +++++++++------- .../client/StreamingClientCallListener.scala | 44 +-- .../client/UnaryClientCallListener.scala | 9 +- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 69 +++-- .../scalapb/zio_grpc/MetadataTests.scala | 86 +++++- 8 files changed, 542 insertions(+), 169 deletions(-) create mode 100644 core/src/main/scala/scalapb/zio_grpc/ResponseContext.scala create mode 100644 core/src/main/scala/scalapb/zio_grpc/ResponseFrame.scala diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index dca75854e..ec367af3b 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -17,6 +17,7 @@ import protocgen.CodeGenRequest import scalapb.compiler.NameUtils import scala.jdk.CollectionConverters._ +import scala.util.chaining._ object ZioCodeGenerator extends CodeGenApp { override def registerExtensions(registry: ExtensionRegistry): Unit = @@ -102,8 +103,10 @@ class ZioFilePrinter( private val traitName = OuterObject / service.name private val ztraitName = OuterObject / ("Z" + service.name) - private val clientServiceName = OuterObject / (service.name + "Client") - private val accessorsClassName = OuterObject / (service.name + "Accessors") + private val clientServiceName = OuterObject / (service.name + "Client") + private val clientWithMetadataServiceName = OuterObject / (service.name + "ClientWithMetadata") + private val accessorsClassName = OuterObject / (service.name + "Accessors") + private val accessorsWithMetadataClassName = OuterObject / (service.name + "WithMetadataAccessors") def methodInType(method: MethodDescriptor, inEnvType: String): String = { val scalaInType = method.inputType.scalaType @@ -161,6 +164,28 @@ class ZioFilePrinter( }) } + def clientWithMetadataMethodSignature( + method: MethodDescriptor, + inEnvType: String, + outEnvType: String + ): String = { + val reqType = methodInType(method, inEnvType) + val scalaOutType = method.outputType.scalaType + val ioOutType = s"scalapb.zio_grpc.ResponseContext[$scalaOutType]" + val streamOutType = s"scalapb.zio_grpc.ResponseFrame[$scalaOutType]" + + s"def ${method.name}" + (method.streamType match { + case StreamType.Unary => + s"(request: $reqType): ${io(ioOutType, outEnvType)}" + case StreamType.ClientStreaming => + s"[${inEnvType}](request: $reqType): ${io(ioOutType, outEnvType + " with " + inEnvType)}" + case StreamType.ServerStreaming => + s"(request: $reqType): ${stream(streamOutType, outEnvType)}" + case StreamType.Bidirectional => + s"[${inEnvType}](request: $reqType): ${stream(streamOutType, outEnvType + " with " + inEnvType)}" + }) + } + def printMethodSignature( inEnvType: String, outEnvType: String @@ -191,6 +216,21 @@ class ZioFilePrinter( ) ) + def printClientWithMetadataMethodSignature( + inEnvType: String, + outEnvType: String + )( + fp: FunctionalPrinter, + method: MethodDescriptor + ): FunctionalPrinter = + fp.add( + clientWithMetadataMethodSignature( + method, + inEnvType, + outEnvType + ) + ) + def printServerTransform( fp: FunctionalPrinter, method: MethodDescriptor @@ -211,6 +251,30 @@ class ZioFilePrinter( ) } + def printClientWithMetadataTransform( + fp: FunctionalPrinter, + method: MethodDescriptor + ): FunctionalPrinter = { + val delegate = s"self.${method.name}" + val newImpl = method.streamType match { + case StreamType.Unary => + s"f.effect($delegate(request))" + case StreamType.ServerStreaming => + s"f.stream($delegate(request))" + case StreamType.ClientStreaming => + s"""zio.ZIO.fail($Status.INTERNAL.withDescription("Transforming client-side client-streaming calls is not supported"))""" + case StreamType.Bidirectional => + s"""zio.stream.ZStream.fail($Status.INTERNAL.withDescription("Transforming client-side bidi calls is not supported"))""" + } + fp.add( + clientWithMetadataMethodSignature( + method, + inEnvType = "RR", + outEnvType = "R1 with Context1" + ) + " = " + newImpl + ) + } + def printClientTransform( fp: FunctionalPrinter, method: MethodDescriptor @@ -258,10 +322,33 @@ class ZioFilePrinter( _.print(service.getMethods().asScala.toVector)( printClientTransform ) + .add( + "// Returns a client that gives access to headers and trailers", + s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[R1, Context1] = self.withMetadata.transform[R1, Context1](f)" + ) .add( "// Returns a copy of the service with new default metadata", s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.mapCallOptionsZIO(cf), f)", - s"def withMetadataZIO[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R1, C] = ??? // transform[R, Context, R1, C](self.withMetadataZIO(headersEffect), f)", + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withMetadataZIO(headersEffect), f)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withCallOptionsZIO(callOptions), f)" + ) + ).add("}") + ).add("}") + + def clientWithMetadataTranformableService(fp: FunctionalPrinter): FunctionalPrinter = + fp.add( + s"implicit val transformableService: scalapb.zio_grpc.TransformableService[ZService] = new scalapb.zio_grpc.TransformableService[ZService] {" + ).indented( + _.add( + s"def transform[R, Context, R1, Context1](self: ZService[R, Context], f: scalapb.zio_grpc.ZTransform[R with Context, $Status, R1 with Context1]): ZService[R1, Context1] = new ZService[R1, Context1] {" + ).indented( + _.print(service.getMethods().asScala.toVector)( + printClientWithMetadataTransform + ) + .add( + "// Returns a copy of the service with new default metadata", + s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.mapCallOptionsZIO(cf), f)", + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withMetadataZIO(headersEffect), f)", s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withCallOptionsZIO(callOptions), f)" ) ).add("}") @@ -320,6 +407,88 @@ class ZioFilePrinter( ) .add("}") .add("") + .pipe(genClient) + .pipe(genClientWithMetadata) + + def genClientWithMetadata(fp: FunctionalPrinter): FunctionalPrinter = + fp + .add( + s"type ${clientWithMetadataServiceName.name} = ${clientWithMetadataServiceName.name}.Service" + ) + .add("") + .add("// accessor with metadata methods") + .add( + s"class ${accessorsWithMetadataClassName.name}[Context: zio.Tag](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsWithMetadataClassName.name}[Context]] {" + ) + .indented( + _.add(s"def this() = this(zio.ZIO.succeed($CallOptions.DEFAULT))") + .print(service.getMethods().asScala.toVector)(printAccessorWithMetadata) + .add( + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]) = new ${accessorsWithMetadataClassName.name}(callOptions.flatMap(f))" + ) + ) + .add("}") + .add("") + .add( + s"object ${clientWithMetadataServiceName.name} extends ${accessorsWithMetadataClassName.name}[Any](zio.ZIO.succeed($CallOptions.DEFAULT)) {" + ) + .indent + .add( + s"trait ZService[R, Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[R, Context]] {" + ) + .indented( + _.print(service.getMethods().asScala.toVector)( + printClientWithMetadataMethodSignature( + inEnvType = "R0", + outEnvType = "R with Context" + ) + ) + .add("") + .add( + "// Returns a copy of the service with new default metadata", + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context]", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context]" + ) + ) + .add("}") + .add(s"type Service = ZService[Any, Any]") + .add(s"type Accessors[Context] = ${accessorsClassName.fullName}[Context]") + .call(clientWithMetadataTranformableService) + .add( + s"implicit def ops[R, C](service: ZService[R, C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, R, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, R, C](service)" + ) + .add("") + .add("") + .add( + s"private[this] class ServiceStub[R, Context](channel: $ZChannel[R], options: zio.IO[$Status, $CallOptions], headers: zio.ZIO[Context, $Status, $SafeMetadata])" + ) + .add(s" extends ${clientWithMetadataServiceName.name}.ZService[R, Context] {") + .indented( + _.print(service.getMethods().asScala.toVector)( + printClientWithMetadataImpl(envType = "R with Context") + ) + .add( + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, options.flatMap(f), headers)", + s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context] = new ServiceStub(channel, options, headersEffect)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, callOptions, headers)" + ) + ) + .add("}") + .add("") + .add( + s"def scoped[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithMetadataServiceName.name}.ZService[R, Context]] = managedChannel.map {" + ) + .add(" channel => new ServiceStub[R, Context](channel, options, headers)") + .add("}") + .add("") + .add( + s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientWithMetadataServiceName.name}.ZService[Any, Context]] = zio.ZLayer.scoped[R](zio.ZIO.environmentWithZIO((r: zio.ZEnvironment[R]) => scoped[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers)))" + ) + .outdent + .add("}") + + def genClient(fp: FunctionalPrinter): FunctionalPrinter = + fp .add( s"type ${clientServiceName.name} = ${clientServiceName.name}.Service" ) @@ -352,9 +521,13 @@ class ZioFilePrinter( ) ) .add("") + .add( + "// Returns a client that gives access to headers and trailers", + s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[R, Context]" + ) .add( "// Returns a copy of the service with new default metadata", - s"def withMetadataZIO[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R, C]", + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context]", s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context]" ) ) @@ -368,7 +541,7 @@ class ZioFilePrinter( .add("") .add("") .add( - s"private[this] class ServiceStub[R, Context](channel: $ZChannel[R], options: zio.IO[$Status, $CallOptions], headers: zio.ZIO[Context, $Status, $SafeMetadata])" + s"private[this] class ServiceStub[R, Context](underlying: ${clientWithMetadataServiceName.name}.ZService[R, Context])" ) .add(s" extends ${clientServiceName.name}.ZService[R, Context] {") .indented( @@ -376,21 +549,23 @@ class ZioFilePrinter( printClientImpl(envType = "R with Context") ) .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, options.flatMap(f), headers)", - s"override def withMetadataZIO[C](headersEffect: zio.ZIO[C, $Status, $SafeMetadata]): ZService[R, C] = new ServiceStub(channel, options, headersEffect)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, callOptions, headers)" + "// Returns a client that gives access to headers and trailers", + s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[R, Context] = underlying" + ) + .add( + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(underlying.mapCallOptionsZIO(f))", + s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context] = new ServiceStub(underlying.withMetadataZIO(headersEffect))", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(underlying.withCallOptionsZIO(callOptions))" ) ) .add("}") .add("") .add( - s"def scoped[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[R, Context]] = managedChannel.map {" + s"def scoped[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[R, Context]] = ${clientWithMetadataServiceName.name}.scoped(managedChannel, options, headers).map(client => new ServiceStub(client))" ) - .add(" channel => new ServiceStub[R, Context](channel, options, headers)") - .add("}") .add("") .add( - s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = zio.ZLayer.scoped[R](zio.ZIO.environmentWithZIO((r: zio.ZEnvironment[R]) => scoped[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers)))" + s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = ${clientWithMetadataServiceName.name}.live(managedChannel, options, headers).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))" ) .outdent .add("}") @@ -420,14 +595,38 @@ class ZioFilePrinter( fp.add(sigWithoutContext + clientCall) } - def printClientImpl( + def printAccessorWithMetadata( + fp: FunctionalPrinter, + method: MethodDescriptor + ): FunctionalPrinter = { + val sigWithoutContext = + clientWithMetadataMethodSignature( + method, + inEnvType = "R0", + outEnvType = s"${clientWithMetadataServiceName.name}.ZService[Any, Context] with Context" + ) + " = " + val innerCall = s"_.withCallOptionsZIO(callOptions).${method.name}(request)" + val clientCall = method.streamType match { + case StreamType.Unary => + s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + case StreamType.ClientStreaming => + s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + case StreamType.ServerStreaming => + s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + case StreamType.Bidirectional => + s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + } + fp.add(sigWithoutContext + clientCall) + } + + def printClientWithMetadataImpl( envType: String )(fp: FunctionalPrinter, method: MethodDescriptor): FunctionalPrinter = { val clientCall = method.streamType match { - case StreamType.Unary => s"$ClientCalls.unaryCall" - case StreamType.ClientStreaming => s"$ClientCalls.clientStreamingCall" - case StreamType.ServerStreaming => s"$ClientCalls.serverStreamingCall" - case StreamType.Bidirectional => s"$ClientCalls.bidiCall" + case StreamType.Unary => s"$ClientCalls.withMetadata.unaryCall" + case StreamType.ClientStreaming => s"$ClientCalls.withMetadata.clientStreamingCall" + case StreamType.ServerStreaming => s"$ClientCalls.withMetadata.serverStreamingCall" + case StreamType.Bidirectional => s"$ClientCalls.withMetadata.bidiCall" } val prefix = method.streamType match { case StreamType.Unary => s"headers.zip(options).flatMap" @@ -438,7 +637,7 @@ class ZioFilePrinter( s"zio.stream.ZStream.fromZIO(headers.zip(options)).flatMap" } fp.add( - clientMethodSignature( + clientWithMetadataMethodSignature( method, inEnvType = "R0", outEnvType = envType @@ -452,6 +651,26 @@ class ZioFilePrinter( .outdent .add(s")}") } + + def printClientImpl( + envType: String + )(fp: FunctionalPrinter, method: MethodDescriptor): FunctionalPrinter = { + val suffix = method.streamType match { + case StreamType.Unary | StreamType.ClientStreaming => + ".map(_.response)" + case StreamType.ServerStreaming | StreamType.Bidirectional => + ".collect { case scalapb.zio_grpc.ResponseFrame.Message(message) => message }" + } + + fp.add( + clientMethodSignature( + method, + inEnvType = "R0", + outEnvType = envType + ) + s" = underlying.${method.name}(request)$suffix" + ) + } + def printBindService( fp: FunctionalPrinter, method: MethodDescriptor diff --git a/core/src/main/scala/scalapb/zio_grpc/ResponseContext.scala b/core/src/main/scala/scalapb/zio_grpc/ResponseContext.scala new file mode 100644 index 000000000..2329f9178 --- /dev/null +++ b/core/src/main/scala/scalapb/zio_grpc/ResponseContext.scala @@ -0,0 +1,9 @@ +package scalapb.zio_grpc + +import io.grpc.Metadata + +final case class ResponseContext[A]( + headers: Metadata, + response: A, + trailers: Metadata +) diff --git a/core/src/main/scala/scalapb/zio_grpc/ResponseFrame.scala b/core/src/main/scala/scalapb/zio_grpc/ResponseFrame.scala new file mode 100644 index 000000000..527086dea --- /dev/null +++ b/core/src/main/scala/scalapb/zio_grpc/ResponseFrame.scala @@ -0,0 +1,12 @@ +package scalapb.zio_grpc + +import io.grpc.Metadata +import io.grpc.Status + +sealed abstract class ResponseFrame[+A] + +object ResponseFrame { + final case class Headers(headers: Metadata) extends ResponseFrame[Nothing] + final case class Message[A](message: A) extends ResponseFrame[A] + final case class Trailers(status: Status, trailers: Metadata) extends ResponseFrame[Nothing] +} diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala index b2afa0f95..3a3c5a0a7 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala @@ -1,11 +1,138 @@ package scalapb.zio_grpc.client import io.grpc.{CallOptions, MethodDescriptor, Status} -import scalapb.zio_grpc.{SafeMetadata, ZChannel} +import scalapb.zio_grpc.{ResponseContext, ResponseFrame, SafeMetadata, ZChannel} import zio.stream.ZStream import zio.{Exit, ZIO} object ClientCalls { + object withMetadata { + + private def unaryCall[R, Req, Res]( + call: ZClientCall[R, Req, Res], + headers: SafeMetadata, + req: Req + ): ZIO[R, Status, ResponseContext[Res]] = + ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => + call.start(listener, headers) *> + call.request(1) *> + call.sendMessage(req) *> + call.halfClose() *> + listener.getValue + } + + def unaryCall[R, Req, Res]( + channel: ZChannel[R], + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: Req + ): ZIO[R, Status, ResponseContext[Res]] = + channel + .newCall(method, options) + .flatMap(unaryCall(_, headers, req)) + + private def serverStreamingCall[R, Req, Res]( + call: ZClientCall[R, Req, Res], + headers: SafeMetadata, + req: Req + ): ZStream[R, Status, ResponseFrame[Res]] = + ZStream + .acquireReleaseExitWith( + StreamingClientCallListener.make[R, Res](call) + )(anyExitHandler[R, Req, Res](call)) + .flatMap { (listener: StreamingClientCallListener[R, Res]) => + ZStream + .fromZIO( + call.start(listener, headers) *> + call.request(1) *> + call.sendMessage(req) *> + call.halfClose() + ) + .drain ++ listener.stream + } + + def serverStreamingCall[R, Req, Res]( + channel: ZChannel[R], + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: Req + ): ZStream[R, Status, ResponseFrame[Res]] = + ZStream + .fromZIO(channel.newCall(method, options)) + .flatMap(serverStreamingCall(_, headers, req)) + + private def clientStreamingCall[R, R0, Req, Res]( + call: ZClientCall[R, Req, Res], + headers: SafeMetadata, + req: ZStream[R0, Status, Req] + ): ZIO[R with R0, Status, ResponseContext[Res]] = + ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => + val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain + val resultStream = ZStream.fromZIO(listener.getValue) + + call.start(listener, headers) *> + call.request(1) *> + callStream + .merge(resultStream) + .runCollect + .map(res => res.last) + } + + def clientStreamingCall[R, R0, Req, Res]( + channel: ZChannel[R], + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: ZStream[R0, Status, Req] + ): ZIO[R with R0, Status, ResponseContext[Res]] = + channel + .newCall(method, options) + .flatMap( + clientStreamingCall( + _, + headers, + req + ) + ) + + private def bidiCall[R, R0, Req, Res]( + call: ZClientCall[R, Req, Res], + headers: SafeMetadata, + req: ZStream[R0, Status, Req] + ): ZStream[R with R0, Status, ResponseFrame[Res]] = + ZStream + .acquireReleaseExitWith( + StreamingClientCallListener.make[R, Res](call) + )(anyExitHandler(call)) + .flatMap { (listener: StreamingClientCallListener[R, Res]) => + val init = + ZStream + .fromZIO( + call.start(listener, headers) *> + call.request(1) + ) + val finish = ZStream.fromZIO(call.halfClose()) + val sendRequestStream = (init ++ req.tap(call.sendMessage) ++ finish).drain + sendRequestStream.merge(listener.stream, ZStream.HaltStrategy.Right) + } + + def bidiCall[R, R0, Req, Res]( + channel: ZChannel[R], + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: ZStream[R0, Status, Req] + ): ZStream[R with R0, Status, ResponseFrame[Res]] = + ZStream + .fromZIO( + channel.newCall(method, options) + ) + .flatMap(bidiCall(_, headers, req)) + + } + def exitHandler[R, Req, Res]( call: ZClientCall[R, Req, Res] )(l: Any, ex: Exit[Status, Any]) = anyExitHandler(call)(l, ex) @@ -26,22 +153,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZIO[R, Status, Res] = - channel - .newCall(method, options) - .flatMap(unaryCall(_, headers, req)) - - private def unaryCall[R, Req, Res]( - call: ZClientCall[R, Req, Res], - headers: SafeMetadata, - req: Req - ): ZIO[R, Status, Res] = - ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => - call.start(listener, headers) *> - call.request(1) *> - call.sendMessage(req) *> - call.halfClose() *> - listener.getValue.map(_._2) - } + withMetadata.unaryCall(channel, method, options, headers, req).map(_.response) def serverStreamingCall[R, Req, Res]( channel: ZChannel[R], @@ -50,29 +162,9 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[R, Status, Res] = - ZStream - .fromZIO(channel.newCall(method, options)) - .flatMap(serverStreamingCall(_, headers, req)) - - private def serverStreamingCall[R, Req, Res]( - call: ZClientCall[R, Req, Res], - headers: SafeMetadata, - req: Req - ): ZStream[R, Status, Res] = - ZStream - .acquireReleaseExitWith( - StreamingClientCallListener.make[R, Res](call) - )(anyExitHandler[R, Req, Res](call)) - .flatMap { (listener: StreamingClientCallListener[R, Res]) => - ZStream - .fromZIO( - call.start(listener, headers) *> - call.request(1) *> - call.sendMessage(req) *> - call.halfClose() - ) - .drain ++ listener.stream - } + withMetadata + .serverStreamingCall(channel, method, options, headers, req) + .collect { case ResponseFrame.Message(x) => x } def clientStreamingCall[R, R0, Req, Res]( channel: ZChannel[R], @@ -81,32 +173,7 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZIO[R with R0, Status, Res] = - channel - .newCall(method, options) - .flatMap( - clientStreamingCall( - _, - headers, - req - ) - ) - - private def clientStreamingCall[R, R0, Req, Res]( - call: ZClientCall[R, Req, Res], - headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZIO[R with R0, Status, Res] = - ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => - val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain - val resultStream = ZStream.fromZIO(listener.getValue) - - call.start(listener, headers) *> - call.request(1) *> - callStream - .merge(resultStream) - .runCollect - .map(res => res.last._2) - } + withMetadata.clientStreamingCall(channel, method, options, headers, req).map(_.response) def bidiCall[R, R0, Req, Res]( channel: ZChannel[R], @@ -115,29 +182,7 @@ object ClientCalls { headers: SafeMetadata, req: ZStream[R0, Status, Req] ): ZStream[R with R0, Status, Res] = - ZStream - .fromZIO( - channel.newCall(method, options) - ) - .flatMap(bidiCall(_, headers, req)) - - private def bidiCall[R, R0, Req, Res]( - call: ZClientCall[R, Req, Res], - headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZStream[R with R0, Status, Res] = - ZStream - .acquireReleaseExitWith( - StreamingClientCallListener.make[R, Res](call) - )(anyExitHandler(call)) - .flatMap { (listener: StreamingClientCallListener[R, Res]) => - val init = ZStream - .fromZIO( - call.start(listener, headers) *> - call.request(1) - ) - val sendRequestStream = (init ++ req.tap(call.sendMessage) ++ ZStream - .fromZIO(call.halfClose())).drain - sendRequestStream.merge(listener.stream) - } + withMetadata + .bidiCall(channel, method, options, headers, req) + .collect { case ResponseFrame.Message(x) => x } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 487edb55d..1993526b5 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -1,62 +1,45 @@ package scalapb.zio_grpc.client -import zio.{Queue, Ref, Runtime, URIO, ZIO} +import zio.{Queue, Runtime, URIO, ZIO} +import scalapb.zio_grpc.ResponseFrame import io.grpc.ClientCall import io.grpc.{Metadata, Status} -import StreamingCallState._ import zio.stream.ZStream import zio._ -sealed trait StreamingCallState[+Res] - -object StreamingCallState { - case object Initial extends StreamingCallState[Nothing] - - case class HeadersReceived[Res](headers: Metadata) extends StreamingCallState[Res] - - case class Failure[Res](s: String) extends StreamingCallState[Res] -} - class StreamingClientCallListener[R, Res]( runtime: Runtime[R], call: ZClientCall[R, _, Res], - state: Ref[StreamingCallState[Res]], - queue: Queue[Either[(Status, Metadata), Res]] + queue: Queue[ResponseFrame[Res]] ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = Unsafe.unsafe { implicit u => runtime.unsafe .run( - state.update { - case Initial => HeadersReceived(headers) - case HeadersReceived(_) => Failure("onHeaders already called") - case f @ Failure(_) => f - }.unit + queue + .offer(ResponseFrame.Headers(headers)) + .unit ) .getOrThrowFiberFailure() } override def onMessage(message: Res): Unit = Unsafe.unsafe { implicit u => - runtime.unsafe.run(queue.offer(Right(message)) *> call.request(1)).getOrThrowFiberFailure() + runtime.unsafe.run(queue.offer(ResponseFrame.Message(message)) *> call.request(1)).getOrThrowFiberFailure() } override def onClose(status: Status, trailers: Metadata): Unit = Unsafe.unsafe { implicit u => - runtime.unsafe.run(queue.offer(Left((status, trailers))).unit).getOrThrowFiberFailure() + runtime.unsafe.run(queue.offer(ResponseFrame.Trailers(status, trailers)).unit).getOrThrowFiberFailure() } - def stream: ZStream[Any, Status, Res] = + def stream: ZStream[Any, Status, ResponseFrame[Res]] = ZStream .fromQueue(queue) .tap { - case Left((status, trailers @ _)) => - queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(status)) - case _ => ZIO.unit - } - .collect { case Right(v) => - v + case ResponseFrame.Trailers(status, _) => queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(status)) + case _ => ZIO.unit } } @@ -66,7 +49,6 @@ object StreamingClientCallListener { ): URIO[R, StreamingClientCallListener[R, Res]] = for { runtime <- zio.ZIO.runtime[R] - state <- Ref.make[StreamingCallState[Res]](Initial) - queue <- Queue.unbounded[Either[(Status, Metadata), Res]] - } yield new StreamingClientCallListener(runtime, call, state, queue) + queue <- Queue.unbounded[ResponseFrame[Res]] + } yield new StreamingClientCallListener(runtime, call, queue) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index 5209478b1..00c82740a 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -4,6 +4,7 @@ import zio.{IO, Promise, Ref, Runtime, Unsafe} import io.grpc.ClientCall import io.grpc.{Metadata, Status} import UnaryCallState._ +import scalapb.zio_grpc.ResponseContext sealed trait UnaryCallState[+Res] @@ -20,7 +21,7 @@ object UnaryCallState { class UnaryClientCallListener[Res]( runtime: Runtime[Any], state: Ref[UnaryCallState[Res]], - promise: Promise[Status, (Metadata, Res)] + promise: Promise[Status, ResponseContext[Res]] ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = @@ -62,7 +63,7 @@ class UnaryClientCallListener[Res]( else s match { case ResponseReceived(headers, message) => - promise.succeed((headers, message)) + promise.succeed(ResponseContext(headers, message, trailers)) case Failure(errorMessage) => promise.fail(Status.INTERNAL.withDescription(errorMessage)) case _ => @@ -75,7 +76,7 @@ class UnaryClientCallListener[Res]( .getOrThrowFiberFailure() } - def getValue: IO[Status, (Metadata, Res)] = promise.await + def getValue: IO[Status, ResponseContext[Res]] = promise.await } object UnaryClientCallListener { @@ -83,6 +84,6 @@ object UnaryClientCallListener { for { runtime <- zio.ZIO.runtime[Any] state <- Ref.make[UnaryCallState[Res]](Initial) - promise <- Promise.make[Status, (Metadata, Res)] + promise <- Promise.make[Status, ResponseContext[Res]] } yield new UnaryClientCallListener[Res](runtime, state, promise) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 9208feb71..027bf6a0a 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc import zio.test._ import zio._ -import testservice.ZioTestservice.TestServiceClient +import testservice.ZioTestservice.{TestServiceClient, TestServiceClientWithMetadata} import testservice.ZioTestservice.ZTestService import testservice._ import io.grpc.ServerBuilder @@ -14,48 +14,62 @@ import zio.stream.ZStream object EnvSpec extends ZIOSpecDefault with MetadataTests { case class User(name: String) - val getUser = ZIO.environmentWith[User](_.get) + case class Context(user: User, response: SafeMetadata) - object ServiceWithConsole extends ZTestService[Any, User] { - def unary(request: Request): ZIO[User, Status, Response] = + val getUser = ZIO.serviceWith[Context](_.user) + val getResponseMetadata = ZIO.serviceWith[Context](_.response) + + object ServiceWithConsole extends ZTestService[Any, Context] { + def unary(request: Request): ZIO[Context, Status, Response] = for { user <- getUser + md <- getResponseMetadata + _ <- md.put(RequestIdKey, "1") } yield Response(out = user.name) def serverStreaming( request: Request - ): ZStream[User, Status, Response] = - ZStream.environmentWithStream { (u: ZEnvironment[User]) => - ZStream( - Response(u.get.name), - Response(u.get.name) - ) + ): ZStream[Context, Status, Response] = + ZStream.environmentWithStream { (u: ZEnvironment[Context]) => + ZStream + .fromZIO( + u.get.response.put(RequestIdKey, "1") + ) + .drain ++ + ZStream( + Response(u.get.user.name), + Response(u.get.user.name) + ) } def clientStreaming( request: zio.stream.ZStream[Any, Status, Request] - ): ZIO[User, Status, Response] = getUser.map(n => Response(n.name)) + ): ZIO[Context, Status, Response] = + for { + n <- getUser + md <- getResponseMetadata + _ <- md.put(RequestIdKey, "1") + } yield Response(n.name) def bidiStreaming( request: zio.stream.ZStream[Any, Status, Request] - ): ZStream[User, Status, Response] = - ZStream.environmentWithStream { (u: ZEnvironment[User]) => - ZStream( - Response(u.get.name) - ) + ): ZStream[Context, Status, Response] = + ZStream.environmentWithStream { (u: ZEnvironment[Context]) => + ZStream.fromZIO(u.get.response.put(RequestIdKey, "1")).drain ++ ZStream(Response(u.get.user.name)) + } } val UserKey = Metadata.Key.of("user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) - def parseUser(rc: RequestContext): IO[Status, User] = + def parseUser(rc: RequestContext): IO[Status, Context] = rc.metadata.get(UserKey).flatMap { case Some("alice") => ZIO.fail( Status.PERMISSION_DENIED.withDescription("You are not allowed!") ) - case Some(name) => ZIO.succeed(User(name)) + case Some(name) => ZIO.succeed(Context(User(name), rc.responseMetadata)) case None => ZIO.fail(Status.UNAUTHENTICATED) } @@ -83,10 +97,27 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { } } + override def clientMetadataLayer: URLayer[Server, TestServiceClientWithMetadata] = + ZLayer.scoped { + ZIO.environmentWithZIO { (ss: ZEnvironment[Server.Service]) => + ss.get[Server.Service].port.orDie flatMap { (port: Int) => + val ch = ZManagedChannel( + ManagedChannelBuilder.forAddress("localhost", port).usePlaintext(), + Seq( + ZClientInterceptor.headersUpdater((_, _, md) => md.put(UserKey, "bob").unit) + ) + ) + TestServiceClientWithMetadata + .scoped(ch) + .orDie + } + } + } + val layers = serviceLayer >>> (serverLayer ++ Annotations.live) def spec = suite("EnvSpec")( - specs: _* + specs ).provideLayer(layers.orDie) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala index ec3d5302d..d9677a095 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala @@ -1,19 +1,25 @@ package scalapb.zio_grpc -import zio.ZLayer -import zio.test._ +import zio.test.{test, _} import zio.test.Assertion._ import zio.stream.ZStream +import io.grpc.Metadata import io.grpc.Status import TestUtils._ import scalapb.zio_grpc.testservice._ import scalapb.zio_grpc.testservice.ZioTestservice._ +import zio._ trait MetadataTests { def clientLayer( userName: Option[String] ): ZLayer[Server, Nothing, TestServiceClient] + def clientMetadataLayer: ZLayer[Server, Nothing, TestServiceClientWithMetadata] + + val RequestIdKey = + Metadata.Key.of("request-id", io.grpc.Metadata.ASCII_STRING_MARSHALLER) + val authClient = clientLayer(Some("bob")) val unauthClient = clientLayer(Some("alice")) val unsetClient = clientLayer(None) @@ -27,6 +33,36 @@ trait MetadataTests { val clientStreamingEffect = TestServiceClient.clientStreaming(ZStream.empty) val bidiEffect = TestServiceClient.bidiStreaming(ZStream.empty).runCollect + val unaryEffectWithMd = + ZioTestservice.TestServiceClientWithMetadata.unary(Request()) + val serverStreamingEffectWithMd = + ZioTestservice.TestServiceClientWithMetadata.serverStreaming(Request()).runCollect + val clientStreamingEffectWithMd = + ZioTestservice.TestServiceClientWithMetadata.clientStreaming(ZStream.empty) + val bidiEffectWithMd = + ZioTestservice.TestServiceClientWithMetadata.bidiStreaming(ZStream.empty).runCollect + + val properTrailer = Assertion.assertion[Metadata]("trailers") { md => + md.containsKey(RequestIdKey) && md.get(RequestIdKey) == "1" + } + + val properHeader = Assertion.assertion[Metadata]("headers") { md => + val keys = md.keys() + keys.contains("content-type") && keys.contains("grpc-encoding") && keys.contains("grpc-accept-encoding") + } + + def checkHeaderFrame(r: ResponseFrame[Response]) = + assert(r.isInstanceOf[ResponseFrame.Headers])(isTrue) && + assert(r.asInstanceOf[ResponseFrame.Headers].headers)(properHeader) + + def checkTrailerFrame(r: ResponseFrame[Response]) = + assert(r.isInstanceOf[ResponseFrame.Trailers])(isTrue) && + assert(r.asInstanceOf[ResponseFrame.Trailers].trailers)(properTrailer) + + def checkMessageFrame(r: ResponseFrame[Response]) = + assert(r.isInstanceOf[ResponseFrame.Message[Response]])(isTrue) && + assert(r.asInstanceOf[ResponseFrame.Message[Response]].message)(equalTo(Response("bob"))) + def permissionDeniedSuite = suite("unauthorized request fail for")( test("unary") { @@ -60,7 +96,7 @@ trait MetadataTests { ).provideLayer(unsetClient) def authenticatedSuite = - suite("authorized request fail for")( + suite("authorized request")( test("unary") { assertZIO(unaryEffect)(equalTo(Response("bob"))) }, @@ -77,9 +113,47 @@ trait MetadataTests { } ).provideLayer(authClient) - val specs = Seq( + def metadataSuite = + suite("response metadata")( + test("unary") { + for { + result <- unaryEffectWithMd + ResponseContext(headers, response, trailers) = result + } yield assert(response)(equalTo(Response("bob"))) && + assert(headers)(properHeader) && + assert(trailers)(properTrailer) + }, + test("server streaming") { + for { + result <- serverStreamingEffectWithMd + } yield assert(result.size)(equalTo(4)) && + checkHeaderFrame(result(0)) && + checkMessageFrame(result(1)) && + checkMessageFrame(result(2)) && + checkTrailerFrame(result(3)) + }, + test("client streaming") { + for { + result <- unaryEffectWithMd + ResponseContext(headers, response, trailers) = result + } yield assert(response)(equalTo(Response("bob"))) && + assert(headers)(properHeader) && + assert(trailers)(properTrailer) + }, + test("bidi streaming") { + for { + result <- bidiEffectWithMd + Chunk(headers, message, trailers) = result + } yield checkHeaderFrame(headers) && + checkMessageFrame(message) && + checkTrailerFrame(trailers) + } + ).provideLayer(clientMetadataLayer) + + val specs = suite("Metadata")( permissionDeniedSuite, unauthenticatedSuite, - authenticatedSuite - ) + authenticatedSuite, + metadataSuite + ) @@ TestAspect.timeout(10.seconds) } From 281c5b3d4e68b8452b9f04b637b6a641ad80f3c7 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 24 Oct 2022 00:02:44 +0200 Subject: [PATCH 061/245] Update scala-library to 2.12.17 (#433) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 240e7a69c..c13e9026a 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ val Scala3 = "3.2.0" val Scala213 = "2.13.8" -val Scala212 = "2.12.16" +val Scala212 = "2.12.17" val ScalaVersions = Seq(Scala212, Scala213, Scala3) From 6ab947d5b1dc978162db220010af9a6406eec2d6 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 24 Oct 2022 00:14:12 +0200 Subject: [PATCH 062/245] Update sbt to 1.7.2 (#435) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 22af2628c..563a014da 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.1 +sbt.version=1.7.2 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 22af2628c..563a014da 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.1 +sbt.version=1.7.2 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 22af2628c..563a014da 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.1 +sbt.version=1.7.2 diff --git a/project/build.properties b/project/build.properties index 22af2628c..563a014da 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.1 +sbt.version=1.7.2 From 451441110c612f8e05fa24f2382745892261fe17 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 24 Oct 2022 00:19:21 +0200 Subject: [PATCH 063/245] Update mdoc, sbt-mdoc to 2.3.6 (#436) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 2c5ce6ac1..6df5797da 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.3") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.6") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.8.0") From 91e20ae04939f7e28c7cff966b2c8448f7d4e791 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 3 Nov 2022 00:05:22 +0100 Subject: [PATCH 064/245] Update compilerplugin, scalapb-runtime, ... to 0.11.12 (#437) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 6df5797da..87678b3b7 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.11" +libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.12" addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") From 2c8fdc520f805a7513e2b93120de5bd60b2910af Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 3 Nov 2022 00:15:52 +0100 Subject: [PATCH 065/245] Update sbt to 1.7.3 (#439) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 563a014da..6a9f03889 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.2 +sbt.version=1.7.3 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 563a014da..6a9f03889 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.2 +sbt.version=1.7.3 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 563a014da..6a9f03889 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.2 +sbt.version=1.7.3 diff --git a/project/build.properties b/project/build.properties index 563a014da..6a9f03889 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.2 +sbt.version=1.7.3 From 41b5010aae373031aac7c6160e86e5e644090ab1 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 8 Nov 2022 23:55:21 +0100 Subject: [PATCH 066/245] Update scala3-library to 3.2.1 (#440) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index c13e9026a..2a2c34286 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import Settings.stdSettings -val Scala3 = "3.2.0" +val Scala3 = "3.2.1" val Scala213 = "2.13.8" From 8284fc978b6320edad1b16875d9caf1edbc9a5e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Nov 2022 08:15:13 -0800 Subject: [PATCH 067/245] Bump loader-utils from 2.0.2 to 2.0.3 in /website (#441) Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.3/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.2...v2.0.3) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index 4262fa9b7..5272b5a73 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -4860,9 +4860,9 @@ loader-runner@^4.2.0: integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + version "2.0.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.3.tgz#d4b15b8504c63d1fc3f2ade52d41bc8459d6ede1" + integrity sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" From 02fa5f699e491fd5f9f712f0d492a84e1aaaa17e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 08:47:43 -0800 Subject: [PATCH 068/245] Move examples loop to a script --- .github/workflows/ci.yml | 3 +-- .github/workflows/test_examples.sh | 9 +++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100755 .github/workflows/test_examples.sh diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4db6ee7dc..88629c179 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,8 +41,7 @@ jobs: - name: Examples run: | - cd examples - for d in */ ; do cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test && cd ../ ; done + .github/workflows/test_examples.sh # Single final job for mergify. ci-passed: diff --git a/.github/workflows/test_examples.sh b/.github/workflows/test_examples.sh new file mode 100755 index 000000000..1f381c9bc --- /dev/null +++ b/.github/workflows/test_examples.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -e +cd examples + +for d in */ +do + echo "** Running test for examples/$d" + ( cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test ) +done From 131e5df25d542c92e04bab221ca7f2d5933408b6 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 08:54:52 -0800 Subject: [PATCH 069/245] Fix resolves deprecation in sbt --- examples/helloworld/build.sbt | 2 +- examples/routeguide/build.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index 574781a90..f4ac05453 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -1,6 +1,6 @@ scalaVersion := "2.13.8" -resolvers += Resolver.sonatypeRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.47.0" diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 2f8f60705..957fb8609 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -1,6 +1,6 @@ scalaVersion := "2.13.8" -resolvers += Resolver.sonatypeRepo("snapshots") +resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.47.0" From 4a3e05debdac7ee0a0f296ee9b0f0fbf0beeb830 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 13 Nov 2022 17:55:14 +0100 Subject: [PATCH 070/245] Update sbt to 1.8.0 (#443) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 6a9f03889..8b9a0b0ab 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.0 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 6a9f03889..8b9a0b0ab 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.0 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 6a9f03889..8b9a0b0ab 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.0 diff --git a/project/build.properties b/project/build.properties index 6a9f03889..8b9a0b0ab 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.0 From 9e12133e2f7387f517792fe87b0217f8df235575 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 13 Nov 2022 17:55:25 +0100 Subject: [PATCH 071/245] Update scala-library to 2.13.10 (#434) --- build.sbt | 2 +- examples/fullapp/build.sbt | 6 +++--- examples/helloworld/build.sbt | 6 +++--- examples/routeguide/build.sbt | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index 2a2c34286..ed9d143bf 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ import Settings.stdSettings val Scala3 = "3.2.1" -val Scala213 = "2.13.8" +val Scala213 = "2.13.10" val Scala212 = "2.12.17" diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 63c28940a..2e5e5773f 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -1,6 +1,6 @@ ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") -ThisBuild / scalaVersion := "2.13.8" +ThisBuild / scalaVersion := "2.13.10" ThisBuild / cancelable := true @@ -11,8 +11,8 @@ val grpcVersion = "1.47.0" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) .settings( - Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + Compile / PB.targets := Seq( + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ), Compile / PB.protoSources := Seq( diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index f4ac05453..2342b5dea 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -1,16 +1,16 @@ -scalaVersion := "2.13.8" +scalaVersion := "2.13.10" resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.47.0" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 957fb8609..67e56094a 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -1,18 +1,18 @@ -scalaVersion := "2.13.8" +scalaVersion := "2.13.10" resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.47.0" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" ) run / fork := true From fcae1bdd2e29875b9732667bac36be54b534da15 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 08:59:24 -0800 Subject: [PATCH 072/245] Update formatting for fullapp/build.sbt --- examples/fullapp/build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 2e5e5773f..62e32468e 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -11,8 +11,8 @@ val grpcVersion = "1.47.0" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) .settings( - Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + Compile / PB.targets := Seq( + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ), Compile / PB.protoSources := Seq( From 6e7e742785e9aa61bef6820f7b50b338bd394ac7 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:03:28 -0800 Subject: [PATCH 073/245] Update formatting for other examples and fix sbt deprecation warning --- .github/workflows/test_examples.sh | 2 +- examples/helloworld/build.sbt | 4 ++-- examples/routeguide/build.sbt | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test_examples.sh b/.github/workflows/test_examples.sh index 1f381c9bc..a24cb5909 100755 --- a/.github/workflows/test_examples.sh +++ b/.github/workflows/test_examples.sh @@ -5,5 +5,5 @@ cd examples for d in */ do echo "** Running test for examples/$d" - ( cd "$d" && sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck test ) + ( cd "$d" && sbt scalafmtCheck Test/scalafmtCheck scalafmtSbtCheck test ) done diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index 2342b5dea..dad879076 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -5,12 +5,12 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.47.0" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 67e56094a..266ad8012 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -5,14 +5,14 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.47.0" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" ) run / fork := true From aa428ea15dcfe3d8ac443999fe9fc561a3f916a0 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:09:52 -0800 Subject: [PATCH 074/245] Revert "Update sbt to 1.8.0 (#443)" Due to sbt/sbt#7076 This reverts commit 4a3e05debdac7ee0a0f296ee9b0f0fbf0beeb830. --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 8b9a0b0ab..6a9f03889 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.0 +sbt.version=1.7.3 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 8b9a0b0ab..6a9f03889 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.0 +sbt.version=1.7.3 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 8b9a0b0ab..6a9f03889 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.0 +sbt.version=1.7.3 diff --git a/project/build.properties b/project/build.properties index 8b9a0b0ab..6a9f03889 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.0 +sbt.version=1.7.3 From 4ebb17fd86fdf5f1efc7f2f2d272be1f66cea72e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:12:04 -0800 Subject: [PATCH 075/245] Fix sbt syntax deprecation --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88629c179..3a35282e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,7 +28,7 @@ jobs: - name: Formatting run: | - sbt scalafmtCheck test:scalafmtCheck scalafmtSbtCheck + sbt scalafmtCheck Test/scalafmtCheck scalafmtSbtCheck - name: Compile and test (JVM) run: | From 94e70c8d73b027d3ec4e9559581c8edbadd43862 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:26:26 -0800 Subject: [PATCH 076/245] Update Scala.js --- examples/fullapp/project/plugins.sbt | 2 +- project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 1d3a2e31b..6f2f20ef7 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -12,7 +12,7 @@ libraryDependencies ++= Seq( ) // For Scala.js: -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") diff --git a/project/plugins.sbt b/project/plugins.sbt index 87678b3b7..a0a188e8c 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -10,7 +10,7 @@ addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.8.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") From 023007823d9eb4cd2c925b6435548c778203ff4f Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:34:35 -0800 Subject: [PATCH 077/245] Update docusaurus --- website/package.json | 4 +- website/yarn.lock | 2461 +++++++++++++++++++++++++++++------------- 2 files changed, 1742 insertions(+), 723 deletions(-) diff --git a/website/package.json b/website/package.json index 8d03930d3..9aa8cd0df 100644 --- a/website/package.json +++ b/website/package.json @@ -9,8 +9,8 @@ "deploy": "docusaurus deploy" }, "dependencies": { - "@docusaurus/core": "2.0.0-beta.20", - "@docusaurus/preset-classic": "2.0.0-beta.20", + "@docusaurus/core": "^2.2.0", + "@docusaurus/preset-classic": "^2.2.0", "clsx": "^1.1.1", "react": "^16.14.0", "react-dom": "^16.14.0" diff --git a/website/yarn.lock b/website/yarn.lock index 5272b5a73..a0d338dc5 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2,17 +2,24 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.6.3.tgz#76832fffb6405ac2c87bac5a040b8a31a1cdef80" - integrity sha512-dqQqRt01fX3YuVFrkceHsoCnzX0bLhrrg8itJI1NM68KjrPYQPYsE+kY8EZTCM4y8VDnhqJErR73xe/ZsV+qAA== +"@algolia/autocomplete-core@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz#8abbed88082f611997538760dffcb43b33b1fd1d" + integrity sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw== dependencies: - "@algolia/autocomplete-shared" "1.6.3" + "@algolia/autocomplete-shared" "1.7.2" -"@algolia/autocomplete-shared@1.6.3": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.6.3.tgz#52085ce89a755977841ed0a463aa31ce8f1dea97" - integrity sha512-UV46bnkTztyADFaETfzFC5ryIdGVb2zpAoYgu0tfcuYWjhg1KbLXveFffZIrGVoboqmAk1b+jMrl6iCja1i3lg== +"@algolia/autocomplete-preset-algolia@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz#9cd4f64b3d64399657ee2dc2b7e0a939e0713a26" + integrity sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw== + dependencies: + "@algolia/autocomplete-shared" "1.7.2" + +"@algolia/autocomplete-shared@1.7.2": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz#daa23280e78d3b42ae9564d12470ae034db51a89" + integrity sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug== "@algolia/cache-browser-local-storage@4.13.1": version "4.13.1" @@ -21,11 +28,23 @@ dependencies: "@algolia/cache-common" "4.13.1" +"@algolia/cache-browser-local-storage@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz#d5b1b90130ca87c6321de876e167df9ec6524936" + integrity sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA== + dependencies: + "@algolia/cache-common" "4.14.2" + "@algolia/cache-common@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.13.1.tgz#c933fdec9f73b4f7c69d5751edc92eee4a63d76b" integrity sha512-7Vaf6IM4L0Jkl3sYXbwK+2beQOgVJ0mKFbz/4qSxKd1iy2Sp77uTAazcX+Dlexekg1fqGUOSO7HS4Sx47ZJmjA== +"@algolia/cache-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.14.2.tgz#b946b6103c922f0c06006fb6929163ed2c67d598" + integrity sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg== + "@algolia/cache-in-memory@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.13.1.tgz#c19baa67b4597e1a93e987350613ab3b88768832" @@ -33,6 +52,13 @@ dependencies: "@algolia/cache-common" "4.13.1" +"@algolia/cache-in-memory@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz#88e4a21474f9ac05331c2fa3ceb929684a395a24" + integrity sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ== + dependencies: + "@algolia/cache-common" "4.14.2" + "@algolia/client-account@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.13.1.tgz#fea591943665477a23922ab31863ad0732e26c66" @@ -42,6 +68,15 @@ "@algolia/client-search" "4.13.1" "@algolia/transporter" "4.13.1" +"@algolia/client-account@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.14.2.tgz#b76ac1ba9ea71e8c3f77a1805b48350dc0728a16" + integrity sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w== + dependencies: + "@algolia/client-common" "4.14.2" + "@algolia/client-search" "4.14.2" + "@algolia/transporter" "4.14.2" + "@algolia/client-analytics@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.13.1.tgz#5275956b2d0d16997148f2085f1701b6c39ecc32" @@ -52,6 +87,16 @@ "@algolia/requester-common" "4.13.1" "@algolia/transporter" "4.13.1" +"@algolia/client-analytics@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.14.2.tgz#ca04dcaf9a78ee5c92c5cb5e9c74cf031eb2f1fb" + integrity sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ== + dependencies: + "@algolia/client-common" "4.14.2" + "@algolia/client-search" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" + "@algolia/client-common@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.13.1.tgz#3bf9e3586f20ef85bbb56ccca390f7dbe57c8f4f" @@ -60,6 +105,14 @@ "@algolia/requester-common" "4.13.1" "@algolia/transporter" "4.13.1" +"@algolia/client-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.14.2.tgz#e1324e167ffa8af60f3e8bcd122110fd0bfd1300" + integrity sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q== + dependencies: + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" + "@algolia/client-personalization@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.13.1.tgz#438a1f58576ef19c4ad4addb8417bdacfe2fce2e" @@ -69,6 +122,15 @@ "@algolia/requester-common" "4.13.1" "@algolia/transporter" "4.13.1" +"@algolia/client-personalization@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.14.2.tgz#656bbb6157a3dd1a4be7de65e457fda136c404ec" + integrity sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw== + dependencies: + "@algolia/client-common" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" + "@algolia/client-search@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.13.1.tgz#5501deed01e23c33d4aaa9f9eb96a849f0fce313" @@ -78,6 +140,15 @@ "@algolia/requester-common" "4.13.1" "@algolia/transporter" "4.13.1" +"@algolia/client-search@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.14.2.tgz#357bdb7e640163f0e33bad231dfcc21f67dc2e92" + integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== + dependencies: + "@algolia/client-common" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/transporter" "4.14.2" + "@algolia/events@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" @@ -88,6 +159,11 @@ resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.13.1.tgz#4221378e701e3f1eacaa051bcd4ba1f25ddfaf4d" integrity sha512-L6slbL/OyZaAXNtS/1A8SAbOJeEXD5JcZeDCPYDqSTYScfHu+2ePRTDMgUTY4gQ7HsYZ39N1LujOd8WBTmM2Aw== +"@algolia/logger-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.14.2.tgz#b74b3a92431f92665519d95942c246793ec390ee" + integrity sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA== + "@algolia/logger-console@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.13.1.tgz#423d358e4992dd4bceab0d9a4e99d1fd68107043" @@ -95,6 +171,13 @@ dependencies: "@algolia/logger-common" "4.13.1" +"@algolia/logger-console@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.14.2.tgz#ec49cb47408f5811d4792598683923a800abce7b" + integrity sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g== + dependencies: + "@algolia/logger-common" "4.14.2" + "@algolia/requester-browser-xhr@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.13.1.tgz#f8ea79233cf6f0392feaf31e35a6b40d68c5bc9e" @@ -102,11 +185,23 @@ dependencies: "@algolia/requester-common" "4.13.1" +"@algolia/requester-browser-xhr@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz#a2cd4d9d8d90d53109cc7f3682dc6ebf20f798f2" + integrity sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw== + dependencies: + "@algolia/requester-common" "4.14.2" + "@algolia/requester-common@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.13.1.tgz#daea143d15ab6ed3909c4c45877f1b6c36a16179" integrity sha512-eGVf0ID84apfFEuXsaoSgIxbU3oFsIbz4XiotU3VS8qGCJAaLVUC5BUJEkiFENZIhon7hIB4d0RI13HY4RSA+w== +"@algolia/requester-common@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.14.2.tgz#bc4e9e5ee16c953c0ecacbfb334a33c30c28b1a1" + integrity sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg== + "@algolia/requester-node-http@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.13.1.tgz#32c63d4c009f22d97e396406de7af9b66fb8e89d" @@ -114,6 +209,13 @@ dependencies: "@algolia/requester-common" "4.13.1" +"@algolia/requester-node-http@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz#7c1223a1785decaab1def64c83dade6bea45e115" + integrity sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg== + dependencies: + "@algolia/requester-common" "4.14.2" + "@algolia/transporter@4.13.1": version "4.13.1" resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.13.1.tgz#509e03e9145102843d5be4a031c521f692d4e8d6" @@ -123,6 +225,15 @@ "@algolia/logger-common" "4.13.1" "@algolia/requester-common" "4.13.1" +"@algolia/transporter@4.14.2": + version "4.14.2" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.14.2.tgz#77c069047fb1a4359ee6a51f51829508e44a1e3d" + integrity sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ== + dependencies: + "@algolia/cache-common" "4.14.2" + "@algolia/logger-common" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -138,11 +249,23 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" + integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== + "@babel/core@7.12.9": version "7.12.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" @@ -165,7 +288,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/core@^7.15.5", "@babel/core@^7.17.10": +"@babel/core@^7.15.5": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.0.tgz#c58d04d7c6fbfb58ea7681e2b9145cfb62726756" integrity sha512-Xyw74OlJwDijToNi0+6BBI5mLLR5+5R3bcSH80LXzjzEGEUlvNzujEE71BaD/ApEZHAvFI/Mlmp4M5lIkdeeWw== @@ -186,7 +309,28 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.5", "@babel/generator@^7.17.10", "@babel/generator@^7.18.0": +"@babel/core@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" + integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.2" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.1" + "@babel/parser" "^7.20.2" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.12.5", "@babel/generator@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.0.tgz#46d28e8a18fc737b028efb25ab105d74473af43f" integrity sha512-81YO9gGx6voPXlvYdZBliFXAZU8vZ9AZ6z+CjlmcnaeOcYSFbMTpdeDUO9xD9dh/68Vq03I8ZspfUTPfitcDHg== @@ -195,6 +339,15 @@ "@jridgewell/gen-mapping" "^0.3.0" jsesc "^2.5.1" +"@babel/generator@^7.18.7", "@babel/generator@^7.20.1", "@babel/generator@^7.20.2": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" + integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== + dependencies: + "@babel/types" "^7.20.2" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" @@ -202,6 +355,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" @@ -210,6 +370,14 @@ "@babel/helper-explode-assignable-expression" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" + integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" + "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10": version "7.17.10" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" @@ -220,6 +388,16 @@ browserslist "^4.20.2" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== + dependencies: + "@babel/compat-data" "^7.20.0" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" @@ -233,6 +411,19 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" + integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" @@ -241,6 +432,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" regexpu-core "^5.0.1" +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" + integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" + "@babel/helper-define-polyfill-provider@^0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" @@ -255,6 +454,18 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" + integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + dependencies: + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-environment-visitor@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" @@ -262,6 +473,11 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/helper-explode-assignable-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" @@ -269,6 +485,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-explode-assignable-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" + integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" @@ -277,6 +500,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.17.0" +"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + "@babel/helper-hoist-variables@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" @@ -284,6 +515,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" @@ -291,6 +529,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-member-expression-to-functions@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" @@ -298,6 +543,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" @@ -312,6 +564,20 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" + "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" @@ -319,6 +585,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-optimise-call-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" + integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-plugin-utils@7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" @@ -329,6 +602,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== +"@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-remap-async-to-generator@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" @@ -338,6 +616,16 @@ "@babel/helper-wrap-function" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" + integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-wrap-function" "^7.18.9" + "@babel/types" "^7.18.9" + "@babel/helper-replace-supers@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" @@ -349,6 +637,17 @@ "@babel/traverse" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" + integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.19.1" + "@babel/types" "^7.19.0" + "@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" @@ -356,6 +655,13 @@ dependencies: "@babel/types" "^7.17.0" +"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" @@ -363,6 +669,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" + integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== + dependencies: + "@babel/types" "^7.20.0" + "@babel/helper-split-export-declaration@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" @@ -370,16 +683,38 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-option@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + "@babel/helper-wrap-function@^7.16.8": version "7.16.8" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" @@ -390,6 +725,16 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" +"@babel/helper-wrap-function@^7.18.9": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" + integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== + dependencies: + "@babel/helper-function-name" "^7.19.0" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + "@babel/helpers@^7.12.5", "@babel/helpers@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.0.tgz#aff37c3590de42102b54842446146d0205946370" @@ -399,6 +744,15 @@ "@babel/traverse" "^7.18.0" "@babel/types" "^7.18.0" +"@babel/helpers@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" + integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.0" + "@babel/highlight@^7.16.7": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" @@ -408,11 +762,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.10", "@babel/parser@^7.18.0": +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112" integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg== +"@babel/parser@^7.18.10", "@babel/parser@^7.18.8", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" + integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" @@ -420,6 +788,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" + integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" @@ -429,6 +804,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-proposal-optional-chaining" "^7.17.12" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" @@ -438,6 +822,16 @@ "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" +"@babel/plugin-proposal-async-generator-functions@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" + integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-class-properties@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" @@ -446,6 +840,14 @@ "@babel/helper-create-class-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-proposal-class-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-class-static-block@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" @@ -455,6 +857,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-class-static-block" "^7.14.5" +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-proposal-dynamic-import@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" @@ -463,6 +874,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-proposal-dynamic-import@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" + integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-namespace-from@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" @@ -471,6 +890,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" + integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" @@ -479,6 +906,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-json-strings" "^7.8.3" +"@babel/plugin-proposal-json-strings@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" + integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-proposal-logical-assignment-operators@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" @@ -487,6 +922,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" @@ -495,6 +938,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" @@ -503,6 +954,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-numeric-separator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread@7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" @@ -523,6 +982,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.17.12" +"@babel/plugin-proposal-object-rest-spread@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" + integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-proposal-optional-catch-binding@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" @@ -531,6 +1001,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-proposal-optional-catch-binding@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" @@ -540,6 +1018,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" @@ -548,6 +1035,14 @@ "@babel/helper-create-class-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-proposal-private-methods@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" @@ -558,6 +1053,16 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" @@ -566,6 +1071,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-proposal-unicode-property-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -608,6 +1121,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-import-assertions@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" + integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -629,6 +1149,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -692,6 +1219,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-arrow-functions@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" @@ -699,6 +1233,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-async-to-generator@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" @@ -708,6 +1249,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/helper-remap-async-to-generator" "^7.16.8" +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" @@ -715,6 +1265,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-block-scoped-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" + integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-block-scoping@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.17.12.tgz#68fc3c4b3bb7dfd809d97b7ed19a584052a2725c" @@ -722,6 +1279,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-block-scoping@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.2.tgz#f59b1767e6385c663fd0bce655db6ca9c8b236ed" + integrity sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-classes@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.17.12.tgz#da889e89a4d38375eeb24985218edeab93af4f29" @@ -736,6 +1300,21 @@ "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" + integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" @@ -743,6 +1322,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-destructuring@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" @@ -750,6 +1336,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-destructuring@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" + integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" @@ -758,6 +1351,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-dotall-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" + integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-duplicate-keys@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" @@ -765,6 +1366,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-duplicate-keys@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" + integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" @@ -773,6 +1381,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-exponentiation-operator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" + integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-for-of@^7.17.12": version "7.18.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" @@ -780,6 +1396,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-for-of@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" + integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-function-name@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" @@ -789,6 +1412,15 @@ "@babel/helper-function-name" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" + integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== + dependencies: + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-literals@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" @@ -796,6 +1428,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" + integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-member-expression-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" @@ -803,6 +1442,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-member-expression-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" + integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-modules-amd@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" @@ -812,6 +1458,14 @@ "@babel/helper-plugin-utils" "^7.17.12" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" + integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== + dependencies: + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-modules-commonjs@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.0.tgz#3be575e19fbd273d42adbc84566b1fad3582b3db" @@ -822,6 +1476,15 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" + integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== + dependencies: + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-simple-access" "^7.19.4" + "@babel/plugin-transform-modules-systemjs@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.0.tgz#50ecdb43de97c8483824402f7125edb94cddb09a" @@ -833,6 +1496,16 @@ "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.19.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" + integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== + dependencies: + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.19.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/plugin-transform-modules-umd@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" @@ -841,6 +1514,14 @@ "@babel/helper-module-transforms" "^7.18.0" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-modules-umd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" + integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== + dependencies: + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" @@ -849,6 +1530,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.17.12" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz#ec7455bab6cd8fb05c525a94876f435a48128888" + integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.19.0" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-new-target@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" @@ -856,6 +1545,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-new-target@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" + integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-object-super@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" @@ -864,6 +1560,14 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-replace-supers" "^7.16.7" +"@babel/plugin-transform-object-super@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" + integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" + "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" @@ -871,6 +1575,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-parameters@^7.20.1": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.3.tgz#7b3468d70c3c5b62e46be0a47b6045d8590fb748" + integrity sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-transform-property-literals@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" @@ -878,6 +1589,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-property-literals@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" + integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-constant-elements@^7.14.5": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz#cc580857696b6dd9e5e3d079e673d060a0657f37" @@ -892,6 +1610,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-react-jsx-development@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" @@ -899,6 +1624,13 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.16.7" +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx@^7.16.7", "@babel/plugin-transform-react-jsx@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz#2aa20022709cd6a3f40b45d60603d5f269586dba" @@ -910,6 +1642,17 @@ "@babel/plugin-syntax-jsx" "^7.17.12" "@babel/types" "^7.17.12" +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" + integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.19.0" + "@babel/plugin-transform-react-pure-annotations@^7.16.7": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz#ef82c8e310913f3522462c9ac967d395092f1954" @@ -918,6 +1661,14 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-regenerator@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" @@ -926,6 +1677,14 @@ "@babel/helper-plugin-utils" "^7.17.12" regenerator-transform "^0.15.0" +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + regenerator-transform "^0.15.0" + "@babel/plugin-transform-reserved-words@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" @@ -933,16 +1692,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" -"@babel/plugin-transform-runtime@^7.17.10": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.0.tgz#894cdab4b353dcb7639f03fb74c59db1d344f71c" - integrity sha512-7kM/jJ3DD/y1hDPn0jov12DoUIFsxLiItprhNydUSibxaywaxNqKwq+ODk72J9ePn4LWobIc5ik6TAJhVl8IkQ== +"@babel/plugin-transform-reserved-words@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" + integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-runtime@^7.18.6": + version "7.19.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" + integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.19.0" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" semver "^6.3.0" "@babel/plugin-transform-shorthand-properties@^7.16.7": @@ -952,6 +1718,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-shorthand-properties@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" + integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-spread@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" @@ -960,6 +1733,14 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" +"@babel/plugin-transform-spread@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" + integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-transform-sticky-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" @@ -967,6 +1748,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-sticky-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" + integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-transform-template-literals@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.17.12.tgz#4aec0a18f39dd86c442e1d077746df003e362c6e" @@ -974,6 +1762,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-template-literals@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" + integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-typeof-symbol@^7.17.12": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" @@ -981,6 +1776,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.17.12" +"@babel/plugin-transform-typeof-symbol@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" + integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-typescript@^7.17.12": version "7.18.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.1.tgz#5fd8b86130bad95c4a24377b41ab989a9ccad22d" @@ -990,6 +1792,15 @@ "@babel/helper-plugin-utils" "^7.17.12" "@babel/plugin-syntax-typescript" "^7.17.12" +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/plugin-transform-unicode-escapes@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" @@ -997,6 +1808,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-transform-unicode-escapes@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" + integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/plugin-transform-unicode-regex@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" @@ -1005,7 +1823,15 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/preset-env@^7.15.6", "@babel/preset-env@^7.17.10": +"@babel/plugin-transform-unicode-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" + integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/preset-env@^7.15.6": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.0.tgz#ec7e51f4c6e026816000b230ed7cf74a1530d91d" integrity sha512-cP74OMs7ECLPeG1reiCQ/D/ypyOxgfm8uR6HRYV23vTJ7Lu1nbgj9DQDo/vH59gnn7GOAwtTDPPYV4aXzsMKHA== @@ -1086,6 +1912,87 @@ core-js-compat "^3.22.1" semver "^6.3.0" +"@babel/preset-env@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" + integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== + dependencies: + "@babel/compat-data" "^7.20.1" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-async-generator-functions" "^7.20.1" + "@babel/plugin-proposal-class-properties" "^7.18.6" + "@babel/plugin-proposal-class-static-block" "^7.18.6" + "@babel/plugin-proposal-dynamic-import" "^7.18.6" + "@babel/plugin-proposal-export-namespace-from" "^7.18.9" + "@babel/plugin-proposal-json-strings" "^7.18.6" + "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" + "@babel/plugin-proposal-numeric-separator" "^7.18.6" + "@babel/plugin-proposal-object-rest-spread" "^7.20.2" + "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/plugin-proposal-private-methods" "^7.18.6" + "@babel/plugin-proposal-private-property-in-object" "^7.18.6" + "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.18.6" + "@babel/plugin-transform-async-to-generator" "^7.18.6" + "@babel/plugin-transform-block-scoped-functions" "^7.18.6" + "@babel/plugin-transform-block-scoping" "^7.20.2" + "@babel/plugin-transform-classes" "^7.20.2" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.20.2" + "@babel/plugin-transform-dotall-regex" "^7.18.6" + "@babel/plugin-transform-duplicate-keys" "^7.18.9" + "@babel/plugin-transform-exponentiation-operator" "^7.18.6" + "@babel/plugin-transform-for-of" "^7.18.8" + "@babel/plugin-transform-function-name" "^7.18.9" + "@babel/plugin-transform-literals" "^7.18.9" + "@babel/plugin-transform-member-expression-literals" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.19.6" + "@babel/plugin-transform-modules-commonjs" "^7.19.6" + "@babel/plugin-transform-modules-systemjs" "^7.19.6" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-property-literals" "^7.18.6" + "@babel/plugin-transform-regenerator" "^7.18.6" + "@babel/plugin-transform-reserved-words" "^7.18.6" + "@babel/plugin-transform-shorthand-properties" "^7.18.6" + "@babel/plugin-transform-spread" "^7.19.0" + "@babel/plugin-transform-sticky-regex" "^7.18.6" + "@babel/plugin-transform-template-literals" "^7.18.9" + "@babel/plugin-transform-typeof-symbol" "^7.18.9" + "@babel/plugin-transform-unicode-escapes" "^7.18.10" + "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.20.2" + babel-plugin-polyfill-corejs2 "^0.3.3" + babel-plugin-polyfill-corejs3 "^0.6.0" + babel-plugin-polyfill-regenerator "^0.4.1" + core-js-compat "^3.25.1" + semver "^6.3.0" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" @@ -1097,7 +2004,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.14.5", "@babel/preset-react@^7.16.7": +"@babel/preset-react@^7.14.5": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.17.12.tgz#62adbd2d1870c0de3893095757ed5b00b492ab3d" integrity sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA== @@ -1109,7 +2016,19 @@ "@babel/plugin-transform-react-jsx-development" "^7.16.7" "@babel/plugin-transform-react-pure-annotations" "^7.16.7" -"@babel/preset-typescript@^7.15.0", "@babel/preset-typescript@^7.16.7": +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + +"@babel/preset-typescript@^7.15.0": version "7.17.12" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz#40269e0a0084d56fc5731b6c40febe1c9a4a3e8c" integrity sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg== @@ -1118,21 +2037,37 @@ "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.17.12" -"@babel/runtime-corejs3@^7.17.9": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.0.tgz#eed03023c5226b1e2b2ba32b8b6af5cb0518a6c7" - integrity sha512-G5FaGZOWORq9zthDjIrjib5XlcddeqLbIiDO3YQsut6j7aGf76xn0umUC/pA6+nApk3hQJF4JzLzg5PCl6ewJg== +"@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + +"@babel/runtime-corejs3@^7.18.6": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.1.tgz#d0775a49bb5fba77e42cbb7276c9955c7b05af8d" + integrity sha512-CGulbEDcg/ND1Im7fUNRZdGXmX2MTWVVZacQi/6DiKE5HNwZ3aVTm5PV4lO8HHz0B2h8WQyvKKjbX5XgTtydsg== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.10" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.0.tgz#6d77142a19cb6088f0af662af1ada37a604d34ae" integrity sha512-YMQvx/6nKEaucl0MY56mwIG483xk8SDNdlUwb2Ts6FUpr7fm85DxEmsY18LXBNhcTz6tO6JwZV8w1W06v8UKeg== dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.18.6": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" + integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== + dependencies: + regenerator-runtime "^0.13.10" + "@babel/template@^7.12.7", "@babel/template@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" @@ -1142,7 +2077,16 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.10", "@babel/traverse@^7.18.0": +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba" integrity sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw== @@ -1158,6 +2102,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.18.8", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" + integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.1" + "@babel/types" "^7.20.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.12.7", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.17.12", "@babel/types@^7.18.0", "@babel/types@^7.4.4": version "7.18.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.0.tgz#ef523ea349722849cb4bf806e9342ede4d071553" @@ -1166,64 +2126,75 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" + integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== -"@docsearch/css@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.1.0.tgz#6781cad43fc2e034d012ee44beddf8f93ba21f19" - integrity sha512-bh5IskwkkodbvC0FzSg1AxMykfDl95hebEKwxNoq4e5QaGzOXSBgW8+jnMFZ7JU4sTBiB04vZWoUSzNrPboLZA== +"@docsearch/css@3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.3.0.tgz#d698e48302d12240d7c2f7452ccb2d2239a8cd80" + integrity sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg== -"@docsearch/react@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.1.0.tgz#da943a64c01ee82b04e53b691806469272f943f7" - integrity sha512-bjB6ExnZzf++5B7Tfoi6UXgNwoUnNOfZ1NyvnvPhWgCMy5V/biAtLL4o7owmZSYdAKeFSvZ5Lxm0is4su/dBWg== +"@docsearch/react@^3.1.1": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.3.0.tgz#b8ac8e7f49b9bf2f96d34c24bc1cfd097ec0eead" + integrity sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A== dependencies: - "@algolia/autocomplete-core" "1.6.3" - "@docsearch/css" "3.1.0" + "@algolia/autocomplete-core" "1.7.2" + "@algolia/autocomplete-preset-algolia" "1.7.2" + "@docsearch/css" "3.3.0" algoliasearch "^4.0.0" -"@docusaurus/core@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-beta.20.tgz#cf4aeeccecacb547a6fb42340c83bed0cccb57c0" - integrity sha512-a3UgZ4lIcIOoZd4j9INqVkWSXEDxR7EicJXt8eq2whg4N5hKGqLHoDSnWfrVSPQn4NoG5T7jhPypphSoysImfQ== +"@docusaurus/core@2.2.0", "@docusaurus/core@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.2.0.tgz#64c9ee31502c23b93c869f8188f73afaf5fd4867" + integrity sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA== dependencies: - "@babel/core" "^7.17.10" - "@babel/generator" "^7.17.10" + "@babel/core" "^7.18.6" + "@babel/generator" "^7.18.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.17.10" - "@babel/preset-env" "^7.17.10" - "@babel/preset-react" "^7.16.7" - "@babel/preset-typescript" "^7.16.7" - "@babel/runtime" "^7.17.9" - "@babel/runtime-corejs3" "^7.17.9" - "@babel/traverse" "^7.17.10" - "@docusaurus/cssnano-preset" "2.0.0-beta.20" - "@docusaurus/logger" "2.0.0-beta.20" - "@docusaurus/mdx-loader" "2.0.0-beta.20" + "@babel/plugin-transform-runtime" "^7.18.6" + "@babel/preset-env" "^7.18.6" + "@babel/preset-react" "^7.18.6" + "@babel/preset-typescript" "^7.18.6" + "@babel/runtime" "^7.18.6" + "@babel/runtime-corejs3" "^7.18.6" + "@babel/traverse" "^7.18.8" + "@docusaurus/cssnano-preset" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-common" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" - "@slorber/static-site-generator-webpack-plugin" "^4.0.4" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" + "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.5" + autoprefixer "^10.4.7" babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" boxen "^6.2.1" + chalk "^4.1.2" chokidar "^3.5.3" clean-css "^5.3.0" cli-table3 "^0.6.2" combine-promises "^1.1.0" commander "^5.1.0" - copy-webpack-plugin "^10.2.4" - core-js "^3.22.3" + copy-webpack-plugin "^11.0.0" + core-js "^3.23.3" css-loader "^6.7.1" - css-minimizer-webpack-plugin "^3.4.1" - cssnano "^5.1.7" - del "^6.0.0" + css-minimizer-webpack-plugin "^4.0.0" + cssnano "^5.1.12" + del "^6.1.1" detect-port "^1.3.0" escape-html "^1.0.3" eta "^1.12.3" @@ -1235,59 +2206,59 @@ import-fresh "^3.3.0" leven "^3.1.0" lodash "^4.17.21" - mini-css-extract-plugin "^2.6.0" - postcss "^8.4.13" - postcss-loader "^6.2.1" + mini-css-extract-plugin "^2.6.1" + postcss "^8.4.14" + postcss-loader "^7.0.0" prompts "^2.4.2" react-dev-utils "^12.0.1" react-helmet-async "^1.3.0" react-loadable "npm:@docusaurus/react-loadable@5.5.2" react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.2.0" + react-router "^5.3.3" react-router-config "^5.1.1" - react-router-dom "^5.2.0" - remark-admonitions "^1.2.1" + react-router-dom "^5.3.3" rtl-detect "^1.0.4" semver "^7.3.7" serve-handler "^6.1.3" shelljs "^0.8.5" - terser-webpack-plugin "^5.3.1" + terser-webpack-plugin "^5.3.3" tslib "^2.4.0" update-notifier "^5.1.0" url-loader "^4.1.1" wait-on "^6.0.1" - webpack "^5.72.0" + webpack "^5.73.0" webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.8.1" + webpack-dev-server "^4.9.3" webpack-merge "^5.8.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-beta.20.tgz#c47722e347fd044f2372e924199eabf61733232f" - integrity sha512-7pfrYuahHl3YYS+gYhbb1YHsq5s5+hk+1KIU7QqNNn4YjrIqAHlOznCQ9XfQfspe9boZmaNFGMZQ1tawNOVLqQ== +"@docusaurus/cssnano-preset@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.2.0.tgz#fc05044659051ae74ab4482afcf4a9936e81d523" + integrity sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg== dependencies: - cssnano-preset-advanced "^5.3.3" - postcss "^8.4.13" + cssnano-preset-advanced "^5.3.8" + postcss "^8.4.14" postcss-sort-media-queries "^4.2.1" + tslib "^2.4.0" -"@docusaurus/logger@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.0.0-beta.20.tgz#bb49e8516e48082ab96bca11569a18541476d5a6" - integrity sha512-7Rt7c8m3ZM81o5jsm6ENgdbjq/hUICv8Om2i7grynI4GT2aQyFoHcusaNbRji4FZt0DaKT2CQxiAWP8BbD4xzQ== +"@docusaurus/logger@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.2.0.tgz#ea2f7feda7b8675485933b87f06d9c976d17423f" + integrity sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A== dependencies: chalk "^4.1.2" tslib "^2.4.0" -"@docusaurus/mdx-loader@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-beta.20.tgz#7016e8ce7e4a11c9ea458e2236d3c93af71f393f" - integrity sha512-BBuf77sji3JxbCEW7Qsv3CXlgpm+iSLTQn6JUK7x8vJ1JYZ3KJbNgpo9TmxIIltpcvNQ/QOy6dvqrpSStaWmKQ== +"@docusaurus/mdx-loader@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.2.0.tgz#fd558f429e5d9403d284bd4214e54d9768b041a0" + integrity sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA== dependencies: - "@babel/parser" "^7.17.10" - "@babel/traverse" "^7.17.10" - "@docusaurus/logger" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" + "@babel/parser" "^7.18.8" + "@babel/traverse" "^7.18.8" + "@docusaurus/logger" "2.2.0" + "@docusaurus/utils" "2.2.0" "@mdx-js/mdx" "^1.6.22" escape-html "^1.0.3" file-loader "^6.2.0" @@ -1297,135 +2268,147 @@ remark-emoji "^2.2.0" stringify-object "^3.3.0" tslib "^2.4.0" + unified "^9.2.2" unist-util-visit "^2.0.3" url-loader "^4.1.1" - webpack "^5.72.0" + webpack "^5.73.0" -"@docusaurus/module-type-aliases@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.0.0-beta.20.tgz#669605a64b04226c391e0284c44743e137eb2595" - integrity sha512-lUIXLwQEOyYwcb3iCNibPUL6O9ijvYF5xQwehGeVraTEBts/Ch8ZwELFk+XbaGHKh52PiVxuWL2CP4Gdjy5QKw== +"@docusaurus/module-type-aliases@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.2.0.tgz#1e23e54a1bbb6fde1961e4fa395b1b69f4803ba5" + integrity sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ== dependencies: - "@docusaurus/types" "2.0.0-beta.20" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "2.2.0" + "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" "@types/react-router-dom" "*" react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-beta.20.tgz#7c0d413ac8df9a422a0b3ddd90b77ec491bbda15" - integrity sha512-6aby36Gmny5h2oo/eEZ2iwVsIlBWbRnNNeqT0BYnJO5aj53iCU/ctFPpJVYcw0l2l8+8ITS70FyePIWEsaZ0jA== - dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/logger" "2.0.0-beta.20" - "@docusaurus/mdx-loader" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-common" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" - cheerio "^1.0.0-rc.10" +"@docusaurus/plugin-content-blog@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.2.0.tgz#dc55982e76771f4e678ac10e26d10e1da2011dc1" + integrity sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" + cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^10.1.0" lodash "^4.17.21" reading-time "^1.5.0" - remark-admonitions "^1.2.1" tslib "^2.4.0" unist-util-visit "^2.0.3" utility-types "^3.10.0" - webpack "^5.72.0" - -"@docusaurus/plugin-content-docs@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-beta.20.tgz#2a53b9fc355f45bf7c6917f19be7bfa0698b8b9e" - integrity sha512-XOgwUqXtr/DStpB3azdN6wgkKtQkOXOx1XetORzhHnjihrSMn6daxg+spmcJh1ki/mpT3n7yBbKJxVNo+VB38Q== - dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/logger" "2.0.0-beta.20" - "@docusaurus/mdx-loader" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" + webpack "^5.73.0" + +"@docusaurus/plugin-content-docs@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.2.0.tgz#0fcb85226fcdb80dc1e2d4a36ef442a650dcc84d" + integrity sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/module-type-aliases" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" + "@types/react-router-config" "^5.0.6" combine-promises "^1.1.0" fs-extra "^10.1.0" import-fresh "^3.3.0" js-yaml "^4.1.0" lodash "^4.17.21" - remark-admonitions "^1.2.1" tslib "^2.4.0" utility-types "^3.10.0" - webpack "^5.72.0" + webpack "^5.73.0" -"@docusaurus/plugin-content-pages@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-beta.20.tgz#6a76c7fa049983d2d94d8c4d738802acf01611fe" - integrity sha512-ubY6DG4F0skFKjfNGCbfO34Qf+MZy6C05OtpIYsoA2YU8ADx0nRH7qPgdEkwR3ma860DbY612rleRT13ogSlhg== - dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/mdx-loader" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" +"@docusaurus/plugin-content-pages@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.2.0.tgz#e3f40408787bbe229545dd50595f87e1393bc3ae" + integrity sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" fs-extra "^10.1.0" - remark-admonitions "^1.2.1" tslib "^2.4.0" - webpack "^5.72.0" + webpack "^5.73.0" -"@docusaurus/plugin-debug@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-beta.20.tgz#7c026e81c45fd4f00801a785c928b9e8727a99de" - integrity sha512-acGZmpncPA1XDczpV1ji1ajBCRBY/H2lXN8alSjOB1vh0c/2Qz+KKD05p17lsUbhIyvsnZBa/BaOwtek91Lu7Q== +"@docusaurus/plugin-debug@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.2.0.tgz#b38741d2c492f405fee01ee0ef2e0029cedb689a" + integrity sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow== dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/core" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" fs-extra "^10.1.0" react-json-view "^1.21.3" tslib "^2.4.0" -"@docusaurus/plugin-google-analytics@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.20.tgz#c1bdbc1239f987f9716fa30c2fd86962c190a765" - integrity sha512-4C5nY25j0R1lntFmpSEalhL7jYA7tWvk0VZObiIxGilLagT/f9gWPQtIjNBe4yzdQvkhiaXpa8xcMcJUAKRJyw== +"@docusaurus/plugin-google-analytics@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.2.0.tgz#63c7137eff5a1208d2059fea04b5207c037d7954" + integrity sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg== dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" + "@docusaurus/core" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" tslib "^2.4.0" -"@docusaurus/plugin-google-gtag@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-beta.20.tgz#7284bcfad9cb4e5d63605e95f6da73ca8ac8f053" - integrity sha512-EMZdiMTNg4NwE60xwjbetcqMDqAOazMTwQAQ4OuNAclv7oh8+VPCvqRF8s8AxCoI2Uqc7vh8yzNUuM307Ne9JA== +"@docusaurus/plugin-google-gtag@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.2.0.tgz#7b086d169ac5fe9a88aca10ab0fd2bf00c6c6b12" + integrity sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ== dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" + "@docusaurus/core" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" tslib "^2.4.0" -"@docusaurus/plugin-sitemap@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-beta.20.tgz#08eada1260cafb273abea33c9c890ab667c7cbd3" - integrity sha512-Rf5a2vOBWjbe7PJJEBDeLZzDA7lsDi+16bqzKN8OKSXlcZLhxjmIpL5NrjANNbpGpL5vbl9z+iqvjbQmZ3QSmA== - dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-common" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" +"@docusaurus/plugin-sitemap@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.2.0.tgz#876da60937886032d63143253d420db6a4b34773" + integrity sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" fs-extra "^10.1.0" sitemap "^7.1.1" tslib "^2.4.0" -"@docusaurus/preset-classic@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-beta.20.tgz#19566be713ce0297834cd999392ea3605bc6f574" - integrity sha512-artUDjiYFIlGd2fxk0iqqcJ5xSCrgormOAoind1c0pn8TRXY1WSCQWYI6p4X24jjhSCzLv0s6Z9PMDyxZdivhg== - dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/plugin-content-blog" "2.0.0-beta.20" - "@docusaurus/plugin-content-docs" "2.0.0-beta.20" - "@docusaurus/plugin-content-pages" "2.0.0-beta.20" - "@docusaurus/plugin-debug" "2.0.0-beta.20" - "@docusaurus/plugin-google-analytics" "2.0.0-beta.20" - "@docusaurus/plugin-google-gtag" "2.0.0-beta.20" - "@docusaurus/plugin-sitemap" "2.0.0-beta.20" - "@docusaurus/theme-classic" "2.0.0-beta.20" - "@docusaurus/theme-common" "2.0.0-beta.20" - "@docusaurus/theme-search-algolia" "2.0.0-beta.20" +"@docusaurus/preset-classic@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.2.0.tgz#bece5a043eeb74430f7c6c7510000b9c43669eb7" + integrity sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/plugin-content-blog" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/plugin-content-pages" "2.2.0" + "@docusaurus/plugin-debug" "2.2.0" + "@docusaurus/plugin-google-analytics" "2.2.0" + "@docusaurus/plugin-google-gtag" "2.2.0" + "@docusaurus/plugin-sitemap" "2.2.0" + "@docusaurus/theme-classic" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-search-algolia" "2.2.0" + "@docusaurus/types" "2.2.0" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1435,114 +2418,125 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-beta.20.tgz#c4c7712c2b35c5654433228729f92ec73e6c598e" - integrity sha512-rs4U68x8Xk6rPsZC/7eaPxCKqzXX1S45FICKmq/IZuaDaQyQIijCvv2ssxYnUyVZUNayZfJK7ZtNu+A0kzYgSQ== - dependencies: - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/plugin-content-blog" "2.0.0-beta.20" - "@docusaurus/plugin-content-docs" "2.0.0-beta.20" - "@docusaurus/plugin-content-pages" "2.0.0-beta.20" - "@docusaurus/theme-common" "2.0.0-beta.20" - "@docusaurus/theme-translations" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-common" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" +"@docusaurus/theme-classic@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.2.0.tgz#a048bb1bc077dee74b28bec25f4b84b481863742" + integrity sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg== + dependencies: + "@docusaurus/core" "2.2.0" + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/module-type-aliases" "2.2.0" + "@docusaurus/plugin-content-blog" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/plugin-content-pages" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-translations" "2.2.0" + "@docusaurus/types" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-common" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" "@mdx-js/react" "^1.6.22" - clsx "^1.1.1" + clsx "^1.2.1" copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.39" + infima "0.2.0-alpha.42" lodash "^4.17.21" nprogress "^0.2.0" - postcss "^8.4.13" - prism-react-renderer "^1.3.1" + postcss "^8.4.14" + prism-react-renderer "^1.3.5" prismjs "^1.28.0" - react-router-dom "^5.2.0" + react-router-dom "^5.3.3" rtlcss "^3.5.0" + tslib "^2.4.0" + utility-types "^3.10.0" -"@docusaurus/theme-common@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-beta.20.tgz#4ec7d77ecd2ade9dad33b8689e3cd51b07e594b0" - integrity sha512-lmdGB3/GQM5z0GH0iHGRXUco4Wfqc6sR5eRKuW4j0sx3+UFVvtbVTTIGt0Cie4Dh6omnFxjPbNDlPDgWr/agVQ== - dependencies: - "@docusaurus/module-type-aliases" "2.0.0-beta.20" - "@docusaurus/plugin-content-blog" "2.0.0-beta.20" - "@docusaurus/plugin-content-docs" "2.0.0-beta.20" - "@docusaurus/plugin-content-pages" "2.0.0-beta.20" - clsx "^1.1.1" +"@docusaurus/theme-common@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.2.0.tgz#2303498d80448aafdd588b597ce9d6f4cfa930e4" + integrity sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw== + dependencies: + "@docusaurus/mdx-loader" "2.2.0" + "@docusaurus/module-type-aliases" "2.2.0" + "@docusaurus/plugin-content-blog" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/plugin-content-pages" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^1.2.1" parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.1" + prism-react-renderer "^1.3.5" tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-beta.20.tgz#14f2ea376a87d7cfa4840d8c917d1ec62d3a07f7" - integrity sha512-9XAyiXXHgyhDmKXg9RUtnC4WBkYAZUqKT9Ntuk0OaOb4mBwiYUGL74tyP0LLL6T+oa9uEdXiUMlIL1onU8xhvA== - dependencies: - "@docsearch/react" "^3.0.0" - "@docusaurus/core" "2.0.0-beta.20" - "@docusaurus/logger" "2.0.0-beta.20" - "@docusaurus/plugin-content-docs" "2.0.0-beta.20" - "@docusaurus/theme-common" "2.0.0-beta.20" - "@docusaurus/theme-translations" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" - "@docusaurus/utils-validation" "2.0.0-beta.20" - algoliasearch "^4.13.0" - algoliasearch-helper "^3.8.2" - clsx "^1.1.1" +"@docusaurus/theme-search-algolia@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz#77fd9f7a600917e6024fe3ac7fb6cfdf2ce84737" + integrity sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w== + dependencies: + "@docsearch/react" "^3.1.1" + "@docusaurus/core" "2.2.0" + "@docusaurus/logger" "2.2.0" + "@docusaurus/plugin-content-docs" "2.2.0" + "@docusaurus/theme-common" "2.2.0" + "@docusaurus/theme-translations" "2.2.0" + "@docusaurus/utils" "2.2.0" + "@docusaurus/utils-validation" "2.2.0" + algoliasearch "^4.13.1" + algoliasearch-helper "^3.10.0" + clsx "^1.2.1" eta "^1.12.3" fs-extra "^10.1.0" lodash "^4.17.21" tslib "^2.4.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.0.0-beta.20.tgz#dcc7efb43ff110c19736764c287f6c5128a5dbba" - integrity sha512-O7J/4dHcg7Yr+r3ylgtqmtMEz6d5ScpUxBg8nsNTWOCRoGEXNZVmXSd5l6v72KCyxPZpllPrgjmqkL+I19qWiw== +"@docusaurus/theme-translations@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.2.0.tgz#5fbd4693679806f80c26eeae1381e1f2c23d83e7" + integrity sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w== dependencies: fs-extra "^10.1.0" tslib "^2.4.0" -"@docusaurus/types@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-beta.20.tgz#069d40cc225141d5c9a85605a1c61a460814bf5d" - integrity sha512-d4ZIpcrzGsUUcZJL3iz8/iSaewobPPiYfn2Lmmv7GTT5ZPtPkOAtR5mE6+LAf/KpjjgqrC7mpwDKADnOL/ic4Q== +"@docusaurus/types@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.2.0.tgz#02c577a4041ab7d058a3c214ccb13647e21a9857" + integrity sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw== dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" commander "^5.1.0" - history "^4.9.0" joi "^17.6.0" react-helmet-async "^1.3.0" utility-types "^3.10.0" - webpack "^5.72.0" + webpack "^5.73.0" webpack-merge "^5.8.0" -"@docusaurus/utils-common@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.0.0-beta.20.tgz#adb914c331d711a3c0ef2ba3f64139acdf4cd781" - integrity sha512-HabHh23vOQn6ygs0PjuCSF/oZaNsYTFsxB2R6EwHNyw01nWgBC3QAcGVmyIWQhlb9p8V3byKgbzVS68hZX5t9A== +"@docusaurus/utils-common@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.2.0.tgz#a401c1b93a8697dd566baf6ac64f0fdff1641a78" + integrity sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA== dependencies: tslib "^2.4.0" -"@docusaurus/utils-validation@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-beta.20.tgz#ebf475a4388066bd450877fe920f405c53ff5ad2" - integrity sha512-7MxMoaF4VNAt5vUwvITa6nbkw1tb4WE6hp1VlfIoLCY4D7Wk5cMf1ZFhppCP1UzmPwvFb9zw8fPuvDfB3Tb5nQ== +"@docusaurus/utils-validation@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.2.0.tgz#04d4d103137ad0145883971d3aa497f4a1315f25" + integrity sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg== dependencies: - "@docusaurus/logger" "2.0.0-beta.20" - "@docusaurus/utils" "2.0.0-beta.20" + "@docusaurus/logger" "2.2.0" + "@docusaurus/utils" "2.2.0" joi "^17.6.0" js-yaml "^4.1.0" tslib "^2.4.0" -"@docusaurus/utils@2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-beta.20.tgz#d5a9816a328b2ca5e4e1a3fbf267e3674abacd48" - integrity sha512-eUQquakhrbnvhsmx8jRPLgoyjyzMuOhmQC99m7rotar7XOzROpgEpm7+xVaquG5Ha47WkybE3djHJhKNih7GZQ== +"@docusaurus/utils@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.2.0.tgz#3d6f9b7a69168d5c92d371bf21c556a4f50d1da6" + integrity sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA== dependencies: - "@docusaurus/logger" "2.0.0-beta.20" + "@docusaurus/logger" "2.2.0" "@svgr/webpack" "^6.2.1" file-loader "^6.2.0" fs-extra "^10.1.0" @@ -1556,7 +2550,7 @@ shelljs "^0.8.5" tslib "^2.4.0" url-loader "^4.1.1" - webpack "^5.72.0" + webpack "^5.73.0" "@hapi/hoek@^9.0.0": version "9.3.0" @@ -1570,6 +2564,25 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@jest/schemas@^29.0.0": + version "29.0.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" + integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== + dependencies: + "@jest/schemas" "^29.0.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -1578,7 +2591,7 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/gen-mapping@^0.3.0": +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== @@ -1587,7 +2600,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -1610,11 +2623,19 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/trace-mapping@^0.3.14": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.14" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" @@ -1706,20 +2727,24 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== -"@slorber/static-site-generator-webpack-plugin@^4.0.4": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.4.tgz#2bf4a2545e027830d2aa5eb950437c26a289b0f1" - integrity sha512-FvMavoWEIePps6/JwGCOLYKCRhuwIHhMtmbKpBFgzNkxwpa/569LfTkrbRk1m1I3n+ezJK4on9E1A6cjuZmD9g== +"@slorber/static-site-generator-webpack-plugin@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" + integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== dependencies: - bluebird "^3.7.1" - cheerio "^0.22.0" eval "^0.1.8" - webpack-sources "^1.4.3" + p-map "^4.0.0" + webpack-sources "^3.2.2" "@svgr/babel-plugin-add-jsx-attribute@^6.0.0": version "6.0.0" @@ -1931,6 +2956,25 @@ dependencies: "@types/node" "*" +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + "@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -1943,6 +2987,11 @@ dependencies: "@types/unist" "*" +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -1978,7 +3027,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-router-config@*": +"@types/react-router-config@*", "@types/react-router-config@^5.0.6": version "5.0.6" resolved "https://registry.yarnpkg.com/@types/react-router-config/-/react-router-config-5.0.6.tgz#87c5c57e72d241db900d9734512c50ccec062451" integrity sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg== @@ -2045,6 +3094,14 @@ "@types/mime" "^1" "@types/node" "*" +"@types/serve-static@^1.13.10": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" + integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + dependencies: + "@types/mime" "*" + "@types/node" "*" + "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" @@ -2064,6 +3121,18 @@ dependencies: "@types/node" "*" +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.13" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76" + integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== + dependencies: + "@types/yargs-parser" "*" + "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -2213,11 +3282,16 @@ acorn-walk@^8.0.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.4.1, acorn@^8.5.0: +acorn@^8.0.4, acorn@^8.5.0: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.7.1: + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== + address@^1.0.1, address@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" @@ -2270,14 +3344,14 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -algoliasearch-helper@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.8.2.tgz#35726dc6d211f49dbab0bf6d37b4658165539523" - integrity sha512-AXxiF0zT9oYwl8ZBgU/eRXvfYhz7cBA5YrLPlw9inZHdaYF0QEya/f1Zp1mPYMXc1v6VkHwBq4pk6/vayBLICg== +algoliasearch-helper@^3.10.0: + version "3.11.1" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.11.1.tgz#d83ab7f1a2a374440686ef7a144b3c288b01188a" + integrity sha512-mvsPN3eK4E0bZG0/WlWJjeqe/bUD2KOEVOl0GyL/TGXn6wcpZU8NOuztGHCUKXkyg5gq6YzUakVTmnmSSO5Yiw== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.0.0, algoliasearch@^4.13.0: +algoliasearch@^4.0.0: version "4.13.1" resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.13.1.tgz#54195c41c9e4bd13ed64982248cf49d4576974fe" integrity sha512-dtHUSE0caWTCE7liE1xaL+19AFf6kWEcyn76uhcitWpntqvicFHXKFoZe5JJcv9whQOTRM6+B8qJz6sFj+rDJA== @@ -2297,6 +3371,26 @@ algoliasearch@^4.0.0, algoliasearch@^4.13.0: "@algolia/requester-node-http" "4.13.1" "@algolia/transporter" "4.13.1" +algoliasearch@^4.13.1: + version "4.14.2" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.14.2.tgz#63f142583bfc3a9bd3cd4a1b098bf6fe58e56f6c" + integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== + dependencies: + "@algolia/cache-browser-local-storage" "4.14.2" + "@algolia/cache-common" "4.14.2" + "@algolia/cache-in-memory" "4.14.2" + "@algolia/client-account" "4.14.2" + "@algolia/client-analytics" "4.14.2" + "@algolia/client-common" "4.14.2" + "@algolia/client-personalization" "4.14.2" + "@algolia/client-search" "4.14.2" + "@algolia/logger-common" "4.14.2" + "@algolia/logger-console" "4.14.2" + "@algolia/requester-browser-xhr" "4.14.2" + "@algolia/requester-common" "4.14.2" + "@algolia/requester-node-http" "4.14.2" + "@algolia/transporter" "4.14.2" + ansi-align@^3.0.0, ansi-align@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -2378,11 +3472,6 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-union@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" - integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== - asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -2393,13 +3482,13 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.3.7, autoprefixer@^10.4.5: - version "10.4.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" - integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== +autoprefixer@^10.4.12, autoprefixer@^10.4.7: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== dependencies: - browserslist "^4.20.3" - caniuse-lite "^1.0.30001335" + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -2430,13 +3519,6 @@ babel-plugin-apply-mdx-type-prop@1.6.22: "@babel/helper-plugin-utils" "7.10.4" "@mdx-js/util" "1.6.22" -babel-plugin-dynamic-import-node@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== - dependencies: - object.assign "^4.1.0" - babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -2460,6 +3542,15 @@ babel-plugin-polyfill-corejs2@^0.3.0: "@babel/helper-define-polyfill-provider" "^0.3.1" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" + integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== + dependencies: + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.3" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" @@ -2468,6 +3559,14 @@ babel-plugin-polyfill-corejs3@^0.5.0: "@babel/helper-define-polyfill-provider" "^0.3.1" core-js-compat "^3.21.0" +babel-plugin-polyfill-corejs3@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" + integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + core-js-compat "^3.25.1" + babel-plugin-polyfill-regenerator@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" @@ -2475,6 +3574,13 @@ babel-plugin-polyfill-regenerator@^0.3.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.3.1" +babel-plugin-polyfill-regenerator@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" + integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.3" + bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -2505,11 +3611,6 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bluebird@^3.7.1: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - body-parser@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" @@ -2538,7 +3639,7 @@ bonjour-service@^1.0.11: fast-deep-equal "^3.1.3" multicast-dns "^7.2.4" -boolbase@^1.0.0, boolbase@~1.0.0: +boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== @@ -2597,6 +3698,16 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.3" picocolors "^1.0.0" +browserslist@^4.21.3, browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2666,12 +3777,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332: version "1.0.30001342" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001342.tgz#87152b1e3b950d1fbf0093e23f00b6c8e8f1da96" integrity sha512-bn6sOCu7L7jcbBbyNhLg0qzXdJ/PMbybZTH/BA6Roet9wxYRm6Tr9D0s0uhLkOZ6MSG+QU6txUgdpr3MXIVqjA== -ccount@^1.0.0, ccount@^1.0.3: +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: + version "1.0.30001431" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" + integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== + +ccount@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== @@ -2685,7 +3801,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2720,32 +3836,10 @@ cheerio-select@^2.1.0: domhandler "^5.0.3" domutils "^3.0.1" -cheerio@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" - integrity sha512-8/MzidM6G/TgRelkzDG13y3Y9LxBjCb+8yOEZ9+wwq5gVF2w2pV0wmHvjfT0RvuxGyR7UEuK36r+yYMbT4uKgA== - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash.assignin "^4.0.9" - lodash.bind "^4.1.4" - lodash.defaults "^4.0.1" - lodash.filter "^4.4.0" - lodash.flatten "^4.2.0" - lodash.foreach "^4.3.0" - lodash.map "^4.4.0" - lodash.merge "^4.4.0" - lodash.pick "^4.2.1" - lodash.reduce "^4.4.0" - lodash.reject "^4.4.0" - lodash.some "^4.4.0" - -cheerio@^1.0.0-rc.10: - version "1.0.0-rc.11" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.11.tgz#1be84be1a126958366bcc57a11648cd9b30a60c2" - integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== +cheerio@^1.0.0-rc.12: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== dependencies: cheerio-select "^2.1.0" dom-serializer "^2.0.0" @@ -2754,7 +3848,6 @@ cheerio@^1.0.0-rc.10: htmlparser2 "^8.0.1" parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" - tslib "^2.4.0" chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" @@ -2781,6 +3874,11 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.6.1.tgz#7594f1c95cb7fdfddee7af95a13af7dbc67afdcf" + integrity sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w== + clean-css@^5.2.2, clean-css@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" @@ -2833,6 +3931,11 @@ clsx@^1.1.1: resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== +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== + collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" @@ -2944,10 +4047,10 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -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== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== consola@^2.15.3: version "2.15.3" @@ -2993,14 +4096,14 @@ copy-text-to-clipboard@^3.0.1: resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== -copy-webpack-plugin@^10.2.4: - version "10.2.4" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" - integrity sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg== +copy-webpack-plugin@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" + integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== dependencies: - fast-glob "^3.2.7" + fast-glob "^3.2.11" glob-parent "^6.0.1" - globby "^12.0.2" + globby "^13.1.1" normalize-path "^3.0.0" schema-utils "^4.0.0" serialize-javascript "^6.0.0" @@ -3013,15 +4116,22 @@ core-js-compat@^3.21.0, core-js-compat@^3.22.1: browserslist "^4.20.3" semver "7.0.0" -core-js-pure@^3.20.2: - version "3.22.7" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.7.tgz#f58489d9b309fa7b26486a0f70d4ec19a418084e" - integrity sha512-wTriFxiZI+C8msGeh7fJcbC/a0V8fdInN1oS2eK79DMBGs8iIJiXhtFJCiT3rBa8w6zroHWW3p8ArlujZ/Mz+w== +core-js-compat@^3.25.1: + version "3.26.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.0.tgz#94e2cf8ba3e63800c4956ea298a6473bc9d62b44" + integrity sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A== + dependencies: + browserslist "^4.21.4" -core-js@^3.22.3: - version "3.22.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.7.tgz#8d6c37f630f6139b8732d10f2c114c3f1d00024f" - integrity sha512-Jt8SReuDKVNZnZEzyEQT5eK6T2RRCXkfTq7Lo09kpm+fHjgGewSbNjV+Wt4yZMhPDdzz2x1ulI5z/w4nxpBseg== +core-js-pure@^3.25.1: + version "3.26.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.26.0.tgz#7ad8a5dd7d910756f3124374b50026e23265ca9a" + integrity sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA== + +core-js@^3.23.3: + version "3.26.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.26.0.tgz#a516db0ed0811be10eac5d94f3b8463d03faccfe" + integrity sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw== core-util-is@~1.0.0: version "1.0.3" @@ -3071,10 +4181,10 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-declaration-sorter@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz#bfd2f6f50002d6a3ae779a87d3a0c5d5b10e0f02" - integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== +css-declaration-sorter@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec" + integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w== css-loader@^6.7.1: version "6.7.1" @@ -3090,14 +4200,14 @@ css-loader@^6.7.1: postcss-value-parser "^4.2.0" semver "^7.3.5" -css-minimizer-webpack-plugin@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== +css-minimizer-webpack-plugin@^4.0.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" + integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" + cssnano "^5.1.8" + jest-worker "^29.1.2" + postcss "^8.4.17" schema-utils "^4.0.0" serialize-javascript "^6.0.0" source-map "^0.6.1" @@ -3124,16 +4234,6 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -3142,11 +4242,6 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-what@2.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== - css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" @@ -3157,49 +4252,49 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-advanced@^5.3.3: - version "5.3.5" - resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.5.tgz#b01dda0f76ff762b58bccd17c59701176b9be131" - integrity sha512-KgrfLQaTBB4bov/Xsi0+y5iGM5gg5QChP1PTMJ9t7U6p9geKHYcPS9AC6gmfwurm0GKxhTRafDx55E8FKHX8eg== +cssnano-preset-advanced@^5.3.8: + version "5.3.9" + resolved "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.9.tgz#99e1cdf81a467a5e6c366cfc6d874a166c4d9a67" + integrity sha512-njnh4pp1xCsibJcEHnWZb4EEzni0ePMqPuPNyuWT4Z+YeXmsgqNuTPIljXFEXhxGsWs9183JkXgHxc1TcsahIg== dependencies: - autoprefixer "^10.3.7" - cssnano-preset-default "^5.2.9" + autoprefixer "^10.4.12" + cssnano-preset-default "^5.2.13" postcss-discard-unused "^5.1.0" postcss-merge-idents "^5.1.1" postcss-reduce-idents "^5.2.0" postcss-zindex "^5.1.0" -cssnano-preset-default@^5.2.9: - version "5.2.9" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.9.tgz#63f6aa9a9f0b21d9a526371dd308253b656a9784" - integrity sha512-/4qcQcAfFEg+gnXE5NxKmYJ9JcT+8S5SDuJCLYMDN8sM/ymZ+lgLXq5+ohx/7V2brUCkgW2OaoCzOdAN0zvhGw== +cssnano-preset-default@^5.2.13: + version "5.2.13" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz#e7353b0c57975d1bdd97ac96e68e5c1b8c68e990" + integrity sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ== dependencies: - css-declaration-sorter "^6.2.2" + css-declaration-sorter "^6.3.1" cssnano-utils "^3.1.0" postcss-calc "^8.2.3" postcss-colormin "^5.3.0" - postcss-convert-values "^5.1.1" - postcss-discard-comments "^5.1.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" postcss-discard-duplicates "^5.1.0" postcss-discard-empty "^5.1.1" postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.5" - postcss-merge-rules "^5.1.1" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.3" postcss-minify-font-values "^5.1.0" postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.3" - postcss-minify-selectors "^5.2.0" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" postcss-normalize-charset "^5.1.0" postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.0" - postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" postcss-normalize-string "^5.1.0" postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.0" + postcss-normalize-unicode "^5.1.1" postcss-normalize-url "^5.1.0" postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.1" - postcss-reduce-initial "^5.1.0" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.1" postcss-reduce-transforms "^5.1.0" postcss-svgo "^5.1.0" postcss-unique-selectors "^5.1.1" @@ -3209,12 +4304,12 @@ cssnano-utils@^3.1.0: resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano@^5.0.6, cssnano@^5.1.7: - version "5.1.9" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.9.tgz#e6cb286c4907cbd55678eb315837a21008be21be" - integrity sha512-hctQHIIeDrfMjq0bQhoVmRVaSeNNOGxkvkKVOcKpJzLr09wlRrZWH4GaYudp0aszpW8wJeaO5/yBmID9n7DNCg== +cssnano@^5.1.12, cssnano@^5.1.8: + version "5.1.14" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.14.tgz#07b0af6da73641276fe5a6d45757702ebae2eb05" + integrity sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw== dependencies: - cssnano-preset-default "^5.2.9" + cssnano-preset-default "^5.2.13" lilconfig "^2.0.3" yaml "^1.10.2" @@ -3286,7 +4381,7 @@ define-properties@^1.1.3: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^6.0.0: +del@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== @@ -3369,14 +4464,6 @@ dom-converter@^0.2.0: dependencies: utila "~0.4" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" @@ -3395,31 +4482,11 @@ dom-serializer@^2.0.0: domhandler "^5.0.2" entities "^4.2.0" -dom-serializer@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA== - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" @@ -3434,22 +4501,6 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -3508,6 +4559,11 @@ electron-to-chromium@^1.4.118: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.138.tgz#3ec41ca589aaf505dfe2034fde913329af801730" integrity sha512-IOyp2Seq3w4QLln+yZWcMF3VXhhduz4bwg9gfI+CnP5TkzwNXQ8FCZuwwPsnes73AfWdf5J2n2OXdUwDUspDPQ== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3540,19 +4596,14 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.9.3: - version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" - integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -3737,7 +4788,18 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^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-glob@^3.2.7, fast-glob@^3.2.9: +fast-glob@^3.2.11: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -4071,15 +5133,14 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^12.0.2: - version "12.2.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" - integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== +globby@^13.1.1: + version "13.1.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== dependencies: - array-union "^3.0.1" dir-glob "^3.0.1" - fast-glob "^3.2.7" - ignore "^5.1.9" + fast-glob "^3.2.11" + ignore "^5.2.0" merge2 "^1.4.1" slash "^4.0.0" @@ -4174,17 +5235,6 @@ hast-to-hyperscript@^9.0.0: unist-util-is "^4.0.0" web-namespaces "^1.0.0" -hast-util-from-parse5@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz#3089dc0ee2ccf6ec8bc416919b51a54a589e097c" - integrity sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA== - dependencies: - ccount "^1.0.3" - hastscript "^5.0.0" - property-information "^5.0.0" - web-namespaces "^1.1.2" - xtend "^4.0.1" - hast-util-from-parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" @@ -4229,16 +5279,6 @@ hast-util-to-parse5@^6.0.0: xtend "^4.0.0" zwitch "^1.0.0" -hastscript@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a" - integrity sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ== - dependencies: - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - hastscript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" @@ -4323,18 +5363,6 @@ html-webpack-plugin@^5.5.0: pretty-error "^4.0.0" tapable "^2.0.0" -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" @@ -4428,7 +5456,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== -ignore@^5.1.9, ignore@^5.2.0: +ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -4468,10 +5496,10 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.39: - version "0.2.0-alpha.39" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.39.tgz#054b13ac44f3e9a42bc083988f1a1586add2f59c" - integrity sha512-UyYiwD3nwHakGhuOUfpe3baJ8gkiPpRVx4a4sE/Ag+932+Y6swtLsdPoRR8ezhwqGnduzxmFkjumV9roz6QoLw== +infima@0.2.0-alpha.42: + version "0.2.0-alpha.42" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5" + integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww== inflight@^1.0.4: version "1.0.6" @@ -4726,7 +5754,19 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -jest-worker@^27.0.2, jest-worker@^27.4.5: +jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -4735,6 +5775,16 @@ jest-worker@^27.0.2, jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.1.2: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" + integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== + dependencies: + "@types/node" "*" + jest-util "^29.3.1" + merge-stream "^2.0.0" + supports-color "^8.0.0" + joi@^17.6.0: version "17.6.0" resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" @@ -4895,16 +5945,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= - -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= - lodash.curry@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" @@ -4915,66 +5955,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.filter@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.flow@^3.3.0: version "3.5.0" resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" integrity sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o= -lodash.foreach@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= - -lodash.map@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.4.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.reduce@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= - -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= - -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= - lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -5150,18 +6140,10 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -mini-create-react-context@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e" - integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ== - dependencies: - "@babel/runtime" "^7.12.1" - tiny-warning "^1.0.3" - -mini-css-extract-plugin@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" - integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== +mini-css-extract-plugin@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz#9a1251d15f2035c342d99a468ab9da7a0451b71e" + integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== dependencies: schema-utils "^4.0.0" @@ -5264,6 +6246,11 @@ node-releases@^2.0.3: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + 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" @@ -5303,13 +6290,6 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - 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" @@ -5500,11 +6480,6 @@ parse5-htmlparser2-tree-adapter@^7.0.0: domhandler "^5.0.2" parse5 "^7.0.0" -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -5587,7 +6562,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5624,18 +6599,18 @@ postcss-colormin@^5.3.0: colord "^2.9.1" postcss-value-parser "^4.2.0" -postcss-convert-values@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.1.tgz#31c8ffba650e86dc750631cafcf1db022c5bb6f1" - integrity sha512-UjcYfl3wJJdcabGKk8lgetPvhi1Et7VDc3sYr9EyhNBeB00YD4vHgPBp+oMVoG/dDWCc6ASbmzPNV6jADTwh8Q== +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== dependencies: - browserslist "^4.20.3" + browserslist "^4.21.4" postcss-value-parser "^4.2.0" -postcss-discard-comments@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz#e90019e1a0e5b99de05f63516ce640bd0df3d369" - integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== postcss-discard-duplicates@^5.1.0: version "5.1.0" @@ -5659,14 +6634,14 @@ postcss-discard-unused@^5.1.0: dependencies: postcss-selector-parser "^6.0.5" -postcss-loader@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== +postcss-loader@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.0.1.tgz#4c883cc0a1b2bfe2074377b7a74c1cd805684395" + integrity sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ== dependencies: cosmiconfig "^7.0.0" klona "^2.0.5" - semver "^7.3.5" + semver "^7.3.7" postcss-merge-idents@^5.1.1: version "5.1.1" @@ -5676,20 +6651,20 @@ postcss-merge-idents@^5.1.1: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-merge-longhand@^5.1.5: - version "5.1.5" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz#b0e03bee3b964336f5f33c4fc8eacae608e91c05" - integrity sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w== +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^5.1.0" + stylehacks "^5.1.1" -postcss-merge-rules@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz#d327b221cd07540bcc8d9ff84446d8b404d00162" - integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== +postcss-merge-rules@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz#8f97679e67cc8d08677a6519afca41edf2220894" + integrity sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" cssnano-utils "^3.1.0" postcss-selector-parser "^6.0.5" @@ -5710,19 +6685,19 @@ postcss-minify-gradients@^5.1.1: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-params@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" - integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz#17c2be233e12b28ffa8a421a02fc8b839825536c" - integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: postcss-selector-parser "^6.0.5" @@ -5766,17 +6741,17 @@ postcss-normalize-display-values@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-positions@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" - integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" - integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: postcss-value-parser "^4.2.0" @@ -5794,12 +6769,12 @@ postcss-normalize-timing-functions@^5.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" - integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-value-parser "^4.2.0" postcss-normalize-url@^5.1.0: @@ -5817,10 +6792,10 @@ postcss-normalize-whitespace@^5.1.1: dependencies: postcss-value-parser "^4.2.0" -postcss-ordered-values@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz#0b41b610ba02906a3341e92cab01ff8ebc598adb" - integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" @@ -5832,12 +6807,12 @@ postcss-reduce-idents@^5.2.0: dependencies: postcss-value-parser "^4.2.0" -postcss-reduce-initial@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" - integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== +postcss-reduce-initial@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz#c18b7dfb88aee24b1f8e4936541c29adbd35224e" + integrity sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" caniuse-api "^3.0.0" postcss-reduce-transforms@^5.1.0: @@ -5887,7 +6862,7 @@ postcss-zindex@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== -postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.13, postcss@^8.4.7: +postcss@^8.3.11, postcss@^8.4.7: version "8.4.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== @@ -5896,6 +6871,15 @@ postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.13, postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.14, postcss@^8.4.17: + version "8.4.19" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" + integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -5914,10 +6898,10 @@ pretty-time@^1.1.0: resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^1.3.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.3.tgz#9b5a4211a6756eee3c96fee9a05733abc0b0805c" - integrity sha512-Viur/7tBTCH2HmYzwCHmt2rEFn+rdIWNIINXyg0StiISbDiIhHKhrFuEK8eMkKgvsIYSjgGqy/hNyucHp6FpoQ== +prism-react-renderer@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" + integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== prismjs@^1.28.0: version "1.28.0" @@ -6159,29 +7143,28 @@ react-router-config@^5.1.1: dependencies: "@babel/runtime" "^7.1.2" -react-router-dom@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.3.tgz#8779fc28e6691d07afcaf98406d3812fe6f11199" - integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng== +react-router-dom@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" + integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.3.3" + react-router "5.3.4" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.3.3, react-router@^5.2.0: - version "5.3.3" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.3.tgz#8e3841f4089e728cf82a429d92cdcaa5e4a3a288" - integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w== +react-router@5.3.4, react-router@^5.3.3: + version "5.3.4" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" + integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" @@ -6219,7 +7202,7 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1: +readable-stream@^3.0.6: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -6261,11 +7244,23 @@ regenerate-unicode-properties@^10.0.1: dependencies: regenerate "^1.4.2" +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -6290,6 +7285,18 @@ regexpu-core@^5.0.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" +regexpu-core@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.1.tgz#a69c26f324c1e962e9ffd0b88b055caba8089139" + integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsgen "^0.7.1" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + registry-auth-token@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" @@ -6309,6 +7316,11 @@ regjsgen@^0.6.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d" integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA== +regjsgen@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" + integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== + regjsparser@^0.8.2: version "0.8.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f" @@ -6316,29 +7328,18 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" -rehype-parse@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz#aeb3fdd68085f9f796f1d3137ae2b85a98406964" - integrity sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug== +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== dependencies: - hast-util-from-parse5 "^5.0.0" - parse5 "^5.0.0" - xtend "^4.0.0" + jsesc "~0.5.0" relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= -remark-admonitions@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz#87caa1a442aa7b4c0cafa04798ed58a342307870" - integrity sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow== - dependencies: - rehype-parse "^6.0.2" - unified "^8.4.2" - unist-util-visit "^2.0.1" - remark-emoji@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" @@ -6577,10 +7578,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selfsigned@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" - integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== dependencies: node-forge "^1" @@ -6777,7 +7778,7 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -sockjs@^0.3.21: +sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== @@ -6791,11 +7792,6 @@ sort-css-media-queries@2.0.4: resolved "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-2.0.4.tgz#b2badfa519cb4a938acbc6d3aaa913d4949dc908" integrity sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw== -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-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" @@ -6814,7 +7810,7 @@ source-map@^0.5.0: 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.0, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6959,12 +7955,12 @@ style-to-object@0.3.0, style-to-object@^0.3.0: dependencies: inline-style-parser "0.1.1" -stylehacks@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" - integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== dependencies: - browserslist "^4.16.6" + browserslist "^4.21.4" postcss-selector-parser "^6.0.4" supports-color@^5.3.0: @@ -7021,7 +8017,7 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: +terser-webpack-plugin@^5.1.3: version "5.3.1" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== @@ -7032,6 +8028,17 @@ terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: source-map "^0.6.1" terser "^5.7.2" +terser-webpack-plugin@^5.3.3: + version "5.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" + integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.14" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + terser "^5.14.1" + terser@^5.10.0, terser@^5.7.2: version "5.14.2" resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" @@ -7042,6 +8049,16 @@ terser@^5.10.0, terser@^5.7.2: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.14.1: + version "5.15.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c" + integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -7057,7 +8074,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.3: +tiny-warning@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -7187,13 +8204,14 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^8.4.2: - version "8.4.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz#13ad58b4a437faa2751a4a4c6a16f680c500fff1" - integrity sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA== +unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" + is-buffer "^2.0.0" is-plain-obj "^2.0.0" trough "^1.0.0" vfile "^4.0.0" @@ -7254,7 +8272,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.1, unist-util-visit@^2.0.3: +unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== @@ -7273,6 +8291,14 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + update-notifier@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" @@ -7402,10 +8428,10 @@ wait-on@^6.0.1: minimist "^1.2.5" rxjs "^7.5.4" -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -7417,7 +8443,7 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -web-namespaces@^1.0.0, web-namespaces@^1.1.2: +web-namespaces@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== @@ -7453,15 +8479,16 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.8.1: - version "4.9.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz#737dbf44335bb8bde68f8f39127fc401c97a1557" - integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw== +webpack-dev-server@^4.9.3: + version "4.11.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5" + integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" "@types/express" "^4.17.13" "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" "@types/ws" "^8.5.1" ansi-html-community "^0.0.8" @@ -7469,7 +8496,7 @@ webpack-dev-server@^4.8.1: chokidar "^3.5.3" colorette "^2.0.10" compression "^1.7.4" - connect-history-api-fallback "^1.6.0" + connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" @@ -7480,9 +8507,9 @@ webpack-dev-server@^4.8.1: p-retry "^4.5.0" rimraf "^3.0.2" schema-utils "^4.0.0" - selfsigned "^2.0.1" + selfsigned "^2.1.1" serve-index "^1.9.1" - sockjs "^0.3.21" + sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" ws "^8.4.2" @@ -7495,34 +8522,26 @@ webpack-merge@^5.8.0: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^1.4.3: - 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-sources@^3.2.3: +webpack-sources@^3.2.2, webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.72.0: - version "5.72.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13" - integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung== +webpack@^5.73.0: + version "5.75.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" + integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -7535,7 +8554,7 @@ webpack@^5.72.0: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" webpackbar@^5.0.2: From 73059c7a5935cf256e90a8f40f08b3d2f12c635e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 13 Nov 2022 18:41:51 +0100 Subject: [PATCH 078/245] Update zio, zio-streams, zio-test, ... to 2.0.3 (#438) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index d0dc940ea..3332f81a9 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.2" + val zio = "2.0.3" val grpc = "1.47.0" } From 9e92a80040bc3780aecad79b953225598f26647e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:42:48 -0800 Subject: [PATCH 079/245] Update scala.js bundler --- examples/fullapp/project/plugins.sbt | 2 +- project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 6f2f20ef7..fa446da86 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -16,4 +16,4 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") -addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") +addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.0") diff --git a/project/plugins.sbt b/project/plugins.sbt index a0a188e8c..21e7b9e7b 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -14,7 +14,7 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") -addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.20.0") +addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.0") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") From dd3c562b5c1c43fa0ecea1b7d56abdabdcd8cecf Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:45:09 -0800 Subject: [PATCH 080/245] Update scalafmt.conf to 3.5.9 --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index b75ee794e..f64c40f4b 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.5.8" +version = "3.5.9" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 align.preset = most From 17190b882cbc16eb9e133733fa421aaa395b8cd2 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:49:09 -0800 Subject: [PATCH 081/245] Update grpc version; remove stale docs from README.md --- README.md | 32 -------------------------------- build.sbt | 2 +- examples/fullapp/build.sbt | 2 +- examples/helloworld/build.sbt | 2 +- examples/routeguide/build.sbt | 2 +- 5 files changed, 4 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 4d209a940..5f24db62b 100644 --- a/README.md +++ b/README.md @@ -16,37 +16,5 @@ This library enables you to write purely functional [gRPC](https://grpc.io/) ser * Uses ZIO's `Stream` to let you easily implement streaming requests. * Cancellable RPCs: client-side ZIO interruptions are propagated to the server to abort the request and save resources. -## Installation - -Find the latest snapshot in [here](https://oss.sonatype.org/content/repositories/snapshots/com/thesamet/scalapb/zio-grpc/zio-grpc-core_2.13/). - -Add the following to your `project/plugins.sbt`: - - val zioGrpcVersion = "0.4.2" - - addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.0-RC4") - - libraryDependencies += "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion -Add the following to your `build.sbt`: - - val grpcVersion = "1.34.0" - - PB.targets in Compile := Seq( - scalapb.gen(grpc = true) -> (sourceManaged in Compile).value, - scalapb.zio_grpc.ZioCodeGenerator -> (sourceManaged in Compile).value, - ) - - libraryDependencies ++= Seq( - "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "io.grpc" % "grpc-netty" % grpcVersion - ) - -## Usage - -Place your service proto files in `src/main/protobuf`, and the plugin -will generate Scala sources for them. Learn more about how to use [ZIO gRPC generated code](https://scalapb.github.io/zio-grpc/docs/generated-code). - -See a full example at the [examples directory](https://github.com/scalapb/zio-grpc/tree/master/examples). - [Link-SonatypeSnapshots]: https://oss.sonatype.org/content/repositories/snapshots/com/thesamet/scalapb/zio-grpc/zio-grpc-core_2.13/ "Sonatype Snapshots" [Badge-SonatypeSnapshots]: https://img.shields.io/nexus/s/https/oss.sonatype.org/com.thesamet.scalapb.zio-grpc/zio-grpc-core_2.13.svg "Sonatype Snapshots" diff --git a/build.sbt b/build.sbt index ed9d143bf..65a7eeba5 100644 --- a/build.sbt +++ b/build.sbt @@ -132,7 +132,7 @@ lazy val docs = project moduleName := "zio-grpc-docs", mdocVariables := Map( "sbtProtocVersion" -> "1.0.6", - "grpcVersion" -> "1.47.0", + "grpcVersion" -> "1.50.1", "zioGrpcVersion" -> "0.6.0-M1", "scalapbVersion" -> scalapb.compiler.Version.scalapbVersion ), diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 62e32468e..af12cf361 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -6,7 +6,7 @@ ThisBuild / cancelable := true ThisBuild / connectInput := true -val grpcVersion = "1.47.0" +val grpcVersion = "1.50.1" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index dad879076..37dac1276 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -2,7 +2,7 @@ scalaVersion := "2.13.10" resolvers ++= Resolver.sonatypeOssRepos("snapshots") -val grpcVersion = "1.47.0" +val grpcVersion = "1.50.1" Compile / PB.targets := Seq( scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 266ad8012..2447eaeac 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -2,7 +2,7 @@ scalaVersion := "2.13.10" resolvers ++= Resolver.sonatypeOssRepos("snapshots") -val grpcVersion = "1.47.0" +val grpcVersion = "1.50.1" Compile / PB.targets := Seq( scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, From a838b201236b9799ed3e06a6867794cc3f149241 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 13 Nov 2022 09:49:58 -0800 Subject: [PATCH 082/245] Update sbt-projectmatrix --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 21e7b9e7b..7a19fcd8d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -20,4 +20,4 @@ addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.6") -addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.8.0") +addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.0") From 94987f2bd2c2a567bc4672bb8159a0ae34f8f8ef Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 15 Nov 2022 06:41:21 +0100 Subject: [PATCH 083/245] Update sbt-scalafmt to 2.5.0 (#445) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 7a19fcd8d..7b0373159 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.12" -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") From baaecc12cfd1cff72722224e30cb7c777b3acab9 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Sat, 19 Nov 2022 17:13:30 +0000 Subject: [PATCH 084/245] Update ZIO 2.0.4 (#450) Co-authored-by: Regis Kuckaertz --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 3332f81a9..d6a41ebc8 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.3" + val zio = "2.0.4" val grpc = "1.47.0" } From fcbebe07fb8973fd83c207db58b0094e9a2b96eb Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Thu, 24 Nov 2022 15:07:44 +0000 Subject: [PATCH 085/245] fix: flaky test (#451) fix: flaky test Co-authored-by: Regis Kuckaertz --- e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala | 2 +- e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index 5733faebb..fa92c90a2 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -108,7 +108,7 @@ package object server { def awaitReceived = requestReceived.await - def awaitDelayReceived = requestReceived.await + def awaitDelayReceived = delayReceived.await def awaitExit = exit.await } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index b8be325f6..994f9792a 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -9,7 +9,7 @@ import scalapb.zio_grpc.testservice._ import zio.{durationInt, Fiber, Queue, URIO, ZIO, ZLayer} import zio.stream.{Stream, ZStream} import zio.test.Assertion._ -import zio.test.TestAspect.timeout +import zio.test.TestAspect.{nonFlaky, timeout} import zio.test._ object TestServiceSpec extends ZIOSpecDefault { @@ -200,7 +200,7 @@ object TestServiceSpec extends ZIOSpecDefault { _ <- fiber.interrupt exit <- TestServiceImpl.awaitExit } yield exit)(isInterrupted) - }, + } @@ nonFlaky, test("returns response on failures") { assertZIO( TestServiceClient From 9f9e46df7645e25fd7ae52a183729b9bba56bbf5 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 8 Dec 2022 23:13:11 +0100 Subject: [PATCH 086/245] Update zio, zio-streams, zio-test, ... to 2.0.5 (#455) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index d6a41ebc8..12f37abc5 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.4" + val zio = "2.0.5" val grpc = "1.47.0" } From 755209d11e6f64b6f95d1d2de1e025de52136280 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 10 Dec 2022 11:17:21 -0800 Subject: [PATCH 087/245] Add docs for backpressure support. See #14 --- website/versioned_docs/version-0.5.x/backpressure.md | 9 +++++++++ website/versioned_sidebars/version-0.5.x-sidebars.json | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 website/versioned_docs/version-0.5.x/backpressure.md diff --git a/website/versioned_docs/version-0.5.x/backpressure.md b/website/versioned_docs/version-0.5.x/backpressure.md new file mode 100644 index 000000000..211f276a2 --- /dev/null +++ b/website/versioned_docs/version-0.5.x/backpressure.md @@ -0,0 +1,9 @@ +--- +title: Backpressure +sidebar_label: Backpressure +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/backpressure.md +--- + +From version 0.5.3 onwards, zio-grpc provides backpressure support for server +streaming RPCs. In case the call is not capable to sending additional messages +without buffering (as determined by [`ServerCall.isReady`](https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerCall.html#isReady])), sending messages from the queue associated with server response `Stream` will stop. The default size of this queue is `16`, and can be configured by settings the system property `zio-grpc.backpressure-queue-size`. diff --git a/website/versioned_sidebars/version-0.5.x-sidebars.json b/website/versioned_sidebars/version-0.5.x-sidebars.json index 78afcb7f6..3c1e64041 100644 --- a/website/versioned_sidebars/version-0.5.x-sidebars.json +++ b/website/versioned_sidebars/version-0.5.x-sidebars.json @@ -47,6 +47,10 @@ { "type": "doc", "id": "version-0.5.x/scala.js" + }, + { + "type": "doc", + "id": "version-0.5.x/backpressure" } ] } From 59fafda706f3a6cade8c722485b126a9f5314b98 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 11 Dec 2022 10:29:08 -0800 Subject: [PATCH 088/245] Updating doc --- website/versioned_docs/version-0.5.x/backpressure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/versioned_docs/version-0.5.x/backpressure.md b/website/versioned_docs/version-0.5.x/backpressure.md index 211f276a2..b05a71f05 100644 --- a/website/versioned_docs/version-0.5.x/backpressure.md +++ b/website/versioned_docs/version-0.5.x/backpressure.md @@ -6,4 +6,4 @@ custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/backpressu From version 0.5.3 onwards, zio-grpc provides backpressure support for server streaming RPCs. In case the call is not capable to sending additional messages -without buffering (as determined by [`ServerCall.isReady`](https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerCall.html#isReady])), sending messages from the queue associated with server response `Stream` will stop. The default size of this queue is `16`, and can be configured by settings the system property `zio-grpc.backpressure-queue-size`. +without buffering (as determined by [`ServerCall.isReady`](https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerCall.html#isReady])), sending messages from the queue associated with server response `Stream` will stop. The default size of this queue is `16`, and can be configured by setting the system property `zio-grpc.backpressure-queue-size`. From 737b0e189737c1d3a85139754616fd91e96d6e50 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 11 Dec 2022 19:06:57 -0800 Subject: [PATCH 089/245] Bump Scala.js to 1.12.0 --- examples/fullapp/project/plugins.sbt | 2 +- project/plugins.sbt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index fa446da86..36776ef84 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -12,7 +12,7 @@ libraryDependencies ++= Seq( ) // For Scala.js: -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") diff --git a/project/plugins.sbt b/project/plugins.sbt index 7b0373159..4b9abc29d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -10,7 +10,7 @@ addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.11.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") From 30339ef279838d10252d90a3e8b0fc2a4aa0f768 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 12 Dec 2022 04:07:50 +0100 Subject: [PATCH 090/245] Update scala-java-time to 2.5.0 (#453) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 65a7eeba5..5b82ad2b8 100644 --- a/build.sbt +++ b/build.sbt @@ -61,7 +61,7 @@ lazy val core = projectMatrix .settings( libraryDependencies ++= Seq( "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.4", - "io.github.cquiroz" %%% "scala-java-time" % "2.4.0" % "test" + "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" % "test" ), Compile / npmDependencies += "grpc-web" -> "1.2.1" ) From c42b410275c3455af121ff21d12787eb06c969c2 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Thu, 24 Nov 2022 21:14:56 +0000 Subject: [PATCH 091/245] Add support for backpressure (zio 2) (#448) Co-authored-by: Regis Kuckaertz Co-authored-by: Nadav Samet --- .scalafmt.conf | 2 +- build.sbt | 7 +- .../scalapb/zio_grpc/server/CallDriver.scala | 11 +++ .../scalapb/zio_grpc/server/ZServerCall.scala | 15 +++- .../zio_grpc/server/ZServerCallHandler.scala | 67 ++++++++++++--- .../scalapb/zio_grpc/BackpressureSpec.scala | 54 ++++++++++++ .../scalapb/zio_grpc/BackpressureSpec.scala | 85 +++++++++++++++++++ .../scalapb/zio_grpc/ClientCallsSpec.scala | 13 ++- .../scalapb/zio_grpc/TestServiceSpec.scala | 3 +- 9 files changed, 233 insertions(+), 24 deletions(-) create mode 100644 e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala create mode 100644 e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala diff --git a/.scalafmt.conf b/.scalafmt.conf index f64c40f4b..ebff12733 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.5.9" +version = "3.6.1" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 align.preset = most diff --git a/build.sbt b/build.sbt index 5b82ad2b8..1df60f4e7 100644 --- a/build.sbt +++ b/build.sbt @@ -103,12 +103,15 @@ lazy val e2e = .defaultAxes() .enablePlugins(LocalCodeGenPlugin) .jvmPlatform(ScalaVersions) + .configs(IntegrationTest) .settings(stdSettings) .settings( + Defaults.itSettings, + crossScalaVersions := Seq(Scala212, Scala213), publish / skip := true, libraryDependencies ++= Seq( - "dev.zio" %% "zio-test" % Version.zio % "test", - "dev.zio" %% "zio-test-sbt" % Version.zio % "test", + "dev.zio" %% "zio-test" % Version.zio % "test,it", + "dev.zio" %% "zio-test-sbt" % Version.zio % "test,it", "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, "io.grpc" % "grpc-netty" % Version.grpc ), diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala index 75779b336..1f8080940 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala @@ -65,6 +65,11 @@ object CallDriver { } .getOrThrowFiberFailure() } + + override def onReady(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(call.setReady()) + } }, run = ( call.request(2) *> @@ -134,6 +139,12 @@ object CallDriver { ) .getOrThrowFiberFailure() } + + override def onReady(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run(call.setReady()) + } }, run = { val requestStream = ZStream diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala index a4b8cf2c2..99becbdb2 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala @@ -3,11 +3,22 @@ package scalapb.zio_grpc.server import io.grpc.{Metadata, ServerCall, Status} import zio.ZIO import scalapb.zio_grpc.GIO +import zio.stm.TSemaphore +import zio.UIO /** Wrapper around [[io.grpc.ServerCall]] that lifts its effects into ZIO values */ -class ZServerCall[Res](private val call: ServerCall[_, Res]) extends AnyVal { +final class ZServerCall[Res](private val call: ServerCall[_, Res], private val canSend: TSemaphore) { + def isReady: UIO[Boolean] = ZIO.succeed(call.isReady()) + def request(n: Int): GIO[Unit] = GIO.fromTask(ZIO.attempt(call.request(n))) + // Blocks until the channel is ready to sent. + // The semaphore being used here gets acquired by users for this class + // and released by `onReady` within the listener created by the CallDriver. + // Marked private for now since the current flow-control implementation is coupled with + // the listener implementation. + private[zio_grpc] def awaitReady: UIO[Unit] = canSend.acquire.commit + def sendMessage(message: Res): GIO[Unit] = GIO.fromTask(ZIO.attempt(call.sendMessage(message))) @@ -16,4 +27,6 @@ class ZServerCall[Res](private val call: ServerCall[_, Res]) extends AnyVal { def close(status: Status, metadata: Metadata): GIO[Unit] = GIO.fromTask(ZIO.attempt(call.close(status, metadata))) + + private[zio_grpc] def setReady(): UIO[Unit] = canSend.release.commit } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 55c8f6797..c040a1ba3 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -10,6 +10,8 @@ import zio.stream.ZStream import scalapb.zio_grpc.RequestContext import io.grpc.Metadata import scalapb.zio_grpc.SafeMetadata +import zio.stm.TSemaphore +import zio.stream.Take class ZServerCallHandler[R, Req, Res]( runtime: Runtime[R], @@ -19,12 +21,12 @@ class ZServerCallHandler[R, Req, Res]( call: ServerCall[Req, Res], headers: Metadata ): Listener[Req] = { - val zioCall = new ZServerCall(call) - val runner = for { + val runner = for { responseMetadata <- SafeMetadata.make - driver <- SafeMetadata.fromMetadata(headers).flatMap { md => - mkDriver(zioCall, RequestContext.fromServerCall(md, responseMetadata, call)) - } + canSend <- TSemaphore.make(1).commit + zioCall = new ZServerCall(call, canSend) + md <- SafeMetadata.fromMetadata(headers) + driver <- mkDriver(zioCall, RequestContext.fromServerCall(md, responseMetadata, call)) // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener // back to grpc-java. If it was just fork, the call to unsafeRun would not return control, so grpc-java // won't have a listener to call on. The driver awaits on the calls to the listener to pass to the user's @@ -39,6 +41,16 @@ class ZServerCallHandler[R, Req, Res]( } object ZServerCallHandler { + private[zio_grpc] val queueSizeProp = "zio-grpc.backpressure-queue-size" + + val backpressureQueueSize: IO[Status, Int] = + ZIO + .attempt(sys.props.get(queueSizeProp).map(_.toInt).getOrElse(16)) + .refineToOrDie[NumberFormatException] + .catchAll { t => + ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}")) + } + def unaryInput[R, Req, Res]( runtime: Runtime[R], impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[R, Status, Unit] @@ -62,7 +74,7 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Req => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - unaryInput( + unaryInput[Any, Req, Res]( runtime, (req, requestContext, call) => impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) @@ -72,17 +84,17 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Req => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - unaryInput( + unaryInput[Any, Req, Res]( runtime, (req: Req, requestContext: RequestContext, call: ZServerCall[Res]) => - impl(req).provideEnvironment(ZEnvironment(requestContext)).foreach(call.sendMessage) + serverStreamingWithBackpressure(call, impl(req).provideEnvironment(ZEnvironment(requestContext))) ) def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], impl: Stream[Status, Req] => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - streamingInput( + streamingInput[Any, Req, Res]( runtime, (req, requestContext, call) => impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) @@ -92,9 +104,42 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Stream[Status, Req] => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - streamingInput( + streamingInput[Any, Req, Res]( runtime, (req, requestContext, call) => - impl(req).provideEnvironment(ZEnvironment(requestContext)).foreach(call.sendMessage) + serverStreamingWithBackpressure(call, impl(req).provideEnvironment(ZEnvironment(requestContext))) ) + + def serverStreamingWithBackpressure[Res]( + call: ZServerCall[Res], + stream: ZStream[Any, Status, Res] + ): ZIO[Any, Status, Unit] = { + def innerLoop(queue: Dequeue[Take[Status, Res]], buffer: Ref[Chunk[Res]]): ZIO[Any, Status, Boolean] = + buffer + .modify(chunk => chunk.headOption -> chunk.drop(1)) + .flatMap { + case None => + queue.take.flatMap( + _.foldZIO(ZIO.succeed(false), ZIO.failCause(_), buffer.set(_) *> innerLoop(queue, buffer)) + ) + case Some(res) => + call.sendMessage(res).as(true) + } + .repeatWhileZIO(res => call.isReady.map(_ && res)) + + def outerLoop(queue: Dequeue[Take[Status, Res]])(buffer: Ref[Chunk[Res]]): ZIO[Any, Status, Boolean] = + (call.awaitReady *> innerLoop(queue, buffer)) + .repeatWhile(identity) + + for { + queueSize <- backpressureQueueSize + _ <- ZIO.scoped( + stream + .toQueue(queueSize) + .flatMap { queue => + Ref.make[Chunk[Res]](Chunk.empty).flatMap(outerLoop(queue)) + } + ) + } yield () + } } diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala new file mode 100644 index 000000000..c3aef2af8 --- /dev/null +++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -0,0 +1,54 @@ +package scalapb.zio_grpc + +import io.grpc.Status +import io.grpc.inprocess.InProcessServerBuilder +import scalapb.zio_grpc.testservice.Request +import scalapb.zio_grpc.testservice.Response +import scalapb.zio_grpc.testservice.ZioTestservice +import zio._ +import zio.stream.ZStream +import zio.test._ +import io.grpc.inprocess.InProcessChannelBuilder + +object BackpressureSpec extends ZIOSpecDefault { + val server = + ServerLayer.access[ZioTestservice.TestService](InProcessServerBuilder.forName("backpressure-test").directExecutor()) + + val client = + ZLayer.scoped[Server] { + for { + ss <- ZIO.service[Server.Service] + port <- ss.port.orDie + ch = InProcessChannelBuilder.forName("backpressure-test").usePlaintext().directExecutor() + client <- ZioTestservice.TestServiceClient.scoped(ZManagedChannel(ch)).orDie + } yield client + } + + val service = + ZLayer.succeed[ZioTestservice.TestService] { + new ZioTestservice.TestService { + val responses = ZStream.iterate(0)(_ + 1).map(i => Response(i.toString)).take(100) + + def bidiStreaming(request: zio.stream.Stream[Status, Request]): ZStream[Any with Any, Status, Response] = + request.drain ++ responses + + def serverStreaming(request: Request): ZStream[Any with Any, Status, Response] = + responses + + def clientStreaming(request: zio.stream.Stream[Status, Request]): ZIO[Any with Any, Status, Response] = ??? + + def unary(request: Request): ZIO[Any with Any, Status, Response] = ??? + } + } + + val spec = + suite("BackpressureSpec")( + test("Slow client") { + for { + _ <- ZioTestservice.TestServiceClient.serverStreaming(Request(Request.Scenario.OK)).foreach { response => + zio.Console.printLine(s"Received response: $response") *> Live.live(zio.Clock.sleep(1.second)) + } + } yield assertCompletes + } + ).provideLayerShared((service >+> server >+> client).orDie) +} diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala new file mode 100644 index 000000000..04587263d --- /dev/null +++ b/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -0,0 +1,85 @@ +package scalapb.zio_grpc + +import zio._ +import zio.stream._ +import zio.test._ +import zio.test.Assertion._ +import scalapb.zio_grpc.server.ZServerCallHandler +import scalapb.zio_grpc.server.ZServerCall +import zio.stm.TSemaphore +import io.grpc.Attributes +import io.grpc.ServerCall + +object BackpressureSpec extends ZIOSpecDefault { + val spec = + suite("Backpressure")( + test("Die is propagated") { + assertZIO(for { + sem <- TSemaphore.make(1).commit + exit <- + ZServerCallHandler + .serverStreamingWithBackpressure( + new ZServerCall(null, sem), + ZStream.die(new RuntimeException("Boom")) + ) + .exit + } yield exit)(dies(hasMessage(equalTo("Boom")))) + }, + test("Gets default queue size") { + assertZIO(ZServerCallHandler.backpressureQueueSize)(equalTo(16)) + }, + test("Gets queue size from config") { + assertZIO(for { + _ <- ZIO.attempt(sys.props += ZServerCallHandler.queueSizeProp -> "32") + size <- ZServerCallHandler.backpressureQueueSize + _ <- ZIO.attempt(sys.props -= ZServerCallHandler.queueSizeProp) + } yield size)(equalTo(32)) + }, + test("Fails when queue size is malformatted") { + assertZIO(for { + _ <- ZIO.attempt(sys.props += ZServerCallHandler.queueSizeProp -> " 32 ") + size <- ZServerCallHandler.backpressureQueueSize.exit + _ <- ZIO.attempt(sys.props -= ZServerCallHandler.queueSizeProp) + } yield size)(fails(anything)) + }, + test("Interruption is propagated") { + assertZIO(for { + sem <- TSemaphore.make(1).commit + exit <- ZServerCallHandler + .serverStreamingWithBackpressure(new ZServerCall(null, sem), ZStream.fromZIO(ZIO.interrupt)) + .exit + } yield exit)(isInterrupted) + }, + test("Normal execution") { + val input = List.iterate(0, 100)(_ + 1) + + for { + sem <- TSemaphore.make(1).commit + runtime <- ZIO.runtime[Any] + ref <- Ref.make(List.empty[Int]) + call = new ServerCall[Any, Int]() { + override def sendMessage(message: Int): Unit = { + val _ = Unsafe.unsafe { implicit u => + runtime.unsafe.run(ref.update(message :: _)) + } + } + var listener: ServerCall.Listener[Any] = null + override def request(numMessages: Int): Unit = () + override def sendHeaders(headers: io.grpc.Metadata): Unit = () + override def close(status: io.grpc.Status, trailers: io.grpc.Metadata): Unit = () + override def isReady: Boolean = true + override def setCompression(s: String): Unit = () + override def setMessageCompression(enabled: Boolean): Unit = () + override def getAttributes: Attributes = Attributes.EMPTY + override def getMethodDescriptor: io.grpc.MethodDescriptor[Any, Int] = null + override def isCancelled(): Boolean = false + } + exit <- ZServerCallHandler + .serverStreamingWithBackpressure(new ZServerCall(call, sem), ZStream.fromIterable(input)) + .exit + result <- ref.get + } yield assert(exit)(succeeds(equalTo(()))) && assert(result)(hasSameElements(input)) + } + ) @@ TestAspect.sequential + +} diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala index 67bb08914..855096dbb 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala @@ -14,15 +14,15 @@ object ClientCallsSpec extends ZIOSpecDefault { suite("unaryCall")( test("should not fail with 'INTERNAL: already started' on retry") { for { - channel <- ZChannel.scoped[Any]( - ManagedChannelBuilder.forAddress("localhost", 0).usePlaintext(), - Nil, - 1.second - ) + channel <- ZChannel + .scoped[Any]( + ManagedChannelBuilder.forAddress("localhost", 0).usePlaintext(), + Nil, + 1.second + ) meta <- SafeMetadata.make res <- ClientCalls .unaryCall( - // This test does not require working server channel, scalapb.zio_grpc.testservice.TestServiceGrpc.METHOD_UNARY, CallOptions.DEFAULT, @@ -31,7 +31,6 @@ object ClientCallsSpec extends ZIOSpecDefault { ) .retry(Schedule.recurs(2)) .exit - } yield // There was a bug, when call.start was invoked multiple times, so this test was failing // with 'already started' instead of 'io exception' diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 994f9792a..94ad65f58 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -332,6 +332,5 @@ object TestServiceSpec extends ZIOSpecDefault { serverStreamingSuite, clientStreamingSuite, bidiStreamingSuite - ).provideCustomLayer(layers.orDie) - + ).provideLayer(layers.orDie) } From 59b50fc36483b757ad212f1a2bc9a1eed3deb7b6 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sun, 11 Dec 2022 21:47:41 -0800 Subject: [PATCH 092/245] Run integration tests in CI --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a35282e4..14d39bfe5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: - name: Compile and test (JVM) run: | - sbt coreJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/test + sbt coreJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/it:test - name: Compile and test (JS) if: ${{ matrix.scala != 3 }} From e406b479536fbad4cada34c22390327bee70e861 Mon Sep 17 00:00:00 2001 From: Pierre Ricadat Date: Fri, 30 Dec 2022 12:57:34 +0900 Subject: [PATCH 093/245] Remove calls to race (#457) --- .../scalapb/zio_grpc/server/CallDriver.scala | 190 ------------------ .../zio_grpc/server/ListenerDriver.scala | 177 ++++++++++++++++ .../scalapb/zio_grpc/server/ZServerCall.scala | 2 +- .../zio_grpc/server/ZServerCallHandler.scala | 15 +- .../scalapb/zio_grpc/CallDriverSpec.scala | 8 +- 5 files changed, 187 insertions(+), 205 deletions(-) delete mode 100644 core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala create mode 100644 core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala deleted file mode 100644 index 1f8080940..000000000 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/CallDriver.scala +++ /dev/null @@ -1,190 +0,0 @@ -package scalapb.zio_grpc.server - -import io.grpc.ServerCall.Listener -import io.grpc.Status -import zio._ -import zio.stream.{Stream, ZStream} -import scalapb.zio_grpc.RequestContext -import io.grpc.Metadata - -/** Represents a running request to be served by [[ZServerCallHandler]] - * - * The listener is returned to grpc-java to feed input into the request. - * - * The `run` represents an effect of running the request: it reads the input provided to the listener, and writes the - * response to an output channel. It handles interrupts by sending a cancel event through the channel. - */ -case class CallDriver[R, Req]( - listener: Listener[Req], - run: ZIO[R, Status, Unit] -) - -object CallDriver { - def exitToStatus(ex: Exit[Status, Unit]): Status = - ex.foldExit( - failed = { cause => - if (cause.isInterruptedOnly) Status.CANCELLED - else cause.failureOption.getOrElse(Status.INTERNAL) - }, - completed = _ => Status.OK - ) - - def unaryInputCallDriver[R, Req]( - runtime: Runtime[R], - call: ZServerCall[_], - cancelled: Promise[Nothing, Unit], - completed: Promise[Status, Unit], - request: Promise[Nothing, Req], - requestContext: RequestContext, - writeResponse: Req => ZIO[R, Status, Unit] - ): CallDriver[R, Req] = - CallDriver( - listener = new Listener[Req] { - override def onCancel(): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe.run(cancelled.succeed(()).unit).getOrThrowFiberFailure() - } - - override def onHalfClose(): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe.run(completed.completeWith(ZIO.unit).unit).getOrThrowFiberFailure() - } - - override def onMessage(message: Req): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe - .run { - request.succeed(message).flatMap { - case false => - completed - .fail(Status.INTERNAL.withDescription("Too many requests")) - .unit - case true => - ZIO.unit - } - } - .getOrThrowFiberFailure() - } - - override def onReady(): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe.run(call.setReady()) - } - }, - run = ( - call.request(2) *> - completed.await *> - call.sendHeaders(new Metadata) *> - request.await flatMap writeResponse - ).onExit(ex => call.close(CallDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) - .ignore - .race(cancelled.await) - ) - - /** Creates a [[CallDriver]] for a request with a unary input. - * - * writeResponse: given a request, returns a effects that computes the response and writes it through the given - * ZServerCall. - */ - def makeUnaryInputCallDriver[R, Req, Res]( - writeResponse: ( - Req, - RequestContext, - ZServerCall[Res] - ) => ZIO[R, Status, Unit] - )( - zioCall: ZServerCall[Res], - requestContext: RequestContext - ): ZIO[R, Nothing, CallDriver[R, Req]] = - for { - runtime <- ZIO.runtime[R] - cancelled <- Promise.make[Nothing, Unit] - completed <- Promise.make[Status, Unit] - request <- Promise.make[Nothing, Req] - } yield unaryInputCallDriver( - runtime, - zioCall, - cancelled, - completed, - request, - requestContext, - writeResponse(_, requestContext, zioCall) - ) - - def streamingInputCallDriver[R, Req, Res]( - runtime: Runtime[R], - call: ZServerCall[Res], - cancelled: Promise[Nothing, Unit], - queue: Queue[Option[Req]], - requestContext: RequestContext, - writeResponse: Stream[Status, Req] => ZIO[R, Status, Unit] - ): CallDriver[R, Req] = - CallDriver( - listener = new Listener[Req] { - override def onCancel(): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe.run(cancelled.succeed(()).unit).getOrThrowFiberFailure() - } - - override def onHalfClose(): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe.run(queue.offer(None).unit).getOrThrowFiberFailure() - } - - override def onMessage(message: Req): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe - .run( - call.request(1) *> queue.offer(Some(message)).unit - ) - .getOrThrowFiberFailure() - } - - override def onReady(): Unit = - Unsafe.unsafe { implicit u => - runtime.unsafe - .run(call.setReady()) - } - }, - run = { - val requestStream = ZStream - .fromQueue(queue) - .collectWhileSome - - (call.request(1) *> - call.sendHeaders(new Metadata) *> - writeResponse(requestStream)) - .onExit(ex => call.close(CallDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) - .ignore - .race(cancelled.await) - } - ) - - /** Creates a [[CallDriver]] for a request with a streaming input. - * - * writeResponse: given a request, returns a effects that computes the response and writes it through the given - * ZServerCall. - */ - def makeStreamingInputCallDriver[R, Req, Res]( - writeResponse: ( - Stream[Status, Req], - RequestContext, - ZServerCall[Res] - ) => ZIO[R, Status, Unit] - )( - zioCall: ZServerCall[Res], - requestContext: RequestContext - ): ZIO[R, Nothing, CallDriver[R, Req]] = - for { - runtime <- ZIO.runtime[R] - cancelled <- Promise.make[Nothing, Unit] - queue <- Queue.unbounded[Option[Req]] - } yield streamingInputCallDriver[R, Req, Res]( - runtime, - zioCall, - cancelled, - queue, - requestContext, - writeResponse(_, requestContext, zioCall) - ) -} diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala new file mode 100644 index 000000000..02c60cdd4 --- /dev/null +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala @@ -0,0 +1,177 @@ +package scalapb.zio_grpc.server + +import io.grpc.ServerCall.Listener +import io.grpc.Status +import zio._ +import zio.stream.{Stream, ZStream} +import scalapb.zio_grpc.RequestContext +import io.grpc.Metadata + +object ListenerDriver { + def exitToStatus(ex: Exit[Status, Unit]): Status = + ex.foldExit( + failed = { cause => + if (cause.isInterruptedOnly) Status.CANCELLED + else cause.failureOption.getOrElse(Status.INTERNAL) + }, + completed = _ => Status.OK + ) + + def unaryInputListener[R, Req]( + runtime: Runtime[R], + call: ZServerCall[_], + completed: Promise[Status, Unit], + request: Promise[Nothing, Req], + requestContext: RequestContext, + writeResponse: Req => ZIO[R, Status, Unit] + ): ZIO[R, Nothing, Listener[Req]] = + ( + call.request(2) *> + completed.await *> + call.sendHeaders(new Metadata) *> + request.await flatMap writeResponse + ).onExit(ex => call.close(ListenerDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) + .ignore + // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener + // back to grpc-java. If it was just fork, the call to unsafeRun would not return control, so grpc-java + // won't have a listener to call on. The driver awaits on the calls to the listener to pass to the user's + // service. + .forkDaemon + .map(fiber => + new Listener[Req] { + override def onCancel(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(fiber.interrupt.unit).getOrThrowFiberFailure() + } + + override def onHalfClose(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(completed.completeWith(ZIO.unit).unit).getOrThrowFiberFailure() + } + + override def onMessage(message: Req): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run { + request.succeed(message).flatMap { + case false => + completed + .fail(Status.INTERNAL.withDescription("Too many requests")) + .unit + case true => + ZIO.unit + } + } + .getOrThrowFiberFailure() + } + + override def onReady(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(call.setReady()) + } + } + ) + + /** Creates a [[Listener]] for a request with a unary input. + * + * writeResponse: given a request, returns a effects that computes the response and writes it through the given + * ZServerCall. + */ + def makeUnaryInputListener[R, Req, Res]( + writeResponse: ( + Req, + RequestContext, + ZServerCall[Res] + ) => ZIO[R, Status, Unit], + runtime: Runtime[R] + )( + zioCall: ZServerCall[Res], + requestContext: RequestContext + ): ZIO[R, Nothing, Listener[Req]] = + for { + completed <- Promise.make[Status, Unit] + request <- Promise.make[Nothing, Req] + listener <- unaryInputListener( + runtime, + zioCall, + completed, + request, + requestContext, + writeResponse(_, requestContext, zioCall) + ) + } yield listener + + def streamingInputListener[R, Req, Res]( + runtime: Runtime[R], + call: ZServerCall[Res], + queue: Queue[Option[Req]], + requestContext: RequestContext, + writeResponse: Stream[Status, Req] => ZIO[R, Status, Unit] + ): ZIO[R, Nothing, Listener[Req]] = { + val requestStream = ZStream + .fromQueue(queue) + .collectWhileSome + + (call.request(1) *> + call.sendHeaders(new Metadata) *> + writeResponse(requestStream)) + .onExit(ex => call.close(ListenerDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) + .ignore + .forkDaemon + .map(fiber => + new Listener[Req] { + override def onCancel(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(fiber.interrupt.unit).getOrThrowFiberFailure() + } + + override def onHalfClose(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe.run(queue.offer(None).unit).getOrThrowFiberFailure() + } + + override def onMessage(message: Req): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run( + call.request(1) *> queue.offer(Some(message)).unit + ) + .getOrThrowFiberFailure() + } + + override def onReady(): Unit = + Unsafe.unsafe { implicit u => + runtime.unsafe + .run(call.setReady()) + } + } + ) + } + + /** Creates a [[Listener]] for a request with a streaming input. + * + * writeResponse: given a request, returns a effects that computes the response and writes it through the given + * ZServerCall. + */ + def makeStreamingInputListener[R, Req, Res]( + writeResponse: ( + Stream[Status, Req], + RequestContext, + ZServerCall[Res] + ) => ZIO[R, Status, Unit] + )( + zioCall: ZServerCall[Res], + requestContext: RequestContext + ): ZIO[R, Nothing, Listener[Req]] = + for { + runtime <- ZIO.runtime[R] + queue <- Queue.unbounded[Option[Req]] + listener <- streamingInputListener[R, Req, Res]( + runtime, + zioCall, + queue, + requestContext, + writeResponse(_, requestContext, zioCall) + ) + } yield listener +} diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala index 99becbdb2..89493c1f0 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala @@ -14,7 +14,7 @@ final class ZServerCall[Res](private val call: ServerCall[_, Res], private val c // Blocks until the channel is ready to sent. // The semaphore being used here gets acquired by users for this class - // and released by `onReady` within the listener created by the CallDriver. + // and released by `onReady` within the listener. // Marked private for now since the current flow-control implementation is coupled with // the listener implementation. private[zio_grpc] def awaitReady: UIO[Unit] = canSend.acquire.commit diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index c040a1ba3..ac1d6606e 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -15,7 +15,7 @@ import zio.stream.Take class ZServerCallHandler[R, Req, Res]( runtime: Runtime[R], - mkDriver: (ZServerCall[Res], RequestContext) => URIO[R, CallDriver[R, Req]] + mkListener: (ZServerCall[Res], RequestContext) => URIO[R, Listener[Req]] ) extends ServerCallHandler[Req, Res] { def startCall( call: ServerCall[Req, Res], @@ -26,13 +26,8 @@ class ZServerCallHandler[R, Req, Res]( canSend <- TSemaphore.make(1).commit zioCall = new ZServerCall(call, canSend) md <- SafeMetadata.fromMetadata(headers) - driver <- mkDriver(zioCall, RequestContext.fromServerCall(md, responseMetadata, call)) - // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener - // back to grpc-java. If it was just fork, the call to unsafeRun would not return control, so grpc-java - // won't have a listener to call on. The driver awaits on the calls to the listener to pass to the user's - // service. - _ <- driver.run.forkDaemon - } yield driver.listener + listener <- mkListener(zioCall, RequestContext.fromServerCall(md, responseMetadata, call)) + } yield listener Unsafe.unsafe { implicit u => runtime.unsafe.run(runner).getOrThrowFiberFailure() @@ -55,7 +50,7 @@ object ZServerCallHandler { runtime: Runtime[R], impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[R, Status, Unit] ): ServerCallHandler[Req, Res] = - new ZServerCallHandler(runtime, CallDriver.makeUnaryInputCallDriver(impl)) + new ZServerCallHandler(runtime, ListenerDriver.makeUnaryInputListener(impl, runtime)) def streamingInput[R, Req, Res]( runtime: Runtime[R], @@ -67,7 +62,7 @@ object ZServerCallHandler { ): ServerCallHandler[Req, Res] = new ZServerCallHandler( runtime, - CallDriver.makeStreamingInputCallDriver(impl) + ListenerDriver.makeStreamingInputListener(impl) ) def unaryCallHandler[Req, Res]( diff --git a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala index 3156a89d1..6195f2bd5 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala @@ -2,15 +2,15 @@ package scalapb.zio_grpc import io.grpc.Status import scalapb.zio_grpc.TestUtils._ -import scalapb.zio_grpc.server.CallDriver +import scalapb.zio_grpc.server.ListenerDriver import zio._ import zio.Clock._ import zio.Random._ import zio.test._ -object CallDriverSpec extends ZIOSpecDefault { +object ListenerDriverSpec extends ZIOSpecDefault { - def spec = suite("CallDriverSpec")( + def spec = suite("ListenerDriverSpec")( test("exitToStatus prioritizes failures over interrupts") { val effectWithInterruptAndFailure = ZIO .foreachParDiscard(List.range(0, 16))(i => @@ -21,7 +21,7 @@ object CallDriverSpec extends ZIOSpecDefault { } yield () ) .withParallelism(128) - assertZIO(effectWithInterruptAndFailure.exit map CallDriver.exitToStatus)( + assertZIO(effectWithInterruptAndFailure.exit map ListenerDriver.exitToStatus)( hasStatusCode(Status.INVALID_ARGUMENT) ) } From e970e2ded34fbe05b7779f3edd637bbbd147825b Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 30 Dec 2022 08:28:59 -0800 Subject: [PATCH 094/245] Rename CallDriverSpec to ListenerDriverSpec --- .../zio_grpc/{CallDriverSpec.scala => ListenerDriverSpec.scala} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename e2e/src/test/scala/scalapb/zio_grpc/{CallDriverSpec.scala => ListenerDriverSpec.scala} (100%) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala similarity index 100% rename from e2e/src/test/scala/scalapb/zio_grpc/CallDriverSpec.scala rename to e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala From 9b8e7a3a746772ed7874202663da628ea9e9624e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 30 Dec 2022 08:53:01 -0800 Subject: [PATCH 095/245] Rename ManagedServer to ScopedServer --- core/src/main/scala/scalapb/zio_grpc/package.scala | 5 ++++- .../main/scalajs/scalapb/zio_grpc/server/ScopedServer.scala | 3 +++ core/src/main/scalajvm/scalapb/zio_grpc/Server.scala | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 core/src/main/scalajs/scalapb/zio_grpc/server/ScopedServer.scala diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index 8138f7564..c37d1cccf 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -12,4 +12,7 @@ package object zio_grpc { type Server = Server.Service type ZManagedChannel[R] = ZIO[Scope, Throwable, ZChannel[R]] -} + + @deprecated("Use ScopedServer instead of ManagedServer", "0.6.0") + val ManagedServer = scalapb.zio_grpc.ScopedServer +} \ No newline at end of file diff --git a/core/src/main/scalajs/scalapb/zio_grpc/server/ScopedServer.scala b/core/src/main/scalajs/scalapb/zio_grpc/server/ScopedServer.scala new file mode 100644 index 000000000..b5eef3c7d --- /dev/null +++ b/core/src/main/scalajs/scalapb/zio_grpc/server/ScopedServer.scala @@ -0,0 +1,3 @@ +package scalapb.zio_grpc + +object ScopedServer diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 165fe3f47..7866a066b 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -115,7 +115,7 @@ object Server { object ServerLayer { def fromServiceList[R](builder: => ServerBuilder[_], l: ServiceList[R]) = - ZLayer.scoped[R](ManagedServer.fromServiceList(builder, l)) + ZLayer.scoped[R](ScopedServer.fromServiceList(builder, l)) def access[S1: Tag]( builder: => ServerBuilder[_] @@ -151,7 +151,7 @@ object ServerLayer { fromServiceList(builder, ServiceList.add(s1).add(s2).add(s3)) } -object ManagedServer { +object ScopedServer { def fromBuilder(builder: => ServerBuilder[_]): ZIO[Scope, Throwable, Server.Service] = fromServiceList(builder, ServiceList) From 9628310aa828b6ff05995fcc141ea12d17afa27e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 30 Dec 2022 08:53:35 -0800 Subject: [PATCH 096/245] Remove methods deprecated in 0.4.0 --- .../scalajvm/scalapb/zio_grpc/Server.scala | 72 ------------------- 1 file changed, 72 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 7866a066b..e692f5674 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -37,78 +37,6 @@ object Server { def toManaged: ZIO[Scope, Throwable, Service] = start.as(this).withFinalizer(_ => this.shutdown.ignore) } - - @deprecated("Use ManagedServer.fromBuilder", "0.4.0") - def zmanaged(builder: => ServerBuilder[_]): ZIO[Scope, Throwable, Service] = - zmanaged(builder, ZIO.succeed(Nil)) - - @deprecated("Use ManagedServer.fromServiceList", "0.4.0") - def zmanaged[R]( - builder: => ServerBuilder[_], - services: URIO[R, List[ServerServiceDefinition]] - ): ZIO[R with Scope, Throwable, Service] = ManagedServer.fromServiceList(builder, services) - - @deprecated("Use ManagedServer.fromService", "0.4.0") - def zmanaged[S0, R0]( - builder: => ServerBuilder[_], - s0: S0 - )(implicit - b0: ZBindableService[R0, S0] - ): ZIO[R0 with Scope, Throwable, Service] = - ManagedServer.fromServiceList( - builder, - ZIO.collectAll(ZBindableService.serviceDefinition(s0) :: Nil) - ) - - @deprecated("Use ManagedServer.fromServices", "0.4.0") - def zmanaged[ - R0, - S0, - R1, - S1 - ]( - builder: => ServerBuilder[_], - s0: S0, - s1: S1 - )(implicit - b0: ZBindableService[R0, S0], - b1: ZBindableService[R1, S1] - ): ZIO[R0 with R1 with Scope, Throwable, Service] = - ManagedServer.fromServiceList( - builder, - ZIO.collectAll( - ZBindableService.serviceDefinition(s0) :: - ZBindableService.serviceDefinition(s1) :: Nil - ) - ) - - @deprecated("Use ManagedServer.fromServices", "0.4.0") - def zmanaged[ - R0, - S0, - R1, - S1, - R2, - S2 - ]( - builder: => ServerBuilder[_], - s0: S0, - s1: S1, - s2: S2 - )(implicit - b0: ZBindableService[R0, S0], - b1: ZBindableService[R1, S1], - b2: ZBindableService[R2, S2] - ): ZIO[R0 with R1 with R2 with Scope, Throwable, Service] = - ManagedServer.fromServiceList( - builder, - ZIO.collectAll( - ZBindableService.serviceDefinition(s0) :: - ZBindableService.serviceDefinition(s1) :: - ZBindableService.serviceDefinition(s2) :: Nil - ) - ) - def fromManaged(zm: ZIO[Scope, Throwable, Service]) = ZLayer.scoped(zm) } From edcfc75d5d547b05bf39af0b271a7e38f824603c Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 30 Dec 2022 08:58:16 -0800 Subject: [PATCH 097/245] scalafmt --- core/src/main/scala/scalapb/zio_grpc/package.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index c37d1cccf..b3d399a0a 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -15,4 +15,4 @@ package object zio_grpc { @deprecated("Use ScopedServer instead of ManagedServer", "0.6.0") val ManagedServer = scalapb.zio_grpc.ScopedServer -} \ No newline at end of file +} From bfc22a7a250a5dd006a1aeaebd469e738405dbca Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 30 Dec 2022 08:59:13 -0800 Subject: [PATCH 098/245] Remove extra type parameter in BindableServiceSpec --- .../scalapb/zio_grpc/BindableServiceSpec.scala | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index 802fa5df2..cfff29032 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -27,7 +27,7 @@ object BindableServiceSpec extends ZIOSpecDefault { ] implicitly[ZBindableService[Clock with Console, ZTestService[Clock with Console, Any]]] - class UnimpTestService[P, R, C] extends ZTestService[R, C] { + class UnimpTestService[R, C] extends ZTestService[R, C] { def unary(request: Request): ZIO[R with C, Status, Response] = ??? def serverStreaming(request: Request): ZStream[R with C, Status, Response] = ??? @@ -37,13 +37,13 @@ object BindableServiceSpec extends ZIOSpecDefault { def bidiStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZStream[R with C, Status, Response] = ??? } - object S1 extends UnimpTestService[Int, Any, RequestContext] - object S2 extends UnimpTestService[Int, Any, SafeMetadata] - object S3 extends UnimpTestService[Int, Any, Any] - object S4 extends UnimpTestService[Int, Clock, SafeMetadata] - object S5 extends UnimpTestService[Int, Clock, RequestContext] - object S6 extends UnimpTestService[Int, Clock, Any] - object S7 extends UnimpTestService[Int, Console, Any] + object S1 extends UnimpTestService[Any, RequestContext] + object S2 extends UnimpTestService[Any, SafeMetadata] + object S3 extends UnimpTestService[Any, Any] + object S4 extends UnimpTestService[Clock, SafeMetadata] + object S5 extends UnimpTestService[Clock, RequestContext] + object S6 extends UnimpTestService[Clock, Any] + object S7 extends UnimpTestService[Console, Any] ServerLayer.fromService(ServerBuilder.forPort(9000), S1) ServerLayer.fromService(ServerBuilder.forPort(9000), S2) From 7f794fc4184fd0ce3567720cd3a4138903d6610d Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 30 Dec 2022 14:17:18 -0800 Subject: [PATCH 099/245] Add documentation for missing ZBindableService and more methods to construct ServiceList Fixes #460 --- .../scala/scalapb/zio_grpc/ZBindableService.scala | 14 ++++++++++++++ .../main/scalajvm/scalapb/zio_grpc/Server.scala | 10 +++++----- .../scalajvm/scalapb/zio_grpc/ServiceList.scala | 7 ++++++- .../scalapb/zio_grpc/BindableServiceSpec.scala | 1 + 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala index c26a2ccad..d084de596 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala @@ -3,13 +3,27 @@ package scalapb.zio_grpc import io.grpc.ServerServiceDefinition import zio.URIO import zio.Tag +import _root_.scala.annotation.implicitNotFound /** Provides a way to bind a ZIO gRPC service implementations to a server. */ +@implicitNotFound("""Could not find an implicit ZBindableService[${R}, ${S}]. + +Typically, ${S} should extend ZGeneratedService[R, C] for some types R and C where R represents +the dependencies of the service, and C represents the context provided for each request. + +When a ZBindableService could not be found, it means that either: + +1. The provided environment ($R) is missing a dependency of ${S}. + +2. The context type is not Any, SafeMetadata, or RequestContext, or some other type T which +has an implicit instance of CanBind[T] available. +""") trait ZBindableService[-R, S] { /** Effectfully returns a [[io.grpc.ServerServiceDefinition]] for the given service instance */ def bindService(serviceImpl: S): URIO[R, ServerServiceDefinition] } + object ZBindableService { def apply[R, S](implicit ev: ZBindableService[R, S]) = ev diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index e692f5674..cdbfc9731 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -55,16 +55,16 @@ object ServerLayer { )(implicit bs: ZBindableService[R, S1]): ZLayer[R with S1, Throwable, Server] = fromServiceList(builder, ServiceList.accessEnv[R, S1]) - def fromServiceLayer[R, S1: Tag]( - serverBuilder: => ServerBuilder[_] - )(l: ZLayer[R, Throwable, S1])(implicit bs: ZBindableService[Any, S1]) = - l >>> fromServiceList(serverBuilder, ServiceList.access[S1]) - def fromService[R1, S1](builder: => ServerBuilder[_], s1: S1)(implicit bs: ZBindableService[R1, S1] ): ZLayer[R1, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1)) + def fromServiceLayer[R, S1: Tag]( + serverBuilder: => ServerBuilder[_] + )(l: ZLayer[R, Throwable, S1])(implicit bs: ZBindableService[R, S1]): ZLayer[R, Throwable, Server] = + l.flatMap(env => fromService(serverBuilder, env.get[S1])) + def fromServices[R1, S1, R2, S2](builder: => ServerBuilder[_], s1: S1, s2: S2)(implicit bs1: ZBindableService[R1, S1], bs2: ZBindableService[R2, S2] diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala index e10cc26f0..85db0a341 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import zio.{Scope, Tag, ZEnvironment, ZIO} +import zio.{Scope, Tag, ZEnvironment, ZIO, ZLayer} import io.grpc.ServerServiceDefinition /** Represents a managed list of services to be added to the a server. @@ -29,6 +29,11 @@ sealed class ServiceList[-RR] private[scalapb] ( sd <- s1.flatMap(bs.bindService(_)) } yield sd :: l) + def addLayer[R <: RR, S1: Tag](layer: ZLayer[R, Throwable, S1])(implicit + bs: ZBindableService[R, S1] + ): ServiceList[RR with R] = + addScoped[R, R, S1](layer.build.map(_.get)) + /** Adds a dependency on a service that will be provided later from the environment or a Layer * */ def access[B: Tag](implicit bs: ZBindableService[Any, B]): ServiceList[B with RR] = accessEnv[Any, B] diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index cfff29032..08df4eb84 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -52,6 +52,7 @@ object BindableServiceSpec extends ZIOSpecDefault { ServerLayer.fromService(ServerBuilder.forPort(9000), S5) ServerLayer.fromService(ServerBuilder.forPort(9000), S6) ServerLayer.fromService(ServerBuilder.forPort(9000), S7) + val l3a = ServerLayer.fromServices(ServerBuilder.forPort(9000), S1, S2, S3) val l3b = ServerLayer.fromServices(ServerBuilder.forPort(9000), S1, S4, S7) From b876b94c794693729983bef362b711523f77857d Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 14:35:05 -0800 Subject: [PATCH 100/245] Make generated services not depend on environment --- CHANGELOG.md | 19 ++ build.sbt | 2 +- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 172 ++++++++---------- .../zio_grpc/TransformableService.scala | 85 ++++----- .../scalapb/zio_grpc/ZBindableService.scala | 41 ++--- .../scalapb/zio_grpc/ZClientInterceptor.scala | 43 ++--- .../scalapb/zio_grpc/ZGeneratedService.scala | 10 +- .../scala/scalapb/zio_grpc/ZTransform.scala | 59 +++--- .../main/scala/scalapb/zio_grpc/package.scala | 4 +- .../scalajs/scalapb/zio_grpc/Server.scala | 6 +- .../scalajs/scalapb/zio_grpc/ZChannel.scala | 8 +- .../scalapb/zio_grpc/ZManagedChannel.scala | 10 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 72 ++++++-- .../scalapb/zio_grpc/client/ZClientCall.scala | 15 +- .../scalajvm/scalapb/zio_grpc/Server.scala | 120 ++++++------ .../scalapb/zio_grpc/ServerMain.scala | 2 +- .../scalapb/zio_grpc/ServiceList.scala | 53 +++--- .../scalajvm/scalapb/zio_grpc/ZChannel.scala | 19 +- .../scalapb/zio_grpc/ZManagedChannel.scala | 11 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 105 ++++++----- .../client/StreamingClientCallListener.scala | 15 +- .../scalapb/zio_grpc/client/ZClientCall.scala | 67 +++---- .../zio_grpc/server/ListenerDriver.scala | 39 ++-- .../zio_grpc/server/ZServerCallHandler.scala | 26 +-- docs/context.md | 93 ++++++---- docs/decorating.md | 12 +- docs/generated-code.md | 39 ++-- .../scalapb/zio_grpc/BackpressureSpec.scala | 2 +- .../zio_grpc/BindableServiceSpec.scala | 57 ++---- .../scalapb/zio_grpc/ClientCallsSpec.scala | 2 +- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 16 +- .../scala/scalapb/zio_grpc/ServerSpec.scala | 4 +- .../scalapb/zio_grpc/TestServiceSpec.scala | 8 +- 33 files changed, 583 insertions(+), 653 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..1b8b3a054 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# Changelog + +## [Unreleased - 0.6.0](https://github.com/ScalaPB/zio-grpc/tree/HEAD) + +### What changed? + +* Removed the `R` type parameter for generated services. Generated services now have a single + type parameter for context. This simplifies the previous APIs and encourages the style that + service dependencies are passed via constructors (see [service pattern](https://zio.dev/reference/service-pattern/)) +* Removed the `R` type parameter in most APIs. +* ManagedServer renamed to ScopedServer. +* Clean shutdown when a server is ran through a Scope or ZLayer. +* Added backpressure support [docs](https://scalapb.github.io/zio-grpc/docs/backpressure) +* Added client support for response metadata (#428) +* Signifcant server performance improvement ([2.4x faster handling](https://github.com/scalapb/zio-grpc/pull/457#issuecomment-1350234894)) (#457) +* Server can now send response metadata (#418) +* Clients can now access the response metadata sent by server (#428) +* ServiceList now has a `provideLayer` and `provide` that can be used to + satisfy services dependencies. diff --git a/build.sbt b/build.sbt index 1df60f4e7..d1980675e 100644 --- a/build.sbt +++ b/build.sbt @@ -60,7 +60,7 @@ lazy val core = projectMatrix _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( libraryDependencies ++= Seq( - "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.4", + "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.5", "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" % "test" ), Compile / npmDependencies += "grpc-web" -> "1.2.1" diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index ec367af3b..ca425f6b7 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -108,27 +108,26 @@ class ZioFilePrinter( private val accessorsClassName = OuterObject / (service.name + "Accessors") private val accessorsWithMetadataClassName = OuterObject / (service.name + "WithMetadataAccessors") - def methodInType(method: MethodDescriptor, inEnvType: String): String = { + def methodInType(method: MethodDescriptor): String = { val scalaInType = method.inputType.scalaType method.streamType match { case StreamType.Unary => scalaInType case StreamType.ClientStreaming => - stream(scalaInType, inEnvType) + stream(scalaInType, "Any") case StreamType.ServerStreaming => scalaInType case StreamType.Bidirectional => - stream(scalaInType, inEnvType) + stream(scalaInType, "Any") } } def methodSignature( method: MethodDescriptor, - inEnvType: String, outEnvType: String ): String = { - val reqType = methodInType(method, inEnvType) + val reqType = methodInType(method) val scalaOutType = method.outputType.scalaType s"def ${method.name}" + (method.streamType match { @@ -145,31 +144,28 @@ class ZioFilePrinter( def clientMethodSignature( method: MethodDescriptor, - inEnvType: String, - outEnvType: String, - implicitViews: String = "" + outEnvType: String ): String = { - val reqType = methodInType(method, inEnvType) + val reqType = methodInType(method) val scalaOutType = method.outputType.scalaType s"def ${method.name}" + (method.streamType match { case StreamType.Unary => s"(request: $reqType): ${io(scalaOutType, outEnvType)}" case StreamType.ClientStreaming => - s"[${inEnvType}${implicitViews}](request: $reqType): ${io(scalaOutType, outEnvType + " with " + inEnvType)}" + s"(request: $reqType): ${io(scalaOutType, outEnvType)}" case StreamType.ServerStreaming => s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" case StreamType.Bidirectional => - s"[${inEnvType}${implicitViews}](request: $reqType): ${stream(scalaOutType, outEnvType + " with " + inEnvType)}" + s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" }) } def clientWithMetadataMethodSignature( method: MethodDescriptor, - inEnvType: String, outEnvType: String ): String = { - val reqType = methodInType(method, inEnvType) + val reqType = methodInType(method) val scalaOutType = method.outputType.scalaType val ioOutType = s"scalapb.zio_grpc.ResponseContext[$scalaOutType]" val streamOutType = s"scalapb.zio_grpc.ResponseFrame[$scalaOutType]" @@ -178,16 +174,15 @@ class ZioFilePrinter( case StreamType.Unary => s"(request: $reqType): ${io(ioOutType, outEnvType)}" case StreamType.ClientStreaming => - s"[${inEnvType}](request: $reqType): ${io(ioOutType, outEnvType + " with " + inEnvType)}" + s"(request: $reqType): ${io(ioOutType, outEnvType)}" case StreamType.ServerStreaming => s"(request: $reqType): ${stream(streamOutType, outEnvType)}" case StreamType.Bidirectional => - s"[${inEnvType}](request: $reqType): ${stream(streamOutType, outEnvType + " with " + inEnvType)}" + s"(request: $reqType): ${stream(streamOutType, outEnvType)}" }) } def printMethodSignature( - inEnvType: String, outEnvType: String )( fp: FunctionalPrinter, @@ -196,13 +191,11 @@ class ZioFilePrinter( fp.add( methodSignature( method, - inEnvType, outEnvType ) ) def printClientMethodSignature( - inEnvType: String, outEnvType: String )( fp: FunctionalPrinter, @@ -211,13 +204,11 @@ class ZioFilePrinter( fp.add( clientMethodSignature( method, - inEnvType, outEnvType ) ) def printClientWithMetadataMethodSignature( - inEnvType: String, outEnvType: String )( fp: FunctionalPrinter, @@ -226,7 +217,6 @@ class ZioFilePrinter( fp.add( clientWithMetadataMethodSignature( method, - inEnvType, outEnvType ) ) @@ -245,8 +235,7 @@ class ZioFilePrinter( fp.add( methodSignature( method, - inEnvType = "Any", - outEnvType = "R1 with Context1" + outEnvType = "Context1" ) + " = " + newImpl ) } @@ -269,8 +258,7 @@ class ZioFilePrinter( fp.add( clientWithMetadataMethodSignature( method, - inEnvType = "RR", - outEnvType = "R1 with Context1" + outEnvType = "Context1" ) + " = " + newImpl ) } @@ -293,8 +281,7 @@ class ZioFilePrinter( fp.add( clientMethodSignature( method, - inEnvType = "RR", - outEnvType = "R1 with Context1" + outEnvType = "Context1" ) + " = " + newImpl ) } @@ -304,7 +291,7 @@ class ZioFilePrinter( s"implicit val transformableService: scalapb.zio_grpc.TransformableService[${ztraitName.name}] = new scalapb.zio_grpc.TransformableService[${ztraitName.name}] {" ).indented( _.add( - s"def transform[R, Context, R1, Context1](self: ${ztraitName.name}[R, Context], f: scalapb.zio_grpc.ZTransform[R with Context, $Status, R1 with Context1]): ${ztraitName.fullName}[R1, Context1] = new ${ztraitName.fullName}[R1, Context1] {" + s"def transform[Context, Context1](self: ${ztraitName.name}[Context], f: scalapb.zio_grpc.ZTransform[Context, $Status, Context1]): ${ztraitName.fullName}[Context1] = new ${ztraitName.fullName}[Context1] {" ).indented( _.print(service.getMethods().asScala.toVector)( printServerTransform @@ -317,20 +304,20 @@ class ZioFilePrinter( s"implicit val transformableService: scalapb.zio_grpc.TransformableService[ZService] = new scalapb.zio_grpc.TransformableService[ZService] {" ).indented( _.add( - s"def transform[R, Context, R1, Context1](self: ZService[R, Context], f: scalapb.zio_grpc.ZTransform[R with Context, $Status, R1 with Context1]): ZService[R1, Context1] = new ZService[R1, Context1] {" + s"def transform[Context, Context1](self: ZService[Context], f: scalapb.zio_grpc.ZTransform[Context, $Status, Context1]): ZService[Context1] = new ZService[Context1] {" ).indented( _.print(service.getMethods().asScala.toVector)( printClientTransform ) .add( "// Returns a client that gives access to headers and trailers", - s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[R1, Context1] = self.withMetadata.transform[R1, Context1](f)" + s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[Context1] = self.withMetadata.transform[Context1](f)" ) .add( "// Returns a copy of the service with new default metadata", - s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.mapCallOptionsZIO(cf), f)", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withMetadataZIO(headersEffect), f)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withCallOptionsZIO(callOptions), f)" + s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.mapCallOptionsZIO(cf), f)", + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context1] = transform[Context, Context1](self.withMetadataZIO(headersEffect), f)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.withCallOptionsZIO(callOptions), f)" ) ).add("}") ).add("}") @@ -340,55 +327,51 @@ class ZioFilePrinter( s"implicit val transformableService: scalapb.zio_grpc.TransformableService[ZService] = new scalapb.zio_grpc.TransformableService[ZService] {" ).indented( _.add( - s"def transform[R, Context, R1, Context1](self: ZService[R, Context], f: scalapb.zio_grpc.ZTransform[R with Context, $Status, R1 with Context1]): ZService[R1, Context1] = new ZService[R1, Context1] {" + s"def transform[Context, Context1](self: ZService[Context], f: scalapb.zio_grpc.ZTransform[Context, $Status, Context1]): ZService[Context1] = new ZService[Context1] {" ).indented( _.print(service.getMethods().asScala.toVector)( printClientWithMetadataTransform ) .add( "// Returns a copy of the service with new default metadata", - s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.mapCallOptionsZIO(cf), f)", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withMetadataZIO(headersEffect), f)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R1, Context1] = transform[R, Context, R1, Context1](self.withCallOptionsZIO(callOptions), f)" + s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.mapCallOptionsZIO(cf), f)", + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context1] = transform[Context, Context1](self.withMetadataZIO(headersEffect), f)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.withCallOptionsZIO(callOptions), f)" ) ).add("}") ).add("}") def print(fp: FunctionalPrinter): FunctionalPrinter = fp.add( - s"trait ${ztraitName.name}[-R, -Context] extends scalapb.zio_grpc.ZGeneratedService[R, Context, ${ztraitName.name}] {" + s"trait ${ztraitName.name}[-Context] extends scalapb.zio_grpc.ZGeneratedService[Context, ${ztraitName.name}] {" ).indented( _.add("self =>") .print(service.getMethods().asScala.toVector)( printMethodSignature( - inEnvType = "Any", - outEnvType = "R with Context" + outEnvType = "Context" ) ) ).add("}") .add( - s"type ${traitName.name} = ${ztraitName.name}[Any, Any]", - s"type R${traitName.name}[R] = ${ztraitName.name}[R, Any]", - s"type RC${traitName.name}[R] = ${ztraitName.name}[R, $RequestContext]" + s"type ${traitName.name} = ${ztraitName.name}[Any]", + s"type RC${traitName.name} = ${ztraitName.name}[$RequestContext]" ) .add("") .add(s"object ${ztraitName.name} {") .indented( _.call(serverTranformableService) .add( - s"implicit def ops[R, C](service: ${ztraitName.fullName}[R, C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[${ztraitName.fullName}, R, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[${ztraitName.fullName}, R, C](service)", + s"implicit def ops[C](service: ${ztraitName.fullName}[C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[${ztraitName.fullName}, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[${ztraitName.fullName}, C](service)", s"implicit val genericBindable: scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}] = new scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}] {" ) .indented( _.add( - s"""def bind[R](serviceImpl: ${ztraitName.fullName}[R, $RequestContext]): zio.URIO[R, $serverServiceDef] =""" + s"""def bind(serviceImpl: ${ztraitName.fullName}[$RequestContext]): zio.UIO[$serverServiceDef] =""" ).indent - .add("zio.ZIO.runtime[Any].flatMap {") + .add("zio.ZIO.runtime[Any].map {") .indent .add("runtime =>") .indent - .add("zio.ZIO.environmentWith[R] { (env: zio.ZEnvironment[R]) => ") - .indent .add( s"""$serverServiceDef.builder(${service.grpcDescriptor.fullName})""" ) @@ -397,8 +380,6 @@ class ZioFilePrinter( ) .add(".build()") .outdent - .add("}") - .outdent .outdent .add("}") .outdent @@ -434,55 +415,54 @@ class ZioFilePrinter( ) .indent .add( - s"trait ZService[R, Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[R, Context]] {" + s"trait ZService[Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[Context]] {" ) .indented( _.print(service.getMethods().asScala.toVector)( printClientWithMetadataMethodSignature( - inEnvType = "R0", - outEnvType = "R with Context" + outEnvType = "Context" ) ) .add("") .add( "// Returns a copy of the service with new default metadata", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context]", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context]" + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context]", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context]" ) ) .add("}") - .add(s"type Service = ZService[Any, Any]") + .add(s"type Service = ZService[Any]") .add(s"type Accessors[Context] = ${accessorsClassName.fullName}[Context]") .call(clientWithMetadataTranformableService) .add( - s"implicit def ops[R, C](service: ZService[R, C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, R, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, R, C](service)" + s"implicit def ops[C](service: ZService[C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C](service)" ) .add("") .add("") .add( - s"private[this] class ServiceStub[R, Context](channel: $ZChannel[R], options: zio.IO[$Status, $CallOptions], headers: zio.ZIO[Context, $Status, $SafeMetadata])" + s"private[this] class ServiceStub[Context](channel: $ZChannel, options: zio.IO[$Status, $CallOptions], headers: zio.ZIO[Context, $Status, $SafeMetadata])" ) - .add(s" extends ${clientWithMetadataServiceName.name}.ZService[R, Context] {") + .add(s" extends ${clientWithMetadataServiceName.name}.ZService[Context] {") .indented( _.print(service.getMethods().asScala.toVector)( - printClientWithMetadataImpl(envType = "R with Context") + printClientWithMetadataImpl(envType = "Context") ) .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, options.flatMap(f), headers)", - s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context] = new ServiceStub(channel, options, headersEffect)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(channel, callOptions, headers)" + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(channel, options.flatMap(f), headers)", + s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context] = new ServiceStub(channel, options, headersEffect)", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(channel, callOptions, headers)" ) ) .add("}") .add("") .add( - s"def scoped[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithMetadataServiceName.name}.ZService[R, Context]] = managedChannel.map {" + s"def scoped[Context](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithMetadataServiceName.name}.ZService[Context]] = managedChannel.map {" ) - .add(" channel => new ServiceStub[R, Context](channel, options, headers)") + .add(" channel => new ServiceStub[Context](channel, options, headers)") .add("}") .add("") .add( - s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientWithMetadataServiceName.name}.ZService[Any, Context]] = zio.ZLayer.scoped[R](zio.ZIO.environmentWithZIO((r: zio.ZEnvironment[R]) => scoped[Any, Context](managedChannel.map(_.provideEnvironment(r)), options, headers)))" + s"def live[Context: zio.Tag](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientWithMetadataServiceName.name}.ZService[Context]] = zio.ZLayer.scoped[Any](scoped[Context](managedChannel, options, headers))" ) .outdent .add("}") @@ -511,61 +491,60 @@ class ZioFilePrinter( ) .indent .add( - s"trait ZService[R, Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[R, Context]] {" + s"trait ZService[Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[Context]] {" ) .indented( _.print(service.getMethods().asScala.toVector)( printClientMethodSignature( - inEnvType = "R0", - outEnvType = "R with Context" + outEnvType = "Context" ) ) .add("") .add( "// Returns a client that gives access to headers and trailers", - s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[R, Context]" + s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[Context]" ) .add( "// Returns a copy of the service with new default metadata", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context]", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context]" + s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context]", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context]" ) ) .add("}") - .add(s"type Service = ZService[Any, Any]") + .add(s"type Service = ZService[Any]") .add(s"type Accessors[Context] = ${accessorsClassName.fullName}[Context]") .call(clientTranformableService) .add( - s"implicit def ops[R, C](service: ZService[R, C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, R, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, R, C](service)" + s"implicit def ops[C](service: ZService[C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C](service)" ) .add("") .add("") .add( - s"private[this] class ServiceStub[R, Context](underlying: ${clientWithMetadataServiceName.name}.ZService[R, Context])" + s"private[this] class ServiceStub[Context](underlying: ${clientWithMetadataServiceName.name}.ZService[Context])" ) - .add(s" extends ${clientServiceName.name}.ZService[R, Context] {") + .add(s" extends ${clientServiceName.name}.ZService[Context] {") .indented( _.print(service.getMethods().asScala.toVector)( - printClientImpl(envType = "R with Context") + printClientImpl(envType = "Context") ) .add( "// Returns a client that gives access to headers and trailers", - s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[R, Context] = underlying" + s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[Context] = underlying" ) .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(underlying.mapCallOptionsZIO(f))", - s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[R, Context] = new ServiceStub(underlying.withMetadataZIO(headersEffect))", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[R, Context] = new ServiceStub(underlying.withCallOptionsZIO(callOptions))" + s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(underlying.mapCallOptionsZIO(f))", + s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context] = new ServiceStub(underlying.withMetadataZIO(headersEffect))", + s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(underlying.withCallOptionsZIO(callOptions))" ) ) .add("}") .add("") .add( - s"def scoped[R, Context](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[R, Context]] = ${clientWithMetadataServiceName.name}.scoped(managedChannel, options, headers).map(client => new ServiceStub(client))" + s"def scoped[Context](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[Context]] = ${clientWithMetadataServiceName.name}.scoped(managedChannel, options, headers).map(client => new ServiceStub(client))" ) .add("") .add( - s"def live[R, Context: zio.Tag](managedChannel: $ZManagedChannel[R], options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[R, Throwable, ${clientServiceName.name}.ZService[Any, Context]] = ${clientWithMetadataServiceName.name}.live(managedChannel, options, headers).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))" + s"def live[Context: zio.Tag](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientServiceName.name}.ZService[Context]] = ${clientWithMetadataServiceName.name}.live(managedChannel, options, headers).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))" ) .outdent .add("}") @@ -577,20 +556,18 @@ class ZioFilePrinter( val sigWithoutContext = clientMethodSignature( method, - inEnvType = "R0", - outEnvType = s"${clientServiceName.name}.ZService[Any, Context] with Context", - implicitViews = ": zio.Tag" + outEnvType = s"${clientServiceName.name}.ZService[Context] with Context" ) + " = " val innerCall = s"_.withCallOptionsZIO(callOptions).${method.name}(request)" val clientCall = method.streamType match { case StreamType.Unary => - s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Context]]($innerCall)" case StreamType.ClientStreaming => - s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Context]]($innerCall)" case StreamType.ServerStreaming => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Context]]($innerCall)" case StreamType.Bidirectional => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Context]]($innerCall)" } fp.add(sigWithoutContext + clientCall) } @@ -602,19 +579,18 @@ class ZioFilePrinter( val sigWithoutContext = clientWithMetadataMethodSignature( method, - inEnvType = "R0", - outEnvType = s"${clientWithMetadataServiceName.name}.ZService[Any, Context] with Context" + outEnvType = s"${clientWithMetadataServiceName.name}.ZService[Context] with Context" ) + " = " val innerCall = s"_.withCallOptionsZIO(callOptions).${method.name}(request)" val clientCall = method.streamType match { case StreamType.Unary => - s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" case StreamType.ClientStreaming => - s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" case StreamType.ServerStreaming => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" case StreamType.Bidirectional => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Any, Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" } fp.add(sigWithoutContext + clientCall) } @@ -639,7 +615,6 @@ class ZioFilePrinter( fp.add( clientWithMetadataMethodSignature( method, - inEnvType = "R0", outEnvType = envType ) + s" = $prefix { case (headers, options) => $clientCall(" ).indent @@ -665,7 +640,6 @@ class ZioFilePrinter( fp.add( clientMethodSignature( method, - inEnvType = "R0", outEnvType = envType ) + s" = underlying.${method.name}(request)$suffix" ) @@ -690,7 +664,7 @@ class ZioFilePrinter( s"${method.grpcDescriptor.fullName}," ) .add( - s"$CH.$serverCall(runtime, (t: ${methodInType(method, inEnvType = "Any")})=>serviceImpl.${method.name}(t).provideSomeEnvironment((rc: zio.ZEnvironment[$RequestContext]) => env.union[$RequestContext](rc)))" + s"$CH.$serverCall(runtime, (t: ${methodInType(method)})=>serviceImpl.${method.name}(t))" ) .outdent .add(")") diff --git a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala index bc925ac9d..e7782c77b 100644 --- a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala @@ -2,61 +2,42 @@ package scalapb.zio_grpc import io.grpc.Status -import zio.ZLayer -import zio.ZEnvironment -import zio.Tag -import zio.ZIO - -trait TransformableService[S[_, _]] { - def transform[RIn, ContextIn, ROut, ContextOut]( - instance: S[RIn, ContextIn], - transform: ZTransform[RIn with ContextIn, Status, ROut with ContextOut] - ): S[ROut, ContextOut] - - def provideEnvironment[R, Context: Tag](s: S[R, Context], r: ZEnvironment[R]): S[Any, Context] = - transform(s, ZTransform.provideEnvironment[R, Status, Context](r)) - - def transformContextZIO[R, FromContext: Tag, R0 <: R, ToContext: Tag]( - s: S[R, FromContext], - f: ToContext => ZIO[R0, Status, FromContext] - ): S[R0, ToContext] = - transform[R, FromContext, R0, ToContext](s, ZTransform.transformContext[R, Status, FromContext, R0, ToContext](f)) - - def transformContext[R, FromContext: Tag, ToContext: Tag]( - s: S[R, FromContext], +import zio.{IO, Tag, ZIO, ZLayer} +import zio.ULayer + +trait TransformableService[S[_]] { + def transform[ContextIn, ContextOut]( + instance: S[ContextIn], + transform: ZTransform[ContextIn, Status, ContextOut] + ): S[ContextOut] + + def transformContextZIO[FromContext: Tag, ToContext: Tag]( + s: S[FromContext], + f: ToContext => IO[Status, FromContext] + ): S[ToContext] = + transform[FromContext, ToContext](s, ZTransform.transformContext[FromContext, Status, ToContext](f)) + + def transformContext[FromContext: Tag, ToContext: Tag]( + s: S[FromContext], f: ToContext => FromContext - ): S[R, ToContext] = - transformContextZIO[R, FromContext, R, ToContext](s, (hc2: ToContext) => ZIO.succeed(f(hc2))) - - def toLayer[R, C: Tag]( - s: S[R, C] - )(implicit tagged: Tag[S[Any, C]]): ZLayer[R, Nothing, S[Any, C]] = - ZLayer(ZIO.environmentWith((r: ZEnvironment[R]) => provideEnvironment(s, r))) + ): S[ToContext] = + transformContextZIO[FromContext, ToContext](s, (hc2: ToContext) => ZIO.succeed(f(hc2))) } object TransformableService { - def apply[S[_, _]](implicit ts: TransformableService[S]) = ts - - final class TransformableServiceOps[S[_, _], R, C](private val service: S[R, C]) extends AnyVal { - def transform[ROut, ContextOut]( - transform: ZTransform[R with C, Status, ROut with ContextOut] - )(implicit TS: TransformableService[S]): S[ROut, ContextOut] = - TS.transform[R, C, ROut, ContextOut](service, transform) - - def transformContextZIO[C2: Tag, R0 <: R]( - f: C2 => ZIO[R0, Status, C] - )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[R0, C2] = - TS.transformContextZIO[R, C, R0, C2](service, f) - - def provideEnvironment( - r: ZEnvironment[R] - )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[Any, C] = - TS.provideEnvironment[R, C](service, r) - - def toLayer(implicit - TS: TransformableService[S], - sTagged: Tag[S[Any, C]], - cTagged: Tag[C] - ): ZLayer[R, Nothing, S[Any, C]] = TS.toLayer[R, C](service) + def apply[S[_]](implicit ts: TransformableService[S]) = ts + + final class TransformableServiceOps[S[_], C](private val service: S[C]) extends AnyVal { + def transform[ContextOut]( + transform: ZTransform[C, Status, ContextOut] + )(implicit TS: TransformableService[S]): S[ContextOut] = + TS.transform[C, ContextOut](service, transform) + + def transformContextZIO[C2: Tag]( + f: C2 => IO[Status, C] + )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[C2] = + TS.transformContextZIO[C, C2](service, f) + + def toLayer(implicit tag: Tag[S[C]]): ULayer[S[C]] = ZLayer.succeed(service) } } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala index d084de596..a582c6400 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala @@ -1,48 +1,45 @@ package scalapb.zio_grpc import io.grpc.ServerServiceDefinition -import zio.URIO +import zio.UIO import zio.Tag -import _root_.scala.annotation.implicitNotFound +import scala.annotation.implicitNotFound /** Provides a way to bind a ZIO gRPC service implementations to a server. */ -@implicitNotFound("""Could not find an implicit ZBindableService[${R}, ${S}]. +@implicitNotFound("""Could not find an implicit ZBindableService[${S}]. -Typically, ${S} should extend ZGeneratedService[R, C] for some types R and C where R represents -the dependencies of the service, and C represents the context provided for each request. +Typically, ${S} should extend ZGeneratedService[C] for some type C which +represents the context provided for each request. -When a ZBindableService could not be found, it means that either: - -1. The provided environment ($R) is missing a dependency of ${S}. - -2. The context type is not Any, SafeMetadata, or RequestContext, or some other type T which -has an implicit instance of CanBind[T] available. +When a ZBindableService could not be found, it is most likely that the context type + is not Any, SafeMetadata, or RequestContext, or some other type T which has an implicit + instance of CanBind[T] available. """) -trait ZBindableService[-R, S] { +trait ZBindableService[S] { /** Effectfully returns a [[io.grpc.ServerServiceDefinition]] for the given service instance */ - def bindService(serviceImpl: S): URIO[R, ServerServiceDefinition] + def bindService(serviceImpl: S): UIO[ServerServiceDefinition] } object ZBindableService { - def apply[R, S](implicit ev: ZBindableService[R, S]) = ev + def apply[S](implicit ev: ZBindableService[S]) = ev - def serviceDefinition[R, S]( + def serviceDefinition[S]( serviceImpl: S - )(implicit bs: ZBindableService[R, S]): URIO[R, ServerServiceDefinition] = + )(implicit bs: ZBindableService[S]): UIO[ServerServiceDefinition] = bs.bindService(serviceImpl) - implicit def fromZGeneratedService1[R, C, S[-_, -_], T](implicit - ev1: T <:< ZGeneratedService[R, C, S], - ev2: T <:< S[R, C], + implicit def fromZGeneratedService1[C, S[-_], T](implicit + ev1: T <:< ZGeneratedService[C, S], + ev2: T <:< S[C], ev3: GenericBindable[S], ev4: CanBind[C], ev5: TransformableService[S], ev6: Tag[C] - ): ZBindableService[R, T] = - new ZBindableService[R, T] { - def bindService(s: T): zio.URIO[R, ServerServiceDefinition] = + ): ZBindableService[T] = + new ZBindableService[T] { + def bindService(s: T): zio.UIO[ServerServiceDefinition] = ev3.bind(ev5.transformContext(s, ev4.bind(_))) } } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala index dc9570512..743b49da1 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala @@ -2,62 +2,51 @@ package scalapb.zio_grpc import io.grpc.MethodDescriptor import io.grpc.CallOptions -import zio.ZIO +import zio.IO import io.grpc.Status import scalapb.zio_grpc.client.ZClientCall -import zio.ZEnvironment -abstract class ZClientInterceptor[R] { +abstract class ZClientInterceptor { self => def interceptCall[Req, Res]( methodDescriptor: MethodDescriptor[Req, Res], call: CallOptions, - clientCall: ZClientCall[R, Req, Res] - ): ZClientCall[R, Req, Res] - - def provideEnvironment(r: => ZEnvironment[R]): ZClientInterceptor[Any] = - new ZClientInterceptor[Any] { - def interceptCall[Req, Res]( - methodDescriptor: MethodDescriptor[Req, Res], - call: CallOptions, - clientCall: ZClientCall[Any, Req, Res] - ): ZClientCall[Any, Req, Res] = - self.interceptCall(methodDescriptor, call, clientCall).provideEnvironment(r) - } + clientCall: ZClientCall[Req, Res] + ): ZClientCall[Req, Res] } object ZClientInterceptor { - def headersReplacer[R]( + def headersReplacer( effect: ( MethodDescriptor[_, _], CallOptions - ) => ZIO[R, Status, SafeMetadata] - ): ZClientInterceptor[R] = - new ZClientInterceptor[R] { + ) => IO[Status, SafeMetadata] + ): ZClientInterceptor = + new ZClientInterceptor { def interceptCall[Req, Res]( methodDescriptor: MethodDescriptor[Req, Res], call: CallOptions, - clientCall: ZClientCall[R, Req, Res] - ): ZClientCall[R, Req, Res] = + clientCall: ZClientCall[Req, Res] + ): ZClientCall[Req, Res] = ZClientCall.headersTransformer( clientCall, _ => effect(methodDescriptor, call) ) } - def headersUpdater[R]( + def headersUpdater( effect: ( MethodDescriptor[_, _], CallOptions, SafeMetadata - ) => ZIO[R, Status, Unit] - ): ZClientInterceptor[R] = - new ZClientInterceptor[R] { + ) => IO[Status, Unit] + ): ZClientInterceptor = + new ZClientInterceptor { def interceptCall[Req, Res]( methodDescriptor: MethodDescriptor[Req, Res], call: CallOptions, - clientCall: ZClientCall[R, Req, Res] - ): ZClientCall[R, Req, Res] = + clientCall: ZClientCall[Req, Res] + ): ZClientCall[Req, Res] = ZClientCall.headersTransformer( clientCall, md => effect(methodDescriptor, call, md).as(md) diff --git a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala index 07a34b2f5..a16e108d8 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala @@ -1,12 +1,12 @@ package scalapb.zio_grpc -import zio.URIO +import zio.UIO import io.grpc.ServerServiceDefinition -trait ZGeneratedService[-R, -C, S[-_, -_]] { - this: S[R, C] => +trait ZGeneratedService[-C, S[-_]] { + this: S[C] => } -trait GenericBindable[S[_, _]] { - def bind[R](s: S[R, RequestContext]): URIO[R, ServerServiceDefinition] +trait GenericBindable[S[_]] { + def bind(s: S[RequestContext]): UIO[ServerServiceDefinition] } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala index 8887e3693..032858c88 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import zio.{EnvironmentTag, Tag, ZEnvironment, ZIO} +import zio.{IO, Tag, ZEnvironment, ZIO} import zio.stream.ZStream /** Describes a transformation of an effect or a stream. @@ -9,62 +9,49 @@ import zio.stream.ZStream * "decorated" service. This can be used for pre- or post-processing of requests/responses and also for environment and * context transformations. */ -trait ZTransform[+RIn, E, -ROut] { self => - def effect[A](io: ZIO[RIn, E, A]): ZIO[ROut, E, A] - def stream[A](io: ZStream[RIn, E, A]): ZStream[ROut, E, A] +trait ZTransform[+ContextIn, E, -ContextOut] { self => + def effect[A](io: ZIO[ContextIn, E, A]): ZIO[ContextOut, E, A] + def stream[A](io: ZStream[ContextIn, E, A]): ZStream[ContextOut, E, A] /** Combine two ZTransforms */ - def andThen[RIn2 <: ROut, ROut2]( - zt: ZTransform[RIn2, E, ROut2] - ): ZTransform[RIn, E, ROut2] = - new ZTransform[RIn, E, ROut2] { - override def effect[A](io: ZIO[RIn, E, A]): ZIO[ROut2, E, A] = + def andThen[ContextIn2 <: ContextOut, ContextOut2]( + zt: ZTransform[ContextIn2, E, ContextOut2] + ): ZTransform[ContextIn, E, ContextOut2] = + new ZTransform[ContextIn, E, ContextOut2] { + override def effect[A](io: ZIO[ContextIn, E, A]): ZIO[ContextOut2, E, A] = zt.effect(self.effect(io)) - override def stream[A](io: ZStream[RIn, E, A]): ZStream[ROut2, E, A] = + override def stream[A](io: ZStream[ContextIn, E, A]): ZStream[ContextOut2, E, A] = zt.stream(self.stream(io)) } } object ZTransform { - /** Returns a ZTransform that can provide some of the environment of a service */ - def provideSomeEnvironment[RIn, E, ROut](f: ZEnvironment[ROut] => ZEnvironment[RIn]): ZTransform[RIn, E, ROut] = - new ZTransform[RIn, E, ROut] { - def effect[A](io: ZIO[RIn, E, A]): ZIO[ROut, E, A] = io.provideSomeEnvironment(f) - def stream[A](io: ZStream[RIn, E, A]): ZStream[ROut, E, A] = io.provideSomeEnvironment(f) - } - - /** Provides the entire environment of a service (leaving only the context) */ - def provideEnvironment[R, E, Context: EnvironmentTag]( - env: => ZEnvironment[R] - ): ZTransform[R with Context, E, Context] = - provideSomeEnvironment((ctx: ZEnvironment[Context]) => env.union[Context](ctx)) - /** Changes the Context type of the service from Context1 to Context2, by applying an effectful function on the - * environment + * environment before the request is further processed. */ - def transformContext[RIn, E, ContextIn: Tag, ROut <: RIn, ContextOut: Tag]( - f: ContextOut => ZIO[ROut, E, ContextIn] - ): ZTransform[RIn with ContextIn, E, ROut with ContextOut] = - new ZTransform[RIn with ContextIn, E, ROut with ContextOut] { - def effect[A](io: ZIO[RIn with ContextIn, E, A]): ZIO[ROut with ContextOut, E, A] = + def transformContext[ContextIn: Tag, E, ContextOut: Tag]( + f: ContextOut => IO[E, ContextIn] + ): ZTransform[ContextIn, E, ContextOut] = + new ZTransform[ContextIn, E, ContextOut] { + def effect[A](io: ZIO[ContextIn, E, A]): ZIO[ContextOut, E, A] = ZIO - .environmentWithZIO { (env: ZEnvironment[ROut with ContextOut]) => - f(env.get[ContextOut]).map(cin => env.add[ContextIn](cin)) + .environmentWithZIO { (env: ZEnvironment[ContextOut]) => + f(env.get[ContextOut]) } .flatMap { env => - io.provideEnvironment(env) + io.provideEnvironment(ZEnvironment(env)) } - def stream[A](io: ZStream[RIn with ContextIn, E, A]): ZStream[ROut with ContextOut, E, A] = + def stream[A](io: ZStream[ContextIn, E, A]): ZStream[ContextOut, E, A] = ZStream - .fromZIO(ZIO.environmentWithZIO { (env: ZEnvironment[ROut with ContextOut]) => - f(env.get[ContextOut]).map(cin => env.add[ContextIn](cin)) + .fromZIO(ZIO.environmentWithZIO { (env: ZEnvironment[ContextOut]) => + f(env.get[ContextOut]) }) .flatMap { env => - io.provideEnvironment(env) + io.provideEnvironment(ZEnvironment(env)) } } } diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index b3d399a0a..2ce44eac6 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -9,9 +9,7 @@ package object zio_grpc { type GStream[A] = Stream[Status, A] - type Server = Server.Service - - type ZManagedChannel[R] = ZIO[Scope, Throwable, ZChannel[R]] + type ZManagedChannel = ZIO[Scope, Throwable, ZChannel] @deprecated("Use ScopedServer instead of ManagedServer", "0.6.0") val ManagedServer = scalapb.zio_grpc.ScopedServer diff --git a/core/src/main/scalajs/scalapb/zio_grpc/Server.scala b/core/src/main/scalajs/scalapb/zio_grpc/Server.scala index 0e1f94f8e..eb0676db4 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/Server.scala @@ -1,5 +1,5 @@ package scalapb.zio_grpc -object Server { - trait Service -} +trait Server + +object Server diff --git a/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala b/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala index 5bec5ad2d..b75922bd2 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/ZChannel.scala @@ -3,14 +3,10 @@ package scalapb.zio_grpc import zio.ZIO import io.grpc.ManagedChannel import zio.Task -import zio.ZEnvironment -class ZChannel[-R]( +class ZChannel( private[zio_grpc] val channel: ManagedChannel, - interceptors: Seq[ZClientInterceptor[R]] + interceptors: Seq[ZClientInterceptor] ) { def shutdown(): Task[Unit] = ZIO.unit - - def provideEnvironment(r: ZEnvironment[R]): ZChannel[Any] = - new ZChannel[Any](channel, interceptors.map(_.provideEnvironment(r))) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala b/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala index 1b1510dc4..8de6e0b0c 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/ZManagedChannel.scala @@ -4,11 +4,11 @@ import io.grpc.ManagedChannel import zio.ZIO object ZManagedChannel { - def apply[R]( + def apply( channel: ManagedChannel, - interceptors: Seq[ZClientInterceptor[R]] = Nil - ): ZManagedChannel[R] = - ZIO.succeed(new ZChannel[R](channel, interceptors)) + interceptors: Seq[ZClientInterceptor] + ): ZManagedChannel = + ZIO.succeed(new ZChannel(channel, interceptors)) - def apply(channel: ManagedChannel): ZManagedChannel[Any] = apply(channel, Nil) + def apply(channel: ManagedChannel): ZManagedChannel = apply(channel, Nil) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index 7cdf64bd8..584684f86 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -1,6 +1,8 @@ package scalapb.zio_grpc.client -import zio.{Chunk, ZIO} +import zio.{Chunk, IO, ZIO} +import scalapb.zio_grpc.ResponseContext +import scalapb.zio_grpc.ResponseFrame import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.ZChannel import io.grpc.MethodDescriptor @@ -11,13 +13,51 @@ import zio.stream.ZStream import scalapb.grpcweb.native.StatusInfo object ClientCalls { - def unaryCall[R, Req, Res]( - channel: ZChannel[R], + object withMetadata { + def unaryCall[Req, Res]( + channel: ZChannel, + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: Req + ): IO[Status, ResponseContext[Res]] = + ZIO.fail(Status.INTERNAL.withDescription("Not supported")) + + def serverStreamingCall[Req, Res]( + channel: ZChannel, + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: Req + ): ZStream[Any, Status, ResponseFrame[Res]] = + ZStream.fail(Status.INTERNAL.withDescription("Not supported")) + + def clientStreamingCall[Req, Res]( + channel: ZChannel, + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: ZStream[Any, Status, Req] + ): IO[Status, ResponseContext[Res]] = + ZIO.fail(Status.INTERNAL.withDescription("Not supported")) + + def bidiCall[Req, Res]( + channel: ZChannel, + method: MethodDescriptor[Req, Res], + options: CallOptions, + headers: SafeMetadata, + req: ZStream[Any, Status, Req] + ): ZStream[Any, Status, ResponseFrame[Res]] = + ZStream.fail(Status.INTERNAL.withDescription("Not supported")) + } + + def unaryCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, req: Req - ): ZIO[R, Status, Res] = + ): IO[Status, Res] = ZIO.async { callback => channel.channel.client.rpcCall[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -31,14 +71,14 @@ object ClientCalls { ) } - def serverStreamingCall[R, Req, Res]( - channel: ZChannel[R], + def serverStreamingCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[R, Status, Res] = - ZStream.async[R, Status, Res] { cb => + ): ZStream[Any, Status, Res] = + ZStream.async[Any, Status, Res] { cb => channel.channel.client .serverStreaming[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -72,21 +112,21 @@ object ClientCalls { ) } - def clientStreamingCall[R, R0, Req, Res]( - channel: ZChannel[R], + def clientStreamingCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZIO[R with R0, Status, Res] = + req: ZStream[Any, Status, Req] + ): ZIO[Any, Status, Res] = ZIO.fail(Status.INTERNAL.withDescription("Not supported")) - def bidiCall[R, R0, Req, Res]( - channel: ZChannel[R], + def bidiCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZStream[R with R0, Status, Res] = + req: ZStream[Any, Status, Req] + ): ZStream[Any, Status, Res] = ZStream.fail(Status.INTERNAL.withDescription("Not supported")) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala index 88a91d652..4ad3a958b 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala @@ -1,19 +1,16 @@ package scalapb.zio_grpc.client -import zio.ZIO +import zio.IO import io.grpc.Status import scalapb.zio_grpc.SafeMetadata -import zio.ZEnvironment -trait ZClientCall[-R, Req, Res] extends Any { - def provideEnvironment(r: => ZEnvironment[R]): ZClientCall[Any, Req, Res] = ??? -} +trait ZClientCall[Req, Res] extends Any object ZClientCall { - def apply[R, Req, Res](s: String): ZClientCall[R, Req, Res] = ??? + def apply[Req, Res](s: String): ZClientCall[Req, Res] = ??? - def headersTransformer[R, Req, Res]( - clientCall: ZClientCall[R, Req, Res], - fetchHeaders: SafeMetadata => ZIO[R, Status, SafeMetadata] + def headersTransformer[Req, Res]( + clientCall: ZClientCall[Req, Res], + fetchHeaders: SafeMetadata => IO[Status, SafeMetadata] ) = ??? } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index cdbfc9731..ef06d3f2b 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -5,120 +5,118 @@ import io.grpc.ServerBuilder import io.grpc.ServerServiceDefinition import java.util.concurrent.TimeUnit -object Server { - trait Service { - def awaitTermination: Task[Unit] +trait Server { + def awaitTermination: Task[Unit] + + def awaitTermination(duratio: Duration): Task[Boolean] - def awaitTermination(duratio: Duration): Task[Boolean] + def port: Task[Int] - def port: Task[Int] + def shutdown: Task[Unit] - def shutdown: Task[Unit] + def shutdownNow: Task[Unit] - def shutdownNow: Task[Unit] + def start: Task[Unit] +} - def start: Task[Unit] - } +private[zio_grpc] class ServerImpl(underlying: io.grpc.Server) extends Server { + val awaitTermination: Task[Unit] = ZIO.attempt(underlying.awaitTermination()) - private[zio_grpc] class ServiceImpl(underlying: io.grpc.Server) extends Service { - val awaitTermination: Task[Unit] = ZIO.attempt(underlying.awaitTermination()) + def awaitTermination(duration: Duration): Task[Boolean] = + ZIO.attempt(underlying.awaitTermination(duration.toMillis(), TimeUnit.MILLISECONDS)) - def awaitTermination(duration: Duration): Task[Boolean] = - ZIO.attempt(underlying.awaitTermination(duration.toMillis(), TimeUnit.MILLISECONDS)) + def port: Task[Int] = ZIO.attempt(underlying.getPort()) - def port: Task[Int] = ZIO.attempt(underlying.getPort()) + def shutdown: Task[Unit] = ZIO.attempt(underlying.shutdown()).unit - def shutdown: Task[Unit] = ZIO.attempt(underlying.shutdown()).unit + def start: Task[Unit] = ZIO.attempt(underlying.start()).unit - def start: Task[Unit] = ZIO.attempt(underlying.start()).unit + def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit - def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit + def toManaged: ZIO[Scope, Throwable, Server] = + start.as(this).withFinalizer(_ => this.shutdown.ignore) +} - def toManaged: ZIO[Scope, Throwable, Service] = - start.as(this).withFinalizer(_ => this.shutdown.ignore) - } - def fromManaged(zm: ZIO[Scope, Throwable, Service]) = - ZLayer.scoped(zm) +object Server { + def fromScoped(zm: ZIO[Scope, Throwable, Server]): ZLayer[Any, Throwable, Server] = + ZLayer.scoped[Any](zm) } object ServerLayer { - def fromServiceList[R](builder: => ServerBuilder[_], l: ServiceList[R]) = + def fromServiceList[R](builder: => ServerBuilder[_], l: ServiceList[R]): ZLayer[R, Throwable, Server] = ZLayer.scoped[R](ScopedServer.fromServiceList(builder, l)) - def access[S1: Tag]( + def access[S1: Tag: ZBindableService]( builder: => ServerBuilder[_] - )(implicit bs: ZBindableService[Any, S1]): ZLayer[Any with S1, Throwable, Server] = + ): ZLayer[S1, Throwable, Server] = fromServiceList(builder, ServiceList.access[S1]) - def accessEnv[R, S1: Tag]( - builder: => ServerBuilder[_] - )(implicit bs: ZBindableService[R, S1]): ZLayer[R with S1, Throwable, Server] = - fromServiceList(builder, ServiceList.accessEnv[R, S1]) - - def fromService[R1, S1](builder: => ServerBuilder[_], s1: S1)(implicit - bs: ZBindableService[R1, S1] - ): ZLayer[R1, Throwable, Server] = + def fromService[S1: ZBindableService](builder: => ServerBuilder[_], s1: S1): ZLayer[Any, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1)) - def fromServiceLayer[R, S1: Tag]( + def fromServiceLayer[R, S1: Tag: ZBindableService]( serverBuilder: => ServerBuilder[_] - )(l: ZLayer[R, Throwable, S1])(implicit bs: ZBindableService[R, S1]): ZLayer[R, Throwable, Server] = + )(l: ZLayer[R, Throwable, S1]): ZLayer[R, Throwable, Server] = l.flatMap(env => fromService(serverBuilder, env.get[S1])) - def fromServices[R1, S1, R2, S2](builder: => ServerBuilder[_], s1: S1, s2: S2)(implicit - bs1: ZBindableService[R1, S1], - bs2: ZBindableService[R2, S2] - ): ZLayer[R1 with R2, Throwable, Server] = + def fromServices[S1: ZBindableService, S2: ZBindableService]( + builder: => ServerBuilder[_], + s1: S1, + s2: S2 + ): ZLayer[Any, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1).add(s2)) - def fromServices[R1, S1, R2, S2, R3, S3](builder: => ServerBuilder[_], s1: S1, s2: S2, s3: S3)(implicit - bs1: ZBindableService[R1, S1], - bs2: ZBindableService[R2, S2], - bs3: ZBindableService[R3, S3] - ): ZLayer[R1 with R2 with R3, Throwable, Server] = + def fromServices[S1: ZBindableService, S2: ZBindableService, S3: ZBindableService]( + builder: => ServerBuilder[_], + s1: S1, + s2: S2, + s3: S3 + ): ZLayer[Any, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1).add(s2).add(s3)) } object ScopedServer { - def fromBuilder(builder: => ServerBuilder[_]): ZIO[Scope, Throwable, Server.Service] = + def fromBuilder(builder: => ServerBuilder[_]): ZIO[Scope, Throwable, Server] = fromServiceList(builder, ServiceList) - def fromService[R1, S1](builder: => ServerBuilder[_], s1: S1)(implicit - bs: ZBindableService[R1, S1] - ): ZIO[R1 with Scope, Throwable, Server.Service] = + def fromService[S1](builder: => ServerBuilder[_], s1: S1)(implicit + bs: ZBindableService[S1] + ): ZIO[Scope, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1)) - def fromServices[R1, S1, R2, S2](builder: => ServerBuilder[_], s1: S1, s2: S2)(implicit - bs1: ZBindableService[R1, S1], - bs2: ZBindableService[R2, S2] - ): ZIO[R1 with R2 with Scope, Throwable, Server.Service] = + def fromServices[S1: ZBindableService, S2: ZBindableService]( + builder: => ServerBuilder[_], + s1: S1, + s2: S2 + ): ZIO[Scope, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1).add(s2)) - def fromServices[R1, S1, R2, S2, R3, S3](builder: => ServerBuilder[_], s1: S1, s2: S2, s3: S3)(implicit - bs1: ZBindableService[R1, S1], - bs2: ZBindableService[R2, S2], - bs3: ZBindableService[R3, S3] - ): ZIO[R1 with R2 with R3 with Scope, Throwable, Server.Service] = + def fromServices[S1: ZBindableService, S2: ZBindableService, S3: ZBindableService]( + builder: => ServerBuilder[_], + s1: S1, + s2: S2, + s3: S3 + ): ZIO[Scope, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1).add(s2).add(s3)) def fromServiceList[R]( builder: => ServerBuilder[_], services: URIO[R, List[ServerServiceDefinition]] - ): ZIO[R with Scope, Throwable, Server.Service] = fromServiceListScoped[R](builder, services) + ): ZIO[R with Scope, Throwable, Server] = fromServiceListScoped[R](builder, services) def fromServiceList[R]( builder: => ServerBuilder[_], services: ServiceList[R] - ): ZIO[R with Scope, Throwable, Server.Service] = + ): ZIO[R with Scope, Throwable, Server] = fromServiceListScoped[R](builder, services.bindAll) def fromServiceListScoped[R]( builder: => ServerBuilder[_], services: ZIO[R with Scope, Throwable, List[ServerServiceDefinition]] - ): ZIO[R with Scope, Throwable, Server.Service] = + ): ZIO[R with Scope, Throwable, Server] = for { services0 <- services - serverImpl = new Server.ServiceImpl( + serverImpl = new ServerImpl( services0 .foldLeft(builder) { case (b, s) => b.addService(s) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala index 4f7a92cb4..d913ab952 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala @@ -20,7 +20,7 @@ trait ServerMain extends zio.ZIOAppDefault { def serverLive: ZLayer[Any, Throwable, Server] = ServerLayer.fromServiceList(builder, services) - val myAppLogic = welcome *> serverLive.build *> ZIO.never + val myAppLogic = welcome *> serverLive.launch def run = myAppLogic.exitCode } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala index 85db0a341..f9592ffca 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala @@ -8,43 +8,40 @@ import io.grpc.ServerServiceDefinition * This is just a wrapper around a list of ServerServiceDefinition. */ sealed class ServiceList[-RR] private[scalapb] ( - val bindAll: ZIO[RR with Scope, Throwable, List[ServerServiceDefinition]] + val bindAll: ZIO[RR, Throwable, List[ServerServiceDefinition]] ) { /** Adds a service to the service list */ - def add[R1 <: RR, S1](s1: S1)(implicit b: ZBindableService[R1, S1]): ServiceList[R1] = - addScoped[R1, RR, S1](ZIO.succeed(s1)) + def add[S1: ZBindableService](s1: S1): ServiceList[RR] = + addZIO[Any, S1](ZIO.succeed(s1)) /** Adds an effect that returns a service to the service list */ - def addZIO[R1 <: RR, R2 <: RR, S1]( - s1: ZIO[R2, Throwable, S1] - )(implicit b: ZBindableService[R1, S1]): ServiceList[R1 with R2] = - addScoped[R1, R2, S1](s1) - - def addScoped[R1 <: RR, R2 <: RR, S1](s1: ZIO[R2 with Scope, Throwable, S1])(implicit - bs: ZBindableService[R1, S1] - ): ServiceList[RR with R1 with R2] = - new ServiceList[RR with R1 with R2](for { - l <- bindAll - sd <- s1.flatMap(bs.bindService(_)) - } yield sd :: l) - - def addLayer[R <: RR, S1: Tag](layer: ZLayer[R, Throwable, S1])(implicit - bs: ZBindableService[R, S1] - ): ServiceList[RR with R] = - addScoped[R, R, S1](layer.build.map(_.get)) + def addZIO[R1, S1: ZBindableService]( + s1: ZIO[R1, Throwable, S1] + ): ServiceList[RR with R1] = + new ServiceList(for { + ll <- bindAll + service <- s1 + ssd <- ZBindableService[S1].bindService(service) + } yield ssd :: ll) + + def addLayer[R1, S1: Tag: ZBindableService](layer: ZLayer[R1, Throwable, S1]): ServiceList[RR with R1 with Scope] = + addZIO[R1 with Scope, S1](layer.build.map(_.get)) /** Adds a dependency on a service that will be provided later from the environment or a Layer * */ - def access[B: Tag](implicit bs: ZBindableService[Any, B]): ServiceList[B with RR] = - accessEnv[Any, B] - - def accessEnv[R, B: Tag](implicit bs: ZBindableService[R, B]): ServiceList[R with B with RR] = - new ServiceList[R with B with RR](ZIO.environmentWithZIO[R with B with RR] { r => - bindAll.flatMap(ll => bs.bindService(r.get[B]).map(_ :: ll)) - }) + def access[B: Tag: ZBindableService]: ServiceList[RR with B] = + addZIO(ZIO.environmentWith(_.get[B])) def provideEnvironment(r: => ZEnvironment[RR]): ServiceList[Any] = - new ServiceList[Any](bindAll.provideSomeEnvironment[Scope](r.union[Scope](_))) + new ServiceList[Any](bindAll.provideEnvironment(r)) + + /** Provides layers to this ServiceList which translates it to another layer */ + def provideLayer[R1](layer: ZLayer[R1, Throwable, RR]): ServiceList[R1] = + new ServiceList(bindAll.provideLayer(layer)) + + /** Provides all layers needed by this ServiceList */ + def provide(layer: ZLayer[Any, Throwable, RR]): ServiceList[Any] = + provideLayer(layer) } object ServiceList extends ServiceList(ZIO.succeed(Nil)) { diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala index e0084076a..3ba63dad5 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ZChannel.scala @@ -8,15 +8,15 @@ import io.grpc.MethodDescriptor import scalapb.zio_grpc.client.ZClientCall import zio._ -class ZChannel[-R]( +class ZChannel( private[zio_grpc] val channel: ManagedChannel, - interceptors: Seq[ZClientInterceptor[R]] + interceptors: Seq[ZClientInterceptor] ) { def newCall[Req, Res]( methodDescriptor: MethodDescriptor[Req, Res], options: CallOptions - ): UIO[ZClientCall[R, Req, Res]] = ZIO.succeed( - interceptors.foldLeft[ZClientCall[R, Req, Res]]( + ): UIO[ZClientCall[Req, Res]] = ZIO.succeed( + interceptors.foldLeft[ZClientCall[Req, Res]]( ZClientCall(channel.newCall(methodDescriptor, options)) )((call, interceptor) => interceptor.interceptCall(methodDescriptor, options, call)) ) @@ -25,9 +25,6 @@ class ZChannel[-R]( ZIO.attempt(channel.awaitTermination(duration.toMillis(), TimeUnit.MILLISECONDS)) def shutdown(): Task[Unit] = ZIO.attempt(channel.shutdown()).unit - - def provideEnvironment(r: ZEnvironment[R]): ZChannel[Any] = - new ZChannel[Any](channel, interceptors.map(_.provideEnvironment(r))) } object ZChannel { @@ -42,13 +39,13 @@ object ZChannel { * The maximum amount of time to wait for the channel to shutdown. * @return */ - def scoped[R]( + def scoped( builder: => ManagedChannelBuilder[_], - interceptors: Seq[ZClientInterceptor[R]], + interceptors: Seq[ZClientInterceptor], timeout: Duration - ): RIO[Scope, ZChannel[R]] = + ): RIO[Scope, ZChannel] = ZIO .acquireRelease( - ZIO.attempt(new ZChannel[R](builder.build(), interceptors)) + ZIO.attempt(new ZChannel(builder.build(), interceptors)) )(channel => channel.shutdown().ignore *> channel.awaitTermination(timeout).ignore) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala index dc1282875..2d4b42e0c 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ZManagedChannel.scala @@ -4,16 +4,13 @@ import io.grpc.ManagedChannelBuilder import zio.ZIO object ZManagedChannel { - def apply[R]( + def apply( builder: => ManagedChannelBuilder[_], - interceptors: Seq[ZClientInterceptor[R]] = Nil - ): ZManagedChannel[R] = + interceptors: Seq[ZClientInterceptor] + ): ZManagedChannel = ZIO.acquireRelease(ZIO.attempt(new ZChannel(builder.build(), interceptors)))( _.shutdown().ignore ) - def apply(builder: ManagedChannelBuilder[_]): ZManagedChannel[Any] = - ZIO.acquireRelease(ZIO.attempt(new ZChannel(builder.build(), Nil)))( - _.shutdown().ignore - ) + def apply(builder: ManagedChannelBuilder[_]): ZManagedChannel = apply(builder, Nil) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala index 3a3c5a0a7..b4cb14dad 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala @@ -3,16 +3,16 @@ package scalapb.zio_grpc.client import io.grpc.{CallOptions, MethodDescriptor, Status} import scalapb.zio_grpc.{ResponseContext, ResponseFrame, SafeMetadata, ZChannel} import zio.stream.ZStream -import zio.{Exit, ZIO} +import zio.{Exit, IO, ZIO} object ClientCalls { object withMetadata { - private def unaryCall[R, Req, Res]( - call: ZClientCall[R, Req, Res], + private def unaryCall[Req, Res]( + call: ZClientCall[Req, Res], headers: SafeMetadata, req: Req - ): ZIO[R, Status, ResponseContext[Res]] = + ): IO[Status, ResponseContext[Res]] = ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => call.start(listener, headers) *> call.request(1) *> @@ -21,27 +21,27 @@ object ClientCalls { listener.getValue } - def unaryCall[R, Req, Res]( - channel: ZChannel[R], + def unaryCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, req: Req - ): ZIO[R, Status, ResponseContext[Res]] = + ): IO[Status, ResponseContext[Res]] = channel .newCall(method, options) .flatMap(unaryCall(_, headers, req)) - private def serverStreamingCall[R, Req, Res]( - call: ZClientCall[R, Req, Res], + private def serverStreamingCall[Req, Res]( + call: ZClientCall[Req, Res], headers: SafeMetadata, req: Req - ): ZStream[R, Status, ResponseFrame[Res]] = + ): ZStream[Any, Status, ResponseFrame[Res]] = ZStream .acquireReleaseExitWith( - StreamingClientCallListener.make[R, Res](call) - )(anyExitHandler[R, Req, Res](call)) - .flatMap { (listener: StreamingClientCallListener[R, Res]) => + StreamingClientCallListener.make[Res](call) + )(anyExitHandler[Req, Res](call)) + .flatMap { (listener: StreamingClientCallListener[Res]) => ZStream .fromZIO( call.start(listener, headers) *> @@ -52,22 +52,22 @@ object ClientCalls { .drain ++ listener.stream } - def serverStreamingCall[R, Req, Res]( - channel: ZChannel[R], + def serverStreamingCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[R, Status, ResponseFrame[Res]] = + ): ZStream[Any, Status, ResponseFrame[Res]] = ZStream .fromZIO(channel.newCall(method, options)) .flatMap(serverStreamingCall(_, headers, req)) - private def clientStreamingCall[R, R0, Req, Res]( - call: ZClientCall[R, Req, Res], + private def clientStreamingCall[Req, Res]( + call: ZClientCall[Req, Res], headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZIO[R with R0, Status, ResponseContext[Res]] = + req: ZStream[Any, Status, Req] + ): IO[Status, ResponseContext[Res]] = ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain val resultStream = ZStream.fromZIO(listener.getValue) @@ -80,13 +80,13 @@ object ClientCalls { .map(res => res.last) } - def clientStreamingCall[R, R0, Req, Res]( - channel: ZChannel[R], + def clientStreamingCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZIO[R with R0, Status, ResponseContext[Res]] = + req: ZStream[Any, Status, Req] + ): IO[Status, ResponseContext[Res]] = channel .newCall(method, options) .flatMap( @@ -97,16 +97,16 @@ object ClientCalls { ) ) - private def bidiCall[R, R0, Req, Res]( - call: ZClientCall[R, Req, Res], + private def bidiCall[Req, Res]( + call: ZClientCall[Req, Res], headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZStream[R with R0, Status, ResponseFrame[Res]] = + req: ZStream[Any, Status, Req] + ): ZStream[Any, Status, ResponseFrame[Res]] = ZStream .acquireReleaseExitWith( - StreamingClientCallListener.make[R, Res](call) + StreamingClientCallListener.make[Res](call) )(anyExitHandler(call)) - .flatMap { (listener: StreamingClientCallListener[R, Res]) => + .flatMap { (listener: StreamingClientCallListener[Res]) => val init = ZStream .fromZIO( @@ -118,70 +118,69 @@ object ClientCalls { sendRequestStream.merge(listener.stream, ZStream.HaltStrategy.Right) } - def bidiCall[R, R0, Req, Res]( - channel: ZChannel[R], + def bidiCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZStream[R with R0, Status, ResponseFrame[Res]] = + req: ZStream[Any, Status, Req] + ): ZStream[Any, Status, ResponseFrame[Res]] = ZStream .fromZIO( channel.newCall(method, options) ) .flatMap(bidiCall(_, headers, req)) - } - def exitHandler[R, Req, Res]( - call: ZClientCall[R, Req, Res] + def exitHandler[Req, Res]( + call: ZClientCall[Req, Res] )(l: Any, ex: Exit[Status, Any]) = anyExitHandler(call)(l, ex) // less type safe - def anyExitHandler[R, Req, Res]( - call: ZClientCall[R, Req, Res] + def anyExitHandler[Req, Res]( + call: ZClientCall[Req, Res] ) = (_: Any, ex: Exit[Any, Any]) => ZIO.when(!ex.isSuccess) { call.cancel("Interrupted").ignore } - def unaryCall[R, Req, Res]( - channel: ZChannel[R], + def unaryCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, req: Req - ): ZIO[R, Status, Res] = + ): IO[Status, Res] = withMetadata.unaryCall(channel, method, options, headers, req).map(_.response) - def serverStreamingCall[R, Req, Res]( - channel: ZChannel[R], + def serverStreamingCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[R, Status, Res] = + ): ZStream[Any, Status, Res] = withMetadata .serverStreamingCall(channel, method, options, headers, req) .collect { case ResponseFrame.Message(x) => x } - def clientStreamingCall[R, R0, Req, Res]( - channel: ZChannel[R], + def clientStreamingCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZIO[R with R0, Status, Res] = + req: ZStream[Any, Status, Req] + ): IO[Status, Res] = withMetadata.clientStreamingCall(channel, method, options, headers, req).map(_.response) - def bidiCall[R, R0, Req, Res]( - channel: ZChannel[R], + def bidiCall[Req, Res]( + channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[R0, Status, Req] - ): ZStream[R with R0, Status, Res] = + req: ZStream[Any, Status, Req] + ): ZStream[Any, Status, Res] = withMetadata .bidiCall(channel, method, options, headers, req) .collect { case ResponseFrame.Message(x) => x } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 1993526b5..4e3ca60f7 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -1,15 +1,14 @@ package scalapb.zio_grpc.client -import zio.{Queue, Runtime, URIO, ZIO} import scalapb.zio_grpc.ResponseFrame import io.grpc.ClientCall import io.grpc.{Metadata, Status} import zio.stream.ZStream import zio._ -class StreamingClientCallListener[R, Res]( - runtime: Runtime[R], - call: ZClientCall[R, _, Res], +class StreamingClientCallListener[Res]( + runtime: Runtime[Any], + call: ZClientCall[_, Res], queue: Queue[ResponseFrame[Res]] ) extends ClientCall.Listener[Res] { @@ -44,11 +43,11 @@ class StreamingClientCallListener[R, Res]( } object StreamingClientCallListener { - def make[R, Res]( - call: ZClientCall[R, _, Res] - ): URIO[R, StreamingClientCallListener[R, Res]] = + def make[Res]( + call: ZClientCall[_, Res] + ): UIO[StreamingClientCallListener[Res]] = for { - runtime <- zio.ZIO.runtime[R] + runtime <- zio.ZIO.runtime[Any] queue <- Queue.unbounded[ResponseFrame[Res]] } yield new StreamingClientCallListener(runtime, call, queue) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala index 760b52d7e..d17d1515c 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala @@ -3,48 +3,27 @@ package scalapb.zio_grpc.client import io.grpc.ClientCall import io.grpc.ClientCall.Listener import scalapb.zio_grpc.GIO -import zio.ZIO +import zio.IO import io.grpc.Status import scalapb.zio_grpc.SafeMetadata -import zio.ZEnvironment -trait ZClientCall[-R, Req, Res] extends Any { +trait ZClientCall[Req, Res] extends Any { self => def start( responseListener: Listener[Res], headers: SafeMetadata - ): ZIO[R, Status, Unit] + ): IO[Status, Unit] - def request(numMessages: Int): ZIO[R, Status, Unit] + def request(numMessages: Int): IO[Status, Unit] - def cancel(message: String): ZIO[R, Status, Unit] + def cancel(message: String): IO[Status, Unit] - def halfClose(): ZIO[R, Status, Unit] + def halfClose(): IO[Status, Unit] - def sendMessage(message: Req): ZIO[R, Status, Unit] - - def provideEnvironment(r: => ZEnvironment[R]): ZClientCall[Any, Req, Res] = - new ZClientCall[Any, Req, Res] { - def start( - responseListener: Listener[Res], - headers: SafeMetadata - ): ZIO[Any, Status, Unit] = - self.start(responseListener, headers).provideEnvironment(r) - - def request(numMessages: Int): ZIO[Any, Status, Unit] = - self.request(numMessages).provideEnvironment(r) - - def cancel(message: String): ZIO[Any, Status, Unit] = - self.cancel(message).provideEnvironment(r) - - def halfClose(): ZIO[Any, Status, Unit] = self.halfClose().provideEnvironment(r) - - def sendMessage(message: Req): ZIO[Any, Status, Unit] = - self.sendMessage(message).provideEnvironment(r) - } + def sendMessage(message: Req): IO[Status, Unit] } -class ZClientCallImpl[Req, Res](private val call: ClientCall[Req, Res]) extends AnyVal with ZClientCall[Any, Req, Res] { +class ZClientCallImpl[Req, Res](private val call: ClientCall[Req, Res]) extends AnyVal with ZClientCall[Req, Res] { def start(responseListener: Listener[Res], headers: SafeMetadata): GIO[Unit] = GIO.attempt(call.start(responseListener, headers.metadata)) @@ -61,38 +40,38 @@ class ZClientCallImpl[Req, Res](private val call: ClientCall[Req, Res]) extends } object ZClientCall { - def apply[Req, Res](call: ClientCall[Req, Res]): ZClientCall[Any, Req, Res] = + def apply[Req, Res](call: ClientCall[Req, Res]): ZClientCall[Req, Res] = new ZClientCallImpl(call) - class ForwardingZClientCall[R, Req, Res, R1 >: R]( - protected val delegate: ZClientCall[R1, Req, Res] - ) extends ZClientCall[R, Req, Res] { + class ForwardingZClientCall[Req, Res]( + protected val delegate: ZClientCall[Req, Res] + ) extends ZClientCall[Req, Res] { override def start( responseListener: Listener[Res], headers: SafeMetadata - ): ZIO[R, Status, Unit] = delegate.start(responseListener, headers) + ): IO[Status, Unit] = delegate.start(responseListener, headers) - override def request(numMessages: Int): ZIO[R, Status, Unit] = + override def request(numMessages: Int): IO[Status, Unit] = delegate.request(numMessages) - override def cancel(message: String): ZIO[R, Status, Unit] = + override def cancel(message: String): IO[Status, Unit] = delegate.cancel(message) - override def halfClose(): ZIO[R, Status, Unit] = delegate.halfClose() + override def halfClose(): IO[Status, Unit] = delegate.halfClose() - override def sendMessage(message: Req): ZIO[R, Status, Unit] = + override def sendMessage(message: Req): IO[Status, Unit] = delegate.sendMessage(message) } - def headersTransformer[R, Req, Res]( - clientCall: ZClientCall[R, Req, Res], - updateHeaders: SafeMetadata => ZIO[R, Status, SafeMetadata] - ): ZClientCall[R, Req, Res] = - new ForwardingZClientCall[R, Req, Res, R](clientCall) { + def headersTransformer[Req, Res]( + clientCall: ZClientCall[Req, Res], + updateHeaders: SafeMetadata => IO[Status, SafeMetadata] + ): ZClientCall[Req, Res] = + new ForwardingZClientCall[Req, Res](clientCall) { override def start( responseListener: Listener[Res], headers: SafeMetadata - ): ZIO[R, Status, Unit] = + ): IO[Status, Unit] = updateHeaders(headers) flatMap { h => delegate.start(responseListener, h) } } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala index 02c60cdd4..e4efb8540 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala @@ -17,14 +17,14 @@ object ListenerDriver { completed = _ => Status.OK ) - def unaryInputListener[R, Req]( - runtime: Runtime[R], + def unaryInputListener[Req]( + runtime: Runtime[Any], call: ZServerCall[_], completed: Promise[Status, Unit], request: Promise[Nothing, Req], requestContext: RequestContext, - writeResponse: Req => ZIO[R, Status, Unit] - ): ZIO[R, Nothing, Listener[Req]] = + writeResponse: Req => ZIO[Any, Status, Unit] + ): ZIO[Any, Nothing, Listener[Req]] = ( call.request(2) *> completed.await *> @@ -68,6 +68,7 @@ object ListenerDriver { override def onReady(): Unit = Unsafe.unsafe { implicit u => runtime.unsafe.run(call.setReady()) + () } } ) @@ -77,17 +78,17 @@ object ListenerDriver { * writeResponse: given a request, returns a effects that computes the response and writes it through the given * ZServerCall. */ - def makeUnaryInputListener[R, Req, Res]( + def makeUnaryInputListener[Req, Res]( writeResponse: ( Req, RequestContext, ZServerCall[Res] - ) => ZIO[R, Status, Unit], - runtime: Runtime[R] + ) => ZIO[Any, Status, Unit], + runtime: Runtime[Any] )( zioCall: ZServerCall[Res], requestContext: RequestContext - ): ZIO[R, Nothing, Listener[Req]] = + ): ZIO[Any, Nothing, Listener[Req]] = for { completed <- Promise.make[Status, Unit] request <- Promise.make[Nothing, Req] @@ -101,13 +102,13 @@ object ListenerDriver { ) } yield listener - def streamingInputListener[R, Req, Res]( - runtime: Runtime[R], + def streamingInputListener[Req, Res]( + runtime: Runtime[Any], call: ZServerCall[Res], queue: Queue[Option[Req]], requestContext: RequestContext, - writeResponse: Stream[Status, Req] => ZIO[R, Status, Unit] - ): ZIO[R, Nothing, Listener[Req]] = { + writeResponse: Stream[Status, Req] => ZIO[Any, Status, Unit] + ): ZIO[Any, Nothing, Listener[Req]] = { val requestStream = ZStream .fromQueue(queue) .collectWhileSome @@ -141,8 +142,8 @@ object ListenerDriver { override def onReady(): Unit = Unsafe.unsafe { implicit u => - runtime.unsafe - .run(call.setReady()) + runtime.unsafe.run(call.setReady()) + () } } ) @@ -153,20 +154,20 @@ object ListenerDriver { * writeResponse: given a request, returns a effects that computes the response and writes it through the given * ZServerCall. */ - def makeStreamingInputListener[R, Req, Res]( + def makeStreamingInputListener[Req, Res]( writeResponse: ( Stream[Status, Req], RequestContext, ZServerCall[Res] - ) => ZIO[R, Status, Unit] + ) => ZIO[Any, Status, Unit] )( zioCall: ZServerCall[Res], requestContext: RequestContext - ): ZIO[R, Nothing, Listener[Req]] = + ): ZIO[Any, Nothing, Listener[Req]] = for { - runtime <- ZIO.runtime[R] + runtime <- ZIO.runtime[Any] queue <- Queue.unbounded[Option[Req]] - listener <- streamingInputListener[R, Req, Res]( + listener <- streamingInputListener[Req, Res]( runtime, zioCall, queue, diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index ac1d6606e..fb9f49b93 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -13,9 +13,9 @@ import scalapb.zio_grpc.SafeMetadata import zio.stm.TSemaphore import zio.stream.Take -class ZServerCallHandler[R, Req, Res]( - runtime: Runtime[R], - mkListener: (ZServerCall[Res], RequestContext) => URIO[R, Listener[Req]] +class ZServerCallHandler[Req, Res]( + runtime: Runtime[Any], + mkListener: (ZServerCall[Res], RequestContext) => UIO[Listener[Req]] ) extends ServerCallHandler[Req, Res] { def startCall( call: ServerCall[Req, Res], @@ -46,19 +46,19 @@ object ZServerCallHandler { ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}")) } - def unaryInput[R, Req, Res]( - runtime: Runtime[R], - impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[R, Status, Unit] + def unaryInput[Req, Res]( + runtime: Runtime[Any], + impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[Any, Status, Unit] ): ServerCallHandler[Req, Res] = new ZServerCallHandler(runtime, ListenerDriver.makeUnaryInputListener(impl, runtime)) - def streamingInput[R, Req, Res]( - runtime: Runtime[R], + def streamingInput[Req, Res]( + runtime: Runtime[Any], impl: ( Stream[Status, Req], RequestContext, ZServerCall[Res] - ) => ZIO[R, Status, Unit] + ) => ZIO[Any, Status, Unit] ): ServerCallHandler[Req, Res] = new ZServerCallHandler( runtime, @@ -69,7 +69,7 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Req => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - unaryInput[Any, Req, Res]( + unaryInput[Req, Res]( runtime, (req, requestContext, call) => impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) @@ -79,7 +79,7 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Req => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - unaryInput[Any, Req, Res]( + unaryInput[Req, Res]( runtime, (req: Req, requestContext: RequestContext, call: ZServerCall[Res]) => serverStreamingWithBackpressure(call, impl(req).provideEnvironment(ZEnvironment(requestContext))) @@ -89,7 +89,7 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Stream[Status, Req] => ZIO[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - streamingInput[Any, Req, Res]( + streamingInput[Req, Res]( runtime, (req, requestContext, call) => impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) @@ -99,7 +99,7 @@ object ZServerCallHandler { runtime: Runtime[Any], impl: Stream[Status, Req] => ZStream[RequestContext, Status, Res] ): ServerCallHandler[Req, Res] = - streamingInput[Any, Req, Res]( + streamingInput[Req, Res]( runtime, (req, requestContext, call) => serverStreamingWithBackpressure(call, impl(req).provideEnvironment(ZEnvironment(requestContext))) diff --git a/docs/context.md b/docs/context.md index 4047d71b4..2e03d603a 100644 --- a/docs/context.md +++ b/docs/context.md @@ -5,11 +5,9 @@ custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/context.md --- When implementing a server, ZIO gRPC allows you to specify that your service -depends on an environment of type `R` and a context of type `Context`. +methods depend depends on a context of type `Context` which can be any Scala type. -`Context` and `R` can be of any Scala type. This allows ZIO gRPC to combine two values (`Context with R`) when providing the values at effect execution time. - -For example, we can define a service for which the effects depend on `Console`, and for each request we expect to get a context of type `User`. +For example, we can define a service with handlers that expect a context of type `User` for each request: ```scala mdoc import zio.ZIO @@ -22,7 +20,7 @@ import io.grpc.Status case class User(name: String) -object MyService extends ZSimpleService[Any, User] { +object MyService extends ZSimpleService[User] { def sayHello(req: Request): ZIO[User, Status, Response] = for { user <- ZIO.service[User] @@ -31,7 +29,7 @@ object MyService extends ZSimpleService[Any, User] { } ``` -As you can see above, we can access both the `User` and the `Console` in our effects. If one of the methods does not need to access the dependencies or context, the returned type from the method can be cleaned up to reflect that certain things are not needed. +As you can see above, we can access the `User` in our effects. If one of the methods does not need to access the dependencies or context, the returned type from the method can be cleaned up to reflect that certain things are not needed. ## Context transformations @@ -85,66 +83,85 @@ may want to organize your code such that there is a `UserDatabase` service that a `fetchUser` effect that retrieves users from a database. Here is how you can do this: ```scala mdoc -object UserDatabase { - trait Service { - def fetchUser(name: String): IO[Status, User] - } - - // accessor - def fetchUser(name: String): ZIO[UserDatabase.Service, Status, User] = - ZIO.environmentWithZIO[UserDatabase.Service](_.get.fetchUser(name)) +trait UserDatabase { + def fetchUser(name: String): IO[Status, User] +} - val live = zio.ZLayer.succeed( - new Service { +object UserDatabase { + val layer = zio.ZLayer.succeed( + new UserDatabase { def fetchUser(name: String): IO[Status, User] = ZIO.succeed(User(name)) }) } ``` -Now, -The context transformation effect we apply may introduce an additional environmental dependency to our service. For example: +Now, The context transformation effect we apply may introduce an additional environmental dependency to our service. For example: ```scala mdoc import zio.Clock._ import zio.Duration._ -val myServiceAuthWithDatabase = - MyService.transformContextZIO { - (rc: RequestContext) => - rc.metadata.get(UserKey) - .someOrFail(Status.UNAUTHENTICATED) - .flatMap(UserDatabase.fetchUser) - } +val myServiceAuthWithDatabase: ZIO[UserDatabase, Nothing, ZSimpleService[RequestContext]] = + ZIO.serviceWith[UserDatabase]( + userDatabase => + MyService.transformContextZIO { + (rc: RequestContext) => + rc.metadata.get(UserKey) + .someOrFail(Status.UNAUTHENTICATED) + .flatMap(userDatabase.fetchUser(_)) + } + ) +``` + +Now our service can be built from an effect that depends on `UserDatabase`. This effect can be +added to a `ServiceList` using `addZIO`: + +```scala mdoc +object MyServer2 extends ServerMain { + def services = ServiceList + .addZIO(myServiceAuthWithDatabase) + .provide(UserDatabase.layer) +} ``` -And now our service not only depends on a `Console`, but also on a `UserDatabase`. ## Using a service as ZLayer -We can turn our service into a ZLayer: + +If you require more flexibility than provided through `ServerMain`, you can construct +the server directly. + +We first turn our service into a ZLayer: ```scala mdoc -val myServiceLive = myServiceAuthWithDatabase.toLayer +val myServiceLayer = zio.ZLayer(myServiceAuthWithDatabase) ``` -notice how the dependencies moved to the input side of the `Layer` and the resulting layer is of -type `ZSimpleService[Any, RequestContext]]`, which means no environment is expected, and it assumes -a `RequestContext` context. To use this layer in an app, we can wire it like so: +Notice how the dependencies moved to the input side of the `ZLayer` and the resulting layer is of +type `ZSimpleService[RequestContext]`. + +To use this layer in an app, we can wire it like so: ```scala mdoc import scalapb.zio_grpc.ServerLayer +import scalapb.zio_grpc.Server import zio.ZLayer +val serviceList = ServiceList + .addLayer(myServiceLayer) + val serverLayer = - ServerLayer.fromServiceLayer( - io.grpc.ServerBuilder.forPort(9000) - )(myServiceLive) + ServerLayer.fromServiceList( + io.grpc.ServerBuilder.forPort(9000), + serviceList + ) -val ourApp = UserDatabase.live >>> serverLayer +val ourApp = + UserDatabase.layer >>> serverLayer object LayeredApp extends zio.ZIOAppDefault { - def run = (ourApp.build *> ZIO.never).exitCode + def run = ourApp.launch.exitCode } ``` -`serverLayer` wraps around our service layer to produce a server. Then, `ourApp` layer is constructed such that it takes `UserDatabase.live` in conjuction to a passthrough layer for `Console` to satisfy the two input requirements of `serverLayer`. The outcome, `ourApp`, is a `ZLayer` that can produce a `Server` from a `Console`. In the `run` method we build the layer and run it. Note that we are directly using a `zio.ZioAppDefault` rather than `ServerMain` which does -not support this use case yet. +`serverLayer` creates a `Server` from a `ZSimpleService` layer and still depends on a `UserDatabase`. Then, `ourApp` feeds a `UserDatabase.layer` into `serverLayer` to produce +a `Server` that doesn't depend on anything. In the `run` method we launch the server layer. \ No newline at end of file diff --git a/docs/decorating.md b/docs/decorating.md index 248b7a652..0153e16a3 100644 --- a/docs/decorating.md +++ b/docs/decorating.md @@ -5,9 +5,9 @@ custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/decorating --- When implementing a server, sometimes you might want to decorate all methods (effects or streams) -in the service, for example to add access and error logging. +in the service, for example to add access and error logging. -It can be done with the help of `ZTransform`. Instances of this class can be used +It can be done with the help of `ZTransform`. Instances of this class can be used to apply a transformation to all methods of a service to generate a new "decorated" service. This can be used for pre- or post-processing of requests/responses and also for environment and context transformations. @@ -20,16 +20,16 @@ import scalapb.zio_grpc.{ RequestContext, ZTransform } import zio._ import zio.stream.ZStream -class LoggingTransform[R] extends ZTransform[R, Status, R with RequestContext] { +class LoggingTransform[R] extends ZTransform[Any, Status, RequestContext] { def logCause(cause: Cause[Status]): URIO[RequestContext, Unit] = ??? def accessLog: URIO[RequestContext, Unit] = ??? - override def effect[A](io: ZIO[R, Status, A]): ZIO[R with RequestContext, Status, A] = + override def effect[A](io: ZIO[Any, Status, A]): ZIO[RequestContext, Status, A] = io.zipLeft(accessLog).tapErrorCause(logCause) - override def stream[A](io: ZStream[R, Status, A]): ZStream[R with RequestContext, Status, A] = + override def stream[A](io: ZStream[Any, Status, A]): ZStream[RequestContext, Status, A] = (io ++ ZStream.fromZIO(accessLog).drain).onError(logCause) } ``` @@ -40,7 +40,7 @@ and then we apply it to our service: import myexample.testservice.ZioTestservice.ZSimpleService import myexample.testservice.{Request, Response} -object MyService extends ZSimpleService[Any, Any] { +object MyService extends ZSimpleService[Any] { def sayHello(req: Request): ZIO[Any, Status, Response] = ZIO.succeed(Response(s"Hello user")) } diff --git a/docs/generated-code.md b/docs/generated-code.md index 36afe6d76..0ff013b47 100644 --- a/docs/generated-code.md +++ b/docs/generated-code.md @@ -17,24 +17,21 @@ You can read more on how ScalaPB determines the Scala package name and how can t Inside the object, for each service `ServiceName` that is defined in a `.proto` file, the following structure is generated: ```scala -trait ZServiceName[R, Context] { +trait ZServiceName[Context] { // methods for each RPC def sayHello(request: HelloRequest): - ZIO[R with Context, Status, HelloReply] + ZIO[Context, Status, HelloReply] } -type ServiceName = ZServiceName[Any, Any] +type ServiceName = ZServiceName[Any] ``` -The trait `ZServiceName` is to be extended when implementing a server for this service. The trait takes two type parameters: `R` and `Context`: +The trait `ZServiceName` is to be extended when implementing a server for this service. The trait takes one type parameter `Context`. The `Context` type parameter represents any domain object that you would like your RPC methods to have available in the environment. -* `R` representes the dependencies of the service. All the effects being returned by these methods depend on `R` to encode this dependency. -* `Context` represents any domain object that you would like your RPC methods to have available in the environment. - -You can set both `R` and `Context` to be `Any` when implementing a service to indicate that the service does not have any dependencies or expectations from the environment. Since it is very common situation, especially when getting started, you can have your service implementation extends `ServiceName` which is a type alias to `ZServiceName[Any, Any]`: +You can set `Context` to `Any` when implementing a service to indicate that the service does not have any dependencies or expectations from the environment. Since it is very common situation, especially when getting started, you can have your service implementation extends `ServiceName` which is a type alias to `ZServiceName[Any]`: ```scala -trait ServiceNameImpl extends ServiceName { +object ServiceNameImpl extends ServiceName { } ``` @@ -61,7 +58,7 @@ object MyMain extends ServerMain { You can also override `def port: Int` to set a port number (by default port 9000 is used). -`ServiceList` contains additional methods to add services to the service list that can be used when the service must be created effectfully, or wrapped in a managed, or provided to you as a layer. +`ServiceList` contains additional methods to add services to the service list that can be used when the service must be created effectfully, resourcefully (scoped), or provided through a layer. ## Client trait @@ -71,10 +68,10 @@ The generated client follows [ZIO's module pattern](https://zio.dev/docs/howto/h type ServiceNameClient = ServiceNameClient.Service object ServiceNameClient { - trait ZService[R] { + trait ZService[Context] { // methods for use as a client def sayHello(request: HelloRequest): - ZIO[R, Status, HelloReply] + ZIO[Context, Status, HelloReply] } type Service = ZService[Any] @@ -83,27 +80,27 @@ object ServiceNameClient { ZIO[ServiceNameClient, Status, HelloReply] def scoped[R]( - managedChannel: ZManagedChannel[R], + managedChannel: ZManagedChannel, options: CallOptions = io.grpc.CallOptions.DEFAULT, headers: zio.UIO[SafeMetadata] = scalapb.zio_grpc.SafeMetadata.make ): zio.Managed[Throwable, ZService[R]] - def live[R]( - managedChannel: ZManagedChannel[R], + def live[Context]( + managedChannel: ZManagedChannel, options: CallOptions = io.grpc.CallOptions.DEFAULT, headers: zio.UIO[scalapb.zio_grpc.SafeMetadata] = scalapb.zio_grpc.SafeMetadata.make - ): zio.ZLayer[R, Throwable, ServiceNameClient] + ): zio.ZLayer[Any, Throwable, ZService[Context]] } ``` -We have two ways to use a client: through a managed resource, or through a layer. In both cases, we start by creating a `ZManagedChannel`, which represents a communication channel to a gRPC server as a managed resource. Since it is wrapped in [ZIO's `Managed`](https://zio.dev/docs/datatypes/datatypes_managed), proper shutdown of the channel is guaranteed: +We have two ways to use a client: through a managed resource, or through a layer. In both cases, we start by creating a `ZManagedChannel`, which represents a communication channel to a gRPC server as a managed resource. Since it is scoped, proper shutdown of the channel is guaranteed: ```scala -type ZManagedChannel[R] = Managed[Throwable, ZChannel[R]] +type ZManagedChannel[R] = ZIO[Scope, Throwable, ZChannel[R]] ``` Creating a channel: @@ -149,9 +146,9 @@ object LayeredApp extends zio.ZIOAppDefault { Here the application is broken to multiple value assignments so you can see the types. The first effect `myAppLogicNeedsEnv` uses accessor functions, which makes it depend on an environment of type `ServiceNameClient`. It chains the `unary` RPC with printing the result to the console, and hence the final inferred effect type is `ServiceNameClient`. Once we provide our custom layer, the effect type is `ZEnv`, which we can use with ZIO's `exit` method. -### Using a Managed Client +### Using a Scoped client -As an alternative to using ZLayer, you can use the client through a managed resource: +As an alternative to using ZLayer, you can use the client as a scoped resource: ```scala mdoc import myexample.testservice.ZioTestservice.ServiceNameClient @@ -168,4 +165,4 @@ val myAppLogic = ZIO.scoped { } ``` -Since the service acquistion (through the ZManaged) can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. +Since the service acquistion can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala index c3aef2af8..ca91a0562 100644 --- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala +++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -17,7 +17,7 @@ object BackpressureSpec extends ZIOSpecDefault { val client = ZLayer.scoped[Server] { for { - ss <- ZIO.service[Server.Service] + ss <- ZIO.service[Server] port <- ss.port.orDie ch = InProcessChannelBuilder.forName("backpressure-test").usePlaintext().directExecutor() client <- ZioTestservice.TestServiceClient.scoped(ZManagedChannel(ch)).orDie diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index 08df4eb84..d994ee6e1 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -1,8 +1,6 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.ZioTestservice.ZTestService -import zio.Clock -import zio.Console import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.testservice.{Request, Response} @@ -11,67 +9,40 @@ import io.grpc.ServerBuilder import zio.test._ object BindableServiceSpec extends ZIOSpecDefault { - implicitly[ZBindableService[Any, ZTestService[Any, RequestContext]]] - implicitly[ZBindableService[Any, ZTestService[Any, SafeMetadata]]] - implicitly[ZBindableService[Any, ZTestService[Any, Any]]] + implicitly[ZBindableService[ZTestService[RequestContext]]] + implicitly[ZBindableService[ZTestService[SafeMetadata]]] + implicitly[ZBindableService[ZTestService[Any]]] - implicitly[ZBindableService[Clock, ZTestService[Clock, RequestContext]]] - implicitly[ZBindableService[Clock, ZTestService[Clock, SafeMetadata]]] - implicitly[ZBindableService[Clock, ZTestService[Clock, Any]]] + class UnimpTestService[C] extends ZTestService[C] { + def unary(request: Request): ZIO[C, Status, Response] = ??? - implicitly[ - ZBindableService[Clock with Console, ZTestService[Clock with Console, RequestContext]] - ] - implicitly[ - ZBindableService[Clock with Console, ZTestService[Clock with Console, SafeMetadata]] - ] - implicitly[ZBindableService[Clock with Console, ZTestService[Clock with Console, Any]]] + def serverStreaming(request: Request): ZStream[C, Status, Response] = ??? - class UnimpTestService[R, C] extends ZTestService[R, C] { - def unary(request: Request): ZIO[R with C, Status, Response] = ??? + def clientStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZIO[C, Status, Response] = ??? - def serverStreaming(request: Request): ZStream[R with C, Status, Response] = ??? - - def clientStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZIO[R with C, Status, Response] = ??? - - def bidiStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZStream[R with C, Status, Response] = ??? + def bidiStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZStream[C, Status, Response] = ??? } - object S1 extends UnimpTestService[Any, RequestContext] - object S2 extends UnimpTestService[Any, SafeMetadata] - object S3 extends UnimpTestService[Any, Any] - object S4 extends UnimpTestService[Clock, SafeMetadata] - object S5 extends UnimpTestService[Clock, RequestContext] - object S6 extends UnimpTestService[Clock, Any] - object S7 extends UnimpTestService[Console, Any] + object S1 extends UnimpTestService[RequestContext] + object S2 extends UnimpTestService[SafeMetadata] + object S3 extends UnimpTestService[Any] ServerLayer.fromService(ServerBuilder.forPort(9000), S1) ServerLayer.fromService(ServerBuilder.forPort(9000), S2) ServerLayer.fromService(ServerBuilder.forPort(9000), S3) - ServerLayer.fromService(ServerBuilder.forPort(9000), S4) - ServerLayer.fromService(ServerBuilder.forPort(9000), S5) - ServerLayer.fromService(ServerBuilder.forPort(9000), S6) - ServerLayer.fromService(ServerBuilder.forPort(9000), S7) + val l1a = ServerLayer.fromService(ServerBuilder.forPort(9000), S1) + val l2a = ServerLayer.fromServices(ServerBuilder.forPort(9000), S1, S2) val l3a = ServerLayer.fromServices(ServerBuilder.forPort(9000), S1, S2, S3) - val l3b = ServerLayer.fromServices(ServerBuilder.forPort(9000), S1, S4, S7) val y1 = ServiceList.add(S1) val y2 = ServiceList.add(S2) val y3 = ServiceList.add(S3) - val y4 = ServiceList.add(S4) - val y5 = ServiceList.add(S5) - val y6 = ServiceList.add(S6) - val y7 = ServiceList.add(S7) val z1 = ServiceList.addZIO(ZIO.succeed(S1)) val z2 = ServiceList.addZIO(ZIO.succeed(S2)) val z3 = ServiceList.addZIO(ZIO.succeed(S3)) - val z4 = ServiceList.addZIO(ZIO.succeed(S4)) - val z5 = ServiceList.addZIO(ZIO.succeed(S5)) - val z6 = ServiceList.addZIO(ZIO.succeed(S6)) - val z7 = ServiceList.addZIO(ZIO.succeed(S7)) val z8 = ServiceList.access[S1.type] - val z9 = ServiceList.addScoped(ZIO.succeed(S4)) + val z9 = ServiceList.addScoped(ZIO.succeed(S3)) def spec = suite("BindableServiceSpec")( test("empty - required to make the compiler happy") { diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala index 855096dbb..88aa1b1c7 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala @@ -15,7 +15,7 @@ object ClientCallsSpec extends ZIOSpecDefault { test("should not fail with 'INTERNAL: already started' on retry") { for { channel <- ZChannel - .scoped[Any]( + .scoped( ManagedChannelBuilder.forAddress("localhost", 0).usePlaintext(), Nil, 1.second diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 027bf6a0a..15fd9f558 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -19,7 +19,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { val getUser = ZIO.serviceWith[Context](_.user) val getResponseMetadata = ZIO.serviceWith[Context](_.response) - object ServiceWithConsole extends ZTestService[Any, Context] { + object ServiceWithConsole extends ZTestService[Context] { def unary(request: Request): ZIO[Context, Status, Response] = for { user <- getUser @@ -73,17 +73,17 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { case None => ZIO.fail(Status.UNAUTHENTICATED) } - val serviceLayer = ServiceWithConsole.transformContextZIO(parseUser(_)).toLayer + val serviceLayer = ZLayer.succeed(ServiceWithConsole.transformContextZIO(parseUser(_))) - val serverLayer: ZLayer[ZTestService[Any, RequestContext], Throwable, Server] = - ServerLayer.access[ZTestService[Any, RequestContext]](ServerBuilder.forPort(0)) + val serverLayer: ZLayer[ZTestService[RequestContext], Throwable, Server] = + ServerLayer.access[ZTestService[RequestContext]](ServerBuilder.forPort(0)) override def clientLayer( userName: Option[String] ): URLayer[Server, TestServiceClient] = ZLayer.scoped { - ZIO.environmentWithZIO { (ss: ZEnvironment[Server.Service]) => - ss.get[Server.Service].port.orDie flatMap { (port: Int) => + ZIO.environmentWithZIO { (ss: ZEnvironment[Server]) => + ss.get[Server].port.orDie flatMap { (port: Int) => val ch = ZManagedChannel( ManagedChannelBuilder.forAddress("localhost", port).usePlaintext(), Seq( @@ -99,8 +99,8 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { override def clientMetadataLayer: URLayer[Server, TestServiceClientWithMetadata] = ZLayer.scoped { - ZIO.environmentWithZIO { (ss: ZEnvironment[Server.Service]) => - ss.get[Server.Service].port.orDie flatMap { (port: Int) => + ZIO.environmentWithZIO { (ss: ZEnvironment[Server]) => + ss.get[Server].port.orDie flatMap { (port: Int) => val ch = ZManagedChannel( ManagedChannelBuilder.forAddress("localhost", port).usePlaintext(), Seq( diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala index 6c045dda0..b5bd2d966 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala @@ -26,7 +26,7 @@ object ServerSpec extends ZIOSpecDefault { def isTerminated(): Boolean = ??? def awaitTermination(timeout: Long, unit: TimeUnit): Boolean = ??? } - pbServer = new Server.ServiceImpl(server) + pbServer = new ServerImpl(server) _ <- pbServer.awaitTermination waited <- waitedRef.get } yield assert(waited)(isTrue) @@ -52,7 +52,7 @@ object ServerSpec extends ZIOSpecDefault { def isTerminated(): Boolean = ??? def awaitTermination(): Unit = ??? } - pbServer = new Server.ServiceImpl(server) + pbServer = new ServerImpl(server) _ <- pbServer.awaitTermination(Duration.ofSeconds(2, 500000000L)) assertion <- waitedRef.get } yield assertion diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 94ad65f58..2a7b1536a 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -19,7 +19,7 @@ object TestServiceSpec extends ZIOSpecDefault { val clientLayer: ZLayer[Server, Nothing, TestServiceClient] = ZLayer.scoped[Server] { for { - ss <- ZIO.service[Server.Service] + ss <- ZIO.service[Server] port <- ss.port.orDie ch = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext() client <- TestServiceClient.scoped(ZManagedChannel(ch)).orDie @@ -252,7 +252,7 @@ object TestServiceSpec extends ZIOSpecDefault { suite("bidi streaming request")( test("returns successful response") { assertZIO(for { - bf <- BidiFixture(TestServiceClient.bidiStreaming[Any]) + bf <- BidiFixture(TestServiceClient.bidiStreaming) _ <- bf.send(Request(Scenario.OK, in = 1)) f1 <- bf.receive(1) _ <- bf.send(Request(Scenario.OK, in = 3)) @@ -274,7 +274,7 @@ object TestServiceSpec extends ZIOSpecDefault { }, test("returns correct error response") { assertZIO(for { - bf <- BidiFixture(TestServiceClient.bidiStreaming[Any]) + bf <- BidiFixture(TestServiceClient.bidiStreaming) _ <- bf.send(Request(Scenario.OK, in = 1)) f1 <- bf.receive(1) _ <- bf.send(Request(Scenario.ERROR_NOW, in = 3)) @@ -292,7 +292,7 @@ object TestServiceSpec extends ZIOSpecDefault { for { testServiceImpl <- ZIO.environment[TestServiceImpl] collectFiber <- collectWithError( - TestServiceClient.bidiStreaming[Any]( + TestServiceClient.bidiStreaming( ZStream( Request(Scenario.OK, in = 17) ) ++ ZStream.fromZIO(testServiceImpl.get.awaitReceived).drain From 7740c8a2aacd7ac82df6bed4fc66674b4c012efc Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 14:35:39 -0800 Subject: [PATCH 101/245] Update Scala.js bundler --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 4b9abc29d..29171cd55 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -14,7 +14,7 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") -addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.0") +addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") From 1a9383a4e470c54e53b242e7c31ca767f948931d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 31 Dec 2022 14:35:53 -0800 Subject: [PATCH 102/245] Bump loader-utils from 2.0.3 to 2.0.4 in /website (#447) Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index a0d338dc5..39e961953 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -5910,9 +5910,9 @@ loader-runner@^4.2.0: integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.3.tgz#d4b15b8504c63d1fc3f2ade52d41bc8459d6ede1" - integrity sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A== + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" From 6d1b3391f500faaf40aed1b3ac957db9b665da81 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 14:39:14 -0800 Subject: [PATCH 103/245] Fix BindableServiceSpec --- e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index d994ee6e1..0db976361 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -7,6 +7,7 @@ import scalapb.zio_grpc.testservice.{Request, Response} import zio.stream.ZStream import io.grpc.ServerBuilder import zio.test._ +import zio.ZLayer object BindableServiceSpec extends ZIOSpecDefault { implicitly[ZBindableService[ZTestService[RequestContext]]] @@ -42,7 +43,7 @@ object BindableServiceSpec extends ZIOSpecDefault { val z2 = ServiceList.addZIO(ZIO.succeed(S2)) val z3 = ServiceList.addZIO(ZIO.succeed(S3)) val z8 = ServiceList.access[S1.type] - val z9 = ServiceList.addScoped(ZIO.succeed(S3)) + val z9 = ServiceList.addLayer(ZLayer.succeed(S3)) def spec = suite("BindableServiceSpec")( test("empty - required to make the compiler happy") { From 096e02548d4bee58472dc6d629743e562e650aa6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 31 Dec 2022 14:39:43 -0800 Subject: [PATCH 104/245] Bump json5 from 2.2.1 to 2.2.3 in /website (#463) Bumps [json5](https://github.com/json5/json5) from 2.2.1 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.1...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index 39e961953..d38165f3c 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -5847,9 +5847,9 @@ json-schema-traverse@^1.0.0: integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" From c8a2ef131cf77b3ae31513ef518b2fc81d8834a7 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 17:04:57 -0800 Subject: [PATCH 105/245] Remove ServiceList.addLayer; rename ServiceList.access to addFromEnvironment --- .../scalajvm/scalapb/zio_grpc/Server.scala | 4 +- .../scalapb/zio_grpc/ServiceList.scala | 7 +- docs/context.md | 65 +++++++++++++++++-- .../zio_grpc/BindableServiceSpec.scala | 3 +- 4 files changed, 65 insertions(+), 14 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index ef06d3f2b..5bedb859c 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -46,10 +46,10 @@ object ServerLayer { def fromServiceList[R](builder: => ServerBuilder[_], l: ServiceList[R]): ZLayer[R, Throwable, Server] = ZLayer.scoped[R](ScopedServer.fromServiceList(builder, l)) - def access[S1: Tag: ZBindableService]( + def fromEnvironment[S1: Tag: ZBindableService]( builder: => ServerBuilder[_] ): ZLayer[S1, Throwable, Server] = - fromServiceList(builder, ServiceList.access[S1]) + fromServiceList(builder, ServiceList.addFromEnvironment[S1]) def fromService[S1: ZBindableService](builder: => ServerBuilder[_], s1: S1): ZLayer[Any, Throwable, Server] = fromServiceList(builder, ServiceList.add(s1)) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala index f9592ffca..1a6ecc80b 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServiceList.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import zio.{Scope, Tag, ZEnvironment, ZIO, ZLayer} +import zio.{Tag, ZEnvironment, ZIO, ZLayer} import io.grpc.ServerServiceDefinition /** Represents a managed list of services to be added to the a server. @@ -25,11 +25,8 @@ sealed class ServiceList[-RR] private[scalapb] ( ssd <- ZBindableService[S1].bindService(service) } yield ssd :: ll) - def addLayer[R1, S1: Tag: ZBindableService](layer: ZLayer[R1, Throwable, S1]): ServiceList[RR with R1 with Scope] = - addZIO[R1 with Scope, S1](layer.build.map(_.get)) - /** Adds a dependency on a service that will be provided later from the environment or a Layer * */ - def access[B: Tag: ZBindableService]: ServiceList[RR with B] = + def addFromEnvironment[B: Tag: ZBindableService]: ServiceList[RR with B] = addZIO(ZIO.environmentWith(_.get[B])) def provideEnvironment(r: => ZEnvironment[RR]): ServiceList[Any] = diff --git a/docs/context.md b/docs/context.md index 2e03d603a..ad902e22e 100644 --- a/docs/context.md +++ b/docs/context.md @@ -76,7 +76,7 @@ object MyServer extends ServerMain { } ``` -### Depending on a service +### Context transformations that depends on a service A context transformation may introduce a dependency on another service. For example, you may want to organize your code such that there is a `UserDatabase` service that provides @@ -124,7 +124,6 @@ object MyServer2 extends ServerMain { } ``` - ## Using a service as ZLayer If you require more flexibility than provided through `ServerMain`, you can construct @@ -147,7 +146,7 @@ import scalapb.zio_grpc.Server import zio.ZLayer val serviceList = ServiceList - .addLayer(myServiceLayer) + .addFromEnvironment[ZSimpleService[RequestContext]] val serverLayer = ServerLayer.fromServiceList( @@ -156,7 +155,7 @@ val serverLayer = ) val ourApp = - UserDatabase.layer >>> serverLayer + UserDatabase.layer >>> myServiceLayer >>> serverLayer object LayeredApp extends zio.ZIOAppDefault { def run = ourApp.launch.exitCode @@ -164,4 +163,60 @@ object LayeredApp extends zio.ZIOAppDefault { ``` `serverLayer` creates a `Server` from a `ZSimpleService` layer and still depends on a `UserDatabase`. Then, `ourApp` feeds a `UserDatabase.layer` into `serverLayer` to produce -a `Server` that doesn't depend on anything. In the `run` method we launch the server layer. \ No newline at end of file +a `Server` that doesn't depend on anything. In the `run` method we launch the server layer. + +## Implementing a service with dependencies + +In this scenario, your service depends on two additional services, `DepA` and `DepB`. Following [ZIO's service pattern](https://zio.dev/reference/service-pattern/), we accept the (interaces of the ) dependencies as constructor parameters. + +```scala mdoc + +trait DepA { + def methodA(param: String): ZIO[Any, Nothing, Int] +} + +object DepA { + val layer = ZLayer.succeed[DepA](new DepA { + def methodA(param: String) = ??? + }) +} + +object DepB { + val layer = ZLayer.succeed[DepB](new DepB { + def methodB(param: Float) = ??? + }) +} + +trait DepB { + def methodB(param: Float): ZIO[Any, Nothing, Double] +} + +case class MyService2(depA: DepA, depB: DepB) extends ZSimpleService[User] { + def sayHello(req: Request): ZIO[User, Status, Response] = + for { + user <- ZIO.service[User] + num1 <- depA.methodA(user.name) + num2 <- depB.methodB(12.3f) + _ <- printLine("I am here $num1 $num2!").orDie + } yield Response(s"Hello, ${user.name}") +} + +object MyService2 { + val layer: ZLayer[DepA with DepB, Nothing, ZSimpleService[RequestContext]] = + ZLayer.fromFunction { + (depA: DepA, depB: DepB) => + MyService2(depA, depB).transformContextZIO(findUser(_)) + } +} +``` + +Our service layer now depends on the `DepA` and `DepB` interfaces. A server can be created like this: + +```scala mdoc +object MyServer3 extends ServerMain { + def services = ServiceList.addFromEnvironment[ZSimpleService[RequestContext]] + .provideLayer( + (DepA.layer ++ DepB.layer) >>> MyService2.layer + ) +} +``` diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index 0db976361..0f9cc29d4 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -42,8 +42,7 @@ object BindableServiceSpec extends ZIOSpecDefault { val z1 = ServiceList.addZIO(ZIO.succeed(S1)) val z2 = ServiceList.addZIO(ZIO.succeed(S2)) val z3 = ServiceList.addZIO(ZIO.succeed(S3)) - val z8 = ServiceList.access[S1.type] - val z9 = ServiceList.addLayer(ZLayer.succeed(S3)) + val z8 = ServiceList.addService[S1.type] def spec = suite("BindableServiceSpec")( test("empty - required to make the compiler happy") { From eee8d762ce20902258fad4a73fbc5fbe4b142b4b Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 17:39:40 -0800 Subject: [PATCH 106/245] Fix tests for renames --- e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala | 2 +- e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala | 2 +- e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index 0f9cc29d4..fb58a2b2e 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -42,7 +42,7 @@ object BindableServiceSpec extends ZIOSpecDefault { val z1 = ServiceList.addZIO(ZIO.succeed(S1)) val z2 = ServiceList.addZIO(ZIO.succeed(S2)) val z3 = ServiceList.addZIO(ZIO.succeed(S3)) - val z8 = ServiceList.addService[S1.type] + val z8 = ServiceList.addFromEnvironment[S1.type] def spec = suite("BindableServiceSpec")( test("empty - required to make the compiler happy") { diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 15fd9f558..975c1e941 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -76,7 +76,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { val serviceLayer = ZLayer.succeed(ServiceWithConsole.transformContextZIO(parseUser(_))) val serverLayer: ZLayer[ZTestService[RequestContext], Throwable, Server] = - ServerLayer.access[ZTestService[RequestContext]](ServerBuilder.forPort(0)) + ServerLayer.fromEnvironment[ZTestService[RequestContext]](ServerBuilder.forPort(0)) override def clientLayer( userName: Option[String] diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 2a7b1536a..81ae62014 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -14,7 +14,7 @@ import zio.test._ object TestServiceSpec extends ZIOSpecDefault { val serverLayer: ZLayer[TestServiceImpl, Throwable, Server] = - ServerLayer.access[TestServiceImpl.Service](ServerBuilder.forPort(0)) + ServerLayer.fromEnvironment[TestServiceImpl.Service](ServerBuilder.forPort(0)) val clientLayer: ZLayer[Server, Nothing, TestServiceClient] = ZLayer.scoped[Server] { From 1b634303bef7a188281e529f7c78ea4660e381b1 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 17:46:00 -0800 Subject: [PATCH 107/245] Fix tests for renames --- e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala index ca91a0562..69e497683 100644 --- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala +++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -12,7 +12,7 @@ import io.grpc.inprocess.InProcessChannelBuilder object BackpressureSpec extends ZIOSpecDefault { val server = - ServerLayer.access[ZioTestservice.TestService](InProcessServerBuilder.forName("backpressure-test").directExecutor()) + ServerLayer.fromEnvironment[ZioTestservice.TestService](InProcessServerBuilder.forName("backpressure-test").directExecutor()) val client = ZLayer.scoped[Server] { From 48fc115c57285cc8a56f9a3b5f9e80427747064f Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 14:48:36 -0800 Subject: [PATCH 108/245] Update examples to 0.6.0-test7 --- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 33 ++----- .../scala/ExampleServerWithMetadata.scala | 94 ++++++++++++++----- .../webapp/src/main/scala/WebappMain.scala | 2 +- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/GreeterWithDatabase.scala | 25 ++--- .../helloworld/HelloWorldClientMetadata.scala | 4 +- .../helloworld/HelloWorldServer.scala | 2 +- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideServer.scala | 2 +- 10 files changed, 99 insertions(+), 69 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 36776ef84..864d9cb27 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test2" +val zioGrpcVersion = "0.6.0-test7" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index 917095a2e..8e5296e93 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -7,20 +7,18 @@ import zio.stream.{Stream, ZStream} import io.grpc.ServerBuilder import io.grpc.Status import zio._ -import zio.stream.ZSink -import scalapb.zio_grpc.Server -import scalapb.zio_grpc.ServerLayer +import scalapb.zio_grpc.{ServerMain, ServiceList} import zio.Console.{print, printLine} object GreeterService { - class LiveService(clock: Clock) extends Greeter { + object LiveService extends Greeter { def greet(req: Request): IO[Status, Response] = - clock.sleep(300.millis).as(Response(resp = "hello " + req.name)) + Clock.sleep(300.millis).as(Response(resp = "hello " + req.name)) def points( request: Request ): Stream[Status, Point] = - (ZStream(Point(3, 4)) + ZStream(Point(3, 4)) .schedule(Schedule.spaced(1000.millis)) .forever .take(5) ++ @@ -28,7 +26,7 @@ object GreeterService { Status.INTERNAL .withDescription("There was an error!") .withCause(new RuntimeException) - )).provideEnvironment(ZEnvironment(clock)) + ) def bidi( request: Stream[Status, Point] @@ -36,25 +34,8 @@ object GreeterService { request.grouped(3).map(r => Response(r.toString())) } } - - val live: ZLayer[Clock, Nothing, Greeter] = - ZLayer.fromFunction(new LiveService(_)) } -object ExampleServer extends ZIOAppDefault { - def serverWait: ZIO[Any, Throwable, Unit] = - for { - _ <- printLine("Server is running. Press Ctrl-C to stop.") - _ <- (print(".") *> ZIO.sleep(1.second)).forever - } yield () - - def serverLive(port: Int): Layer[Throwable, Server] = - Clock.live >>> GreeterService.live >>> ServerLayer.access[Greeter]( - ServerBuilder.forPort(port) - ) - - def run = myAppLogic.exitCode - - val myAppLogic = - serverWait.provideLayer(serverLive(9090)) +object ExampleServer extends ServerMain { + def services = ServiceList.add(GreeterService.LiveService) } diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 76a604796..dd79d82c7 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -13,15 +13,52 @@ import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.RequestContext import scalapb.zio_grpc.ServerLayer +case class User(name: String) + +// UserRepo service, used to resolve the user id that is provided to us +// by looking into a user database. +trait UserRepo { + def findUser(name: String): ZIO[Any, Status, User] +} + +// This is our "real" implementation of the service. +case class UserRepoImpl() extends UserRepo { + def findUser(name: String): ZIO[Any, Status, User] = name match { + case "john" => ZIO.succeed(User("John")) + case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + } +} + +object UserRepo { + val layer = ZLayer.succeed(UserRepoImpl()) +} + +// GreetingsRepo is a service that returns an appropriate greeting to +// any given user. +trait GreetingsRepo { + def greetingForUser(user: User): ZIO[Any, Status, String] +} + +// An implementation of the service. +case class GreetingsRepoImpl() extends GreetingsRepo { + def greetingForUser(user: User): ZIO[Any, Status, String] = + ZIO.succeed("Hello ${user.name}") +} + +object GreetingsRepo { + val layer = ZLayer.succeed(GreetingsRepoImpl()) +} + object GreeterServiceWithMetadata { - case class User(name: String) - // Each request gets a User as a context parameter. - class LiveService(clock: Clock) extends ZGreeter[Any, User] { + // Each request gets a User as a context parameter. The service itself + // depends on a GreetingsRepo service. + case class GreeterImpl(greetingsRepo: GreetingsRepo) extends ZGreeter[User] { def greet(req: Request): ZIO[User, Status, Response] = for { - name <- ZIO.service[User].map(_.name) - } yield Response(s"Hello ${name}, req: ${req}") + user <- ZIO.service[User] + greeting <- greetingsRepo.greetingForUser(user) + } yield Response(s"${greeting}, req: ${req}") def points(request: Request): Stream[Status, Point] = ??? @@ -33,17 +70,23 @@ object GreeterServiceWithMetadata { val UserKey = Metadata.Key.of("user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) - // Imagine this resolves an authenticated User instance from the Metadata. - def findUser(rc: RequestContext): IO[Status, User] = - rc.metadata.get(UserKey).flatMap { - case Some(name) => ZIO.succeed(User(name)) - case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) - } - - val live: ZLayer[Clock, Nothing, ZGreeter[Any, RequestContext]] = - ZLayer.fromFunction { c: Clock => - new LiveService(c).transformContextM(findUser(_)) - } + // Fetches the user-key from the request's metadata and looks it up in the UserRepo. + // We trust here that the user is who they claim to be... + def findUser(userRepo: UserRepo, rc: RequestContext): IO[Status, User] = + for { + name <- rc.metadata + .get(UserKey) + .someOrFail( + Status.UNAUTHENTICATED.withDescription("No user-key header provided") + ) + user <- userRepo.findUser(name) + } yield user + + val layer + : ZLayer[UserRepo with GreetingsRepo, Nothing, ZGreeter[RequestContext]] = + ZLayer.fromFunction((userRepo: UserRepo, greetingsRepo: GreetingsRepo) => + GreeterImpl(greetingsRepo).transformContextZIO(findUser(userRepo, _)) + ) } object ExampleServerWithMetadata extends ZIOAppDefault { @@ -54,13 +97,18 @@ object ExampleServerWithMetadata extends ZIOAppDefault { _ <- (print(".") *> ZIO.sleep(1.second)).forever } yield () - def serverLive(port: Int): Layer[Throwable, Server] = - ServerLayer.fromServiceLayer( - ServerBuilder.forPort(port) - )(Clock.live >>> GreeterServiceWithMetadata.live) - - def run = myAppLogic.exitCode + def serverLive( + port: Int + ): ZLayer[UserRepo with GreetingsRepo, Throwable, Server] = + ServerLayer.fromServiceLayer(ServerBuilder.forPort(port))( + GreeterServiceWithMetadata.layer + ) val myAppLogic = - serverWait.provideLayer(serverLive(8080)) + serverWait.provideLayer( + (UserRepo.layer ++ GreetingsRepo.layer) >>> + serverLive(8080) + ) + + def run = myAppLogic.exitCode } diff --git a/examples/fullapp/webapp/src/main/scala/WebappMain.scala b/examples/fullapp/webapp/src/main/scala/WebappMain.scala index f766cd669..e26bbe817 100644 --- a/examples/fullapp/webapp/src/main/scala/WebappMain.scala +++ b/examples/fullapp/webapp/src/main/scala/WebappMain.scala @@ -26,7 +26,7 @@ object WebappMain extends ZIOAppDefault { }) def run = - (appLogic.provideLayer(zio.Console.live ++ clientLayer).ignore *> printLine( + (appLogic.provideLayer(clientLayer).ignore *> printLine( "Done" )).exitCode } diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 2e5ec72f8..e1f532d77 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test3" +val zioGrpcVersion = "0.6.0-test7" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index a94673a27..d37057eca 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -1,12 +1,13 @@ package zio_grpc.examples.helloworld import io.grpc.Status +import scalapb.zio_grpc.Server import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList import zio._ import zio.Console._ -import io.grpc.examples.helloworld.helloworld.ZioHelloworld.RGreeter +import io.grpc.examples.helloworld.helloworld.ZioHelloworld.Greeter import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} import zio_grpc.examples.helloworld.userdatabase.UserDatabase import scalapb.zio_grpc.ServerLayer @@ -17,33 +18,33 @@ package object userdatabase { } object UserDatabase { - // accessor - def fetchUser(name: String): ZIO[UserDatabase, Status, User] = - ZIO.serviceWithZIO[UserDatabase](_.fetchUser(name)) - - val live = ZLayer.succeed(new UserDatabase { + val layer = ZLayer.succeed(new UserDatabase { def fetchUser(name: String): IO[Status, User] = ZIO.succeed(User(name)) }) } } -object GreeterWithDatabase extends RGreeter[UserDatabase] { +class GreeterWithDatabase(database: UserDatabase) extends Greeter { def sayHello( request: HelloRequest - ): ZIO[UserDatabase, Status, HelloReply] = - UserDatabase.fetchUser(request.name).map { user => + ): ZIO[Any, Status, HelloReply] = + database.fetchUser(request.name).map { user => HelloReply(s"Hello ${user.name}") } } +object GreeterWithDatabase { + val layer: ZLayer[UserDatabase, Nothing, Greeter] = ZLayer.fromFunction(new GreeterWithDatabase(_)) +} + object GreeterWithDatabaseServer extends zio.ZIOAppDefault { val serverLayer = ServerLayer.fromServiceLayer( io.grpc.ServerBuilder.forPort(9090) - )(GreeterWithDatabase.toLayer) + )(GreeterWithDatabase.layer) - val ourApp = UserDatabase.live >>> serverLayer + val ourApp = UserDatabase.layer >>> serverLayer def run = (ourApp.build *> ZIO.never).exitCode -} +} \ No newline at end of file diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index 92010a790..cc30bdb0b 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -38,7 +38,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { // Option 1: through layer and accessors val clientLayer = GreeterClient.live(channel, headers = userEnvToMetadata) - type UserClient = GreeterClient.ZService[Any, User] + type UserClient = GreeterClient.ZService[User] // The default accessors expect the client type that has no context. We need // to set up accessors for the User context @@ -67,7 +67,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { // Option 2: through a managed client val userClientManaged - : ZIO[Scope, Throwable, GreeterClient.ZService[Any, User]] = + : ZIO[Scope, Throwable, GreeterClient.ZService[User]] = GreeterClient.scoped(channel, headers = userEnvToMetadata) def appLogic2 = diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala index 1cfecd274..37ef6da39 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala @@ -9,7 +9,7 @@ import zio.Console._ import io.grpc.examples.helloworld.helloworld.ZioHelloworld.ZGreeter import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} -object GreeterImpl extends ZGreeter[Any, Any] { +object GreeterImpl extends ZGreeter[Any] { def sayHello( request: HelloRequest ): ZIO[Any, Status, HelloReply] = diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 2e5ec72f8..e1f532d77 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test3" +val zioGrpcVersion = "0.6.0-test7" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index 2f12bf8b0..bb16c8068 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -15,7 +15,7 @@ import zio.UIO class RouteGuideService( features: Seq[Feature], routeNotesRef: Ref[Map[Point, List[RouteNote]]] -) extends ZioRouteGuide.ZRouteGuide[Any, Any] { +) extends ZioRouteGuide.ZRouteGuide[Any] { /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the * requested [[Point]]. If no feature at that location exists, a NOT FOUND From b3d659587c09e5ac522957869764bdb5cce93555 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 20:06:59 -0800 Subject: [PATCH 109/245] Fix formatting --- .../zio_grpc/examples/helloworld/GreeterWithDatabase.scala | 5 +++-- .../examples/helloworld/HelloWorldClientMetadata.scala | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index d37057eca..fd5a71ed7 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -35,7 +35,8 @@ class GreeterWithDatabase(database: UserDatabase) extends Greeter { } object GreeterWithDatabase { - val layer: ZLayer[UserDatabase, Nothing, Greeter] = ZLayer.fromFunction(new GreeterWithDatabase(_)) + val layer: ZLayer[UserDatabase, Nothing, Greeter] = + ZLayer.fromFunction(new GreeterWithDatabase(_)) } object GreeterWithDatabaseServer extends zio.ZIOAppDefault { @@ -47,4 +48,4 @@ object GreeterWithDatabaseServer extends zio.ZIOAppDefault { def run = (ourApp.build *> ZIO.never).exitCode -} \ No newline at end of file +} diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index cc30bdb0b..c1fef1d75 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -66,8 +66,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { } yield () // Option 2: through a managed client - val userClientManaged - : ZIO[Scope, Throwable, GreeterClient.ZService[User]] = + val userClientManaged: ZIO[Scope, Throwable, GreeterClient.ZService[User]] = GreeterClient.scoped(channel, headers = userEnvToMetadata) def appLogic2 = From bac061049bc06828b90378c2bf931614debaaca2 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 31 Dec 2022 20:11:24 -0800 Subject: [PATCH 110/245] Fix tutorial to include sayHelloAgain in the other implementation. Fixes #462 --- docs/quickstart.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/quickstart.md b/docs/quickstart.md index 987f9bfb1..62ac68940 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -101,6 +101,13 @@ def sayHelloAgain(request: HelloRequest) = ZIO.succeed(HelloReply(s"Hello again, ${request.name}")) ``` +The example project includes another implementation of this service which you will need to change in order for the project to compile. Open `src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala` and add the same method to the `GreeterWithDatabase` class: + +```scala +def sayHelloAgain(request: HelloRequest) = + ZIO.succeed(HelloReply(s"Hello again, ${request.name}")) +``` + ### Update the client Open `src/main/scala/zio_grpc/examples/helloworld/HelloWorldClient.scala`, and update the definition of the `myAppLogic` method in `GreeterImpl`: From 5d2ebdbb231cfba6557cf433178028e225f8f610 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Thu, 19 Jan 2023 02:19:22 +0000 Subject: [PATCH 111/245] fix: significant performance drop with `stream.toQueue` (#468) --- .../src/main/protobuf/testservice.proto | 53 +++++++++++++++++ .../scala/scalapb/zio_grpc/GreeterImpl.scala | 17 ++++++ .../ServerStreamingBenchmarkApp.scala | 59 +++++++++++++++++++ build.sbt | 26 ++++++++ .../zio_grpc/server/ZServerCallHandler.scala | 31 +++++----- 5 files changed, 169 insertions(+), 17 deletions(-) create mode 100644 benchmarks/src/main/protobuf/testservice.proto create mode 100644 benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala create mode 100644 benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala diff --git a/benchmarks/src/main/protobuf/testservice.proto b/benchmarks/src/main/protobuf/testservice.proto new file mode 100644 index 000000000..224c444a5 --- /dev/null +++ b/benchmarks/src/main/protobuf/testservice.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "scalapb.zio_grpc.helloworld"; +option java_outer_classname = "HelloWorldProto"; + +package helloworld; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply) {} + + // Sends a litany of greetings + rpc SayHelloStreaming (HelloRequest) returns (stream HelloReply) {} +} + +// The actual message exchanged by the client and the server. +message Hello { + string name = 1; + double d = 2; + float f = 3; + bool b = 4; + int32 n = 5; + int64 l = 6; + oneof choice { + string c1 = 7; + bool c2 = 8; + } + message Pet { + enum Color { + BLACK = 0; + WHITE = 1; + BLUE = 2; + RED = 3; + YELLOW = 4; + GREEN = 5; + } + string name = 1; + Color color = 2; + } + repeated Pet pets = 9; +} + +// The request message from the client. +message HelloRequest { + Hello request = 1; +} + +// The response message from the server. +message HelloReply { + Hello response = 1; +} \ No newline at end of file diff --git a/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala b/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala new file mode 100644 index 000000000..c632a955c --- /dev/null +++ b/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala @@ -0,0 +1,17 @@ +package scalapb.zio_grpc + +import scalapb.zio_grpc.helloworld.testservice.ZioTestservice.ZGreeter +import scalapb.zio_grpc.helloworld.testservice.{HelloReply, HelloRequest} +import io.grpc.Status +import zio.ZIO +import zio.stream.ZStream + +class GreeterImpl(size: Long) extends ZGreeter[Any] { + + def sayHello(request: HelloRequest): ZIO[Any, Status, HelloReply] = + ZIO.succeed(HelloReply(request.request)) + + def sayHelloStreaming(request: HelloRequest): ZStream[Any, Status, HelloReply] = + ZStream.repeat(HelloReply(request.request)).take(size) + +} diff --git a/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala b/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala new file mode 100644 index 000000000..4478904ab --- /dev/null +++ b/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala @@ -0,0 +1,59 @@ +package scalapb.zio_grpc + +import io.grpc.ManagedChannelBuilder +import io.grpc.ServerBuilder +import scalapb.zio_grpc.helloworld.testservice._ +import zio._ +import java.time + +object ServerStreamingBenchmarkApp extends ZIOAppDefault { + + val size = 100000L + + val server = + ServerLayer.fromEnvironment[ZioTestservice.Greeter](ServerBuilder.forPort(50051)) + + val client = + ZLayer.scoped[Server] { + for { + ss <- ZIO.service[Server] + port <- ss.port.orDie + ch = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext() + client <- ZioTestservice.GreeterClient.scoped(ZManagedChannel(ch)).orDie + } yield client + } + + val service = + ZLayer.succeed[ZioTestservice.Greeter] { + new GreeterImpl(size) + } + + def run = ZIO + .foreach(Array(8192, 65536)) { queueSize => + val props = java.lang.System.getProperties(); + props.setProperty("zio-grpc.backpressure-queue-size", queueSize.toString()); + + for { + _ <- Console.printLine(s"Starting with queue size $queueSize") + cpt <- Ref.make(0) + start <- Clock.instant.flatMap(Ref.make(_)) + result <- ZioTestservice.GreeterClient + .sayHelloStreaming(HelloRequest(request = Some(Hello(name = "Testing streaming")))) + .tap(_ => cpt.update(_ + 1)) + .tap { _ => + for { + now <- Clock.instant + started <- start.get + _ <- ZIO.when(time.Duration.between(started, now).toSeconds() >= 10)( + start.set(now) *> cpt.get.flatMap(cpt => Console.printLine(s"Received $cpt messages")) + ) + } yield () + } + .runDrain + .timed + _ <- Console.printLine(s"queue size: $queueSize (${result._1.toMillis()}ms)") + } yield () + } + .provide(service >+> server >+> client) + +} diff --git a/build.sbt b/build.sbt index d1980675e..c2b0c95a3 100644 --- a/build.sbt +++ b/build.sbt @@ -125,6 +125,32 @@ lazy val e2e = testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") ) +lazy val benchmarks = + projectMatrix + .in(file("benchmarks")) + .dependsOn(core) + .defaultAxes() + .enablePlugins(LocalCodeGenPlugin) + .jvmPlatform(ScalaVersions) + .settings(stdSettings) + .settings( + crossScalaVersions := Seq(Scala212, Scala213), + publish / skip := true, + libraryDependencies ++= Seq( + "dev.zio" %% "zio" % Version.zio, + "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, + "io.grpc" % "grpc-netty" % Version.grpc + ), + Compile / PB.targets := Seq( + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + genModule( + "scalapb.zio_grpc.ZioCodeGenerator$" + ) -> (Compile / sourceManaged).value + ), + PB.protocVersion := "3.13.0", + codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value + ) + lazy val docs = project .enablePlugins(LocalCodeGenPlugin) .in(file("zio-grpc-docs")) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index fb9f49b93..7891d4cc0 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -11,7 +11,6 @@ import scalapb.zio_grpc.RequestContext import io.grpc.Metadata import scalapb.zio_grpc.SafeMetadata import zio.stm.TSemaphore -import zio.stream.Take class ZServerCallHandler[Req, Res]( runtime: Runtime[Any], @@ -109,31 +108,29 @@ object ZServerCallHandler { call: ZServerCall[Res], stream: ZStream[Any, Status, Res] ): ZIO[Any, Status, Unit] = { - def innerLoop(queue: Dequeue[Take[Status, Res]], buffer: Ref[Chunk[Res]]): ZIO[Any, Status, Boolean] = - buffer - .modify(chunk => chunk.headOption -> chunk.drop(1)) + def innerLoop(queue: Dequeue[Exit[Option[Status], Res]]): ZIO[Any, Status, Boolean] = + queue.take .flatMap { - case None => - queue.take.flatMap( - _.foldZIO(ZIO.succeed(false), ZIO.failCause(_), buffer.set(_) *> innerLoop(queue, buffer)) - ) - case Some(res) => - call.sendMessage(res).as(true) + case Exit.Success(res) => call.sendMessage(res).as(true) + case Exit.Failure(cause) => + cause.failureOrCause match { + case Left(Some(status)) => ZIO.fail(status) + case Left(None) => ZIO.succeed(false) + case Right(cause) => ZIO.failCause(cause) + } } .repeatWhileZIO(res => call.isReady.map(_ && res)) - def outerLoop(queue: Dequeue[Take[Status, Res]])(buffer: Ref[Chunk[Res]]): ZIO[Any, Status, Boolean] = - (call.awaitReady *> innerLoop(queue, buffer)) + def outerLoop(queue: Dequeue[Exit[Option[Status], Res]]): ZIO[Any, Status, Boolean] = + (call.awaitReady *> innerLoop(queue)) .repeatWhile(identity) for { queueSize <- backpressureQueueSize - _ <- ZIO.scoped( + _ <- ZIO.scoped[Any]( stream - .toQueue(queueSize) - .flatMap { queue => - Ref.make[Chunk[Res]](Chunk.empty).flatMap(outerLoop(queue)) - } + .toQueueOfElements(queueSize) + .flatMap(outerLoop) ) } yield () } From 44c08d432c440f41edee767a4e820ee06d754726 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 20 Jan 2023 18:09:19 -0800 Subject: [PATCH 112/245] Add example and update docs for layers See #471 --- docs/context.md | 25 ++++++++-- .../src/main/protobuf/helloworld.proto | 5 ++ .../helloworld/MultipleServices.scala | 49 +++++++++++++++++++ 3 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala diff --git a/docs/context.md b/docs/context.md index ad902e22e..81ceff5f6 100644 --- a/docs/context.md +++ b/docs/context.md @@ -155,7 +155,11 @@ val serverLayer = ) val ourApp = - UserDatabase.layer >>> myServiceLayer >>> serverLayer + ZLayer.make[Server]( + serverLayer, + myServiceLayer, + UserDatabase.layer + ) object LayeredApp extends zio.ZIOAppDefault { def run = ourApp.launch.exitCode @@ -213,10 +217,21 @@ object MyService2 { Our service layer now depends on the `DepA` and `DepB` interfaces. A server can be created like this: ```scala mdoc -object MyServer3 extends ServerMain { - def services = ServiceList.addFromEnvironment[ZSimpleService[RequestContext]] - .provideLayer( - (DepA.layer ++ DepB.layer) >>> MyService2.layer +object MyServer3 extends zio.ZIOAppDefault { + + val serverLayer = + ServerLayer.fromServiceList( + io.grpc.ServerBuilder.forPort(9000), + ServiceList.addFromEnvironment[ZSimpleService[RequestContext]] ) + + val appLayer = ZLayer.make[Server]( + serverLayer, + DepA.layer, + DepB.layer, + MyService2.layer + ) + + def run = ourApp.launch.exitCode } ``` diff --git a/examples/helloworld/src/main/protobuf/helloworld.proto b/examples/helloworld/src/main/protobuf/helloworld.proto index c60d9416f..f594f137a 100644 --- a/examples/helloworld/src/main/protobuf/helloworld.proto +++ b/examples/helloworld/src/main/protobuf/helloworld.proto @@ -26,6 +26,11 @@ service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } +service Welcomer { + // Sends a welcome message + rpc Welcome (HelloRequest) returns (HelloReply) {} +} + // The request message containing the user's name. message HelloRequest { string name = 1; diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala new file mode 100644 index 000000000..4bab86f39 --- /dev/null +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala @@ -0,0 +1,49 @@ +package zio_grpc.examples.helloworld + +import io.grpc.Status +import io.grpc.protobuf.services.ProtoReflectionService; +import scalapb.zio_grpc.Server +import scalapb.zio_grpc.ServerMain +import scalapb.zio_grpc.ServiceList +import zio._ +import zio.Console._ + +import io.grpc.examples.helloworld.helloworld.ZioHelloworld.{Welcomer, Greeter} +import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} +import zio_grpc.examples.helloworld.userdatabase.UserDatabase +import scalapb.zio_grpc.ServerLayer + +class WelcomerWithDatabase(database: UserDatabase) extends Welcomer { + def welcome( + request: HelloRequest + ): ZIO[Any, Status, HelloReply] = + database.fetchUser(request.name).map { user => + HelloReply(s"Welcome ${user.name}") + } +} + +object WelcomerWithDatabase { + val layer: ZLayer[UserDatabase, Nothing, Welcomer] = + ZLayer.fromFunction(new WelcomerWithDatabase(_)) +} + +object MultipleServices extends zio.ZIOAppDefault { + val serverLayer = ServerLayer.fromServiceList( + io.grpc.ServerBuilder + .forPort(9090) + .addService(ProtoReflectionService.newInstance()), + ServiceList + .addFromEnvironment[Welcomer] + .addFromEnvironment[Greeter] + ) + + val ourApp = ZLayer.make[Server]( + serverLayer, + UserDatabase.layer, + WelcomerWithDatabase.layer, + GreeterWithDatabase.layer + ) + + def run = + (ourApp.build *> ZIO.never).exitCode +} From 0cdbe4043fba33649fe5560c11ca20de9f288261 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Jan 2023 07:01:29 -0800 Subject: [PATCH 113/245] Bump ua-parser-js from 0.7.31 to 0.7.33 in /website (#473) Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.31 to 0.7.33. - [Release notes](https://github.com/faisalman/ua-parser-js/releases) - [Changelog](https://github.com/faisalman/ua-parser-js/blob/master/changelog.md) - [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.31...0.7.33) --- updated-dependencies: - dependency-name: ua-parser-js dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index d38165f3c..a4a525658 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -8157,9 +8157,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" 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== + version "0.7.33" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532" + integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw== unherit@^1.0.4: version "1.1.3" From 51216d6769f310be38863e38d3f9153578422421 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 29 Jan 2023 23:32:04 +0100 Subject: [PATCH 114/245] Update mdoc, sbt-mdoc to 2.3.7 (#475) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 29171cd55..0d1ca180e 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1") addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.6") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.7") addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.0") From c386a729e6a8d619f25e69353571db559450c081 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:10:20 +0100 Subject: [PATCH 115/245] Update scala3-library to 3.2.2 (#476) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index c2b0c95a3..07afee6ab 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import Settings.stdSettings -val Scala3 = "3.2.1" +val Scala3 = "3.2.2" val Scala213 = "2.13.10" From f954b1d615a436b45cebe7a8b34f2e03bbe45ee6 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 4 Feb 2023 22:21:09 -0800 Subject: [PATCH 116/245] Make context as second parameter --- CHANGELOG.md | 10 +- .../scala/scalapb/zio_grpc/GreeterImpl.scala | 4 +- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 404 +++++++++--------- .../scalapb/zio_grpc/CallOptionsMethods.scala | 18 - .../scalapb/zio_grpc/ClientMethods.scala | 35 ++ .../zio_grpc/TransformableService.scala | 43 -- .../scalapb/zio_grpc/ZBindableService.scala | 14 +- .../scalapb/zio_grpc/ZGeneratedService.scala | 24 +- .../scala/scalapb/zio_grpc/ZTransform.scala | 57 --- .../scala/scalapb/zio_grpc/transforms.scala | 62 +++ .../zio_grpc/server/ZServerCallHandler.scala | 8 +- .../zio_grpc/server/ZServerCallHandler.scala | 19 +- docs/context.md | 10 +- docs/deadlines.md | 7 +- docs/decorating.md | 28 +- docs/generated-code.md | 20 +- .../zio_grpc/BindableServiceSpec.scala | 18 +- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 63 ++- .../scalapb/zio_grpc/MetadataTests.scala | 10 +- .../scalapb/zio_grpc/TestServiceImpl.scala | 4 +- 20 files changed, 427 insertions(+), 431 deletions(-) delete mode 100644 core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala create mode 100644 core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala delete mode 100644 core/src/main/scala/scalapb/zio_grpc/TransformableService.scala delete mode 100644 core/src/main/scala/scalapb/zio_grpc/ZTransform.scala create mode 100644 core/src/main/scala/scalapb/zio_grpc/transforms.scala diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b8b3a054..c8d5ca59a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,14 @@ ### What changed? * Removed the `R` type parameter for generated services. Generated services now have a single - type parameter for context. This simplifies the previous APIs and encourages the style that - service dependencies are passed via constructors (see [service pattern](https://zio.dev/reference/service-pattern/)) + type parameter for context. This simplifies the previous APIs and encourages the ZIO 2 + style that service dependencies are passed via constructors (see [service pattern](https://zio.dev/reference/service-pattern/)) +* Context is now received as a second parameter for each handler. For + convenience, there is a trait that only takes one parameter (the request + type). +* Simplified ZTransform. Introduce Transform for effectful transformations for + services that do not have context. +* Classes and methods with suffix ClientWithMetadata have been renamed to ClientWithResponseMetadata. * Removed the `R` type parameter in most APIs. * ManagedServer renamed to ScopedServer. * Clean shutdown when a server is ran through a Scope or ZLayer. diff --git a/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala b/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala index c632a955c..1e7ca5225 100644 --- a/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala +++ b/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala @@ -1,12 +1,12 @@ package scalapb.zio_grpc -import scalapb.zio_grpc.helloworld.testservice.ZioTestservice.ZGreeter +import scalapb.zio_grpc.helloworld.testservice.ZioTestservice.Greeter import scalapb.zio_grpc.helloworld.testservice.{HelloReply, HelloRequest} import io.grpc.Status import zio.ZIO import zio.stream.ZStream -class GreeterImpl(size: Long) extends ZGreeter[Any] { +class GreeterImpl(size: Long) extends Greeter { def sayHello(request: HelloRequest): ZIO[Any, Status, HelloReply] = ZIO.succeed(HelloReply(request.request)) diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index ca425f6b7..3bccce826 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -68,6 +68,8 @@ class ZioFilePrinter( val ZClientCall = "scalapb.zio_grpc.client.ZClientCall" val ZManagedChannel = "scalapb.zio_grpc.ZManagedChannel" val ZChannel = "scalapb.zio_grpc.ZChannel" + val ZTransform = "scalapb.zio_grpc.ZTransform" + val Transform = "scalapb.zio_grpc.Transform" val Nanos = "java.util.concurrent.TimeUnit.NANOSECONDS" val serverServiceDef = "_root_.io.grpc.ServerServiceDefinition" private val OuterObject = @@ -81,8 +83,6 @@ class ZioFilePrinter( fp.add( s"package ${file.scalaPackage.fullName}", "", - "import scala.language.implicitConversions", - "", s"object ${OuterObject.name} {" ).indent .print(file.getServices().asScala)((fp, s) => new ServicePrinter(s).print(fp)) @@ -103,10 +103,10 @@ class ZioFilePrinter( private val traitName = OuterObject / service.name private val ztraitName = OuterObject / ("Z" + service.name) - private val clientServiceName = OuterObject / (service.name + "Client") - private val clientWithMetadataServiceName = OuterObject / (service.name + "ClientWithMetadata") - private val accessorsClassName = OuterObject / (service.name + "Accessors") - private val accessorsWithMetadataClassName = OuterObject / (service.name + "WithMetadataAccessors") + private val clientServiceName = OuterObject / (service.name + "Client") + private val clientWithResponseMetadataServiceName = OuterObject / (service.name + "ClientWithResponseMetadata") + private val accessorsClassName = OuterObject / (service.name + "Accessors") + private val accessorsWithResponseMetadataClassName = OuterObject / (service.name + "WithResponseMetadataAccessors") def methodInType(method: MethodDescriptor): String = { val scalaInType = method.inputType.scalaType @@ -125,45 +125,59 @@ class ZioFilePrinter( def methodSignature( method: MethodDescriptor, - outEnvType: String + contextType: Option[String] ): String = { val reqType = methodInType(method) val scalaOutType = method.outputType.scalaType + val contextParam = contextType.fold("")(ctx => s""", context: $ctx""") s"def ${method.name}" + (method.streamType match { case StreamType.Unary => - s"(request: $reqType): ${io(scalaOutType, outEnvType)}" + s"(request: $reqType$contextParam): ${io(scalaOutType, "Any")}" case StreamType.ClientStreaming => - s"(request: $reqType): ${io(scalaOutType, outEnvType)}" + s"(request: $reqType$contextParam): ${io(scalaOutType, "Any")}" case StreamType.ServerStreaming => - s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" + s"(request: $reqType$contextParam): ${stream(scalaOutType, "Any")}" case StreamType.Bidirectional => - s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" + s"(request: $reqType$contextParam): ${stream(scalaOutType, "Any")}" }) } + def printClientMethodSignature( + outEnvType: String + )( + fp: FunctionalPrinter, + method: MethodDescriptor + ): FunctionalPrinter = + fp.add( + clientMethodSignature( + method, + outEnvType + ) + ) + def clientMethodSignature( method: MethodDescriptor, - outEnvType: String + contextType: String ): String = { val reqType = methodInType(method) val scalaOutType = method.outputType.scalaType s"def ${method.name}" + (method.streamType match { case StreamType.Unary => - s"(request: $reqType): ${io(scalaOutType, outEnvType)}" + s"(request: $reqType): ${io(scalaOutType, contextType)}" case StreamType.ClientStreaming => - s"(request: $reqType): ${io(scalaOutType, outEnvType)}" + s"(request: $reqType): ${io(scalaOutType, contextType)}" case StreamType.ServerStreaming => - s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" + s"(request: $reqType): ${stream(scalaOutType, contextType)}" case StreamType.Bidirectional => - s"(request: $reqType): ${stream(scalaOutType, outEnvType)}" + s"(request: $reqType): ${stream(scalaOutType, contextType)}" }) } - def clientWithMetadataMethodSignature( + def clientWithResponseMetadataSignature( method: MethodDescriptor, - outEnvType: String + envOutType: String ): String = { val reqType = methodInType(method) val scalaOutType = method.outputType.scalaType @@ -172,18 +186,18 @@ class ZioFilePrinter( s"def ${method.name}" + (method.streamType match { case StreamType.Unary => - s"(request: $reqType): ${io(ioOutType, outEnvType)}" + s"(request: $reqType): ${io(ioOutType, envOutType)}" case StreamType.ClientStreaming => - s"(request: $reqType): ${io(ioOutType, outEnvType)}" + s"(request: $reqType): ${io(ioOutType, envOutType)}" case StreamType.ServerStreaming => - s"(request: $reqType): ${stream(streamOutType, outEnvType)}" + s"(request: $reqType): ${stream(streamOutType, envOutType)}" case StreamType.Bidirectional => - s"(request: $reqType): ${stream(streamOutType, outEnvType)}" + s"(request: $reqType): ${stream(streamOutType, envOutType)}" }) } def printMethodSignature( - outEnvType: String + contextType: Option[String] )( fp: FunctionalPrinter, method: MethodDescriptor @@ -191,33 +205,18 @@ class ZioFilePrinter( fp.add( methodSignature( method, - outEnvType - ) - ) - - def printClientMethodSignature( - outEnvType: String - )( - fp: FunctionalPrinter, - method: MethodDescriptor - ): FunctionalPrinter = - fp.add( - clientMethodSignature( - method, - outEnvType + contextType ) ) - def printClientWithMetadataMethodSignature( - outEnvType: String - )( + def printClientWithResponseMetadataMethodSignature( fp: FunctionalPrinter, method: MethodDescriptor ): FunctionalPrinter = fp.add( - clientWithMetadataMethodSignature( + clientWithResponseMetadataSignature( method, - outEnvType + "Any" ) ) @@ -228,19 +227,19 @@ class ZioFilePrinter( val delegate = s"self.${method.name}" val newImpl = method.streamType match { case StreamType.Unary | StreamType.ClientStreaming => - s"f.effect($delegate(request))" + s"f.effect($delegate(request, _))(context)" case StreamType.ServerStreaming | StreamType.Bidirectional => - s"f.stream($delegate(request))" + s"f.stream($delegate(request, _))(context)" } fp.add( methodSignature( method, - outEnvType = "Context1" + contextType = Some("Context1") ) + " = " + newImpl ) } - def printClientWithMetadataTransform( + def printClientWithResponseMetadataTransform( fp: FunctionalPrinter, method: MethodDescriptor ): FunctionalPrinter = { @@ -256,9 +255,9 @@ class ZioFilePrinter( s"""zio.stream.ZStream.fail($Status.INTERNAL.withDescription("Transforming client-side bidi calls is not supported"))""" } fp.add( - clientWithMetadataMethodSignature( + clientWithResponseMetadataSignature( method, - outEnvType = "Context1" + "Any" ) + " = " + newImpl ) } @@ -281,64 +280,52 @@ class ZioFilePrinter( fp.add( clientMethodSignature( method, - outEnvType = "Context1" + contextType = "Any" ) + " = " + newImpl ) } - def serverTranformableService(fp: FunctionalPrinter): FunctionalPrinter = + def printZTransformMethod(fp: FunctionalPrinter): FunctionalPrinter = fp.add( - s"implicit val transformableService: scalapb.zio_grpc.TransformableService[${ztraitName.name}] = new scalapb.zio_grpc.TransformableService[${ztraitName.name}] {" + s"def transform[Context1](f: $ZTransform[Context, Context1]): ${ztraitName.fullName}[Context1] = new ${ztraitName.fullName}[Context1] {" ).indented( - _.add( - s"def transform[Context, Context1](self: ${ztraitName.name}[Context], f: scalapb.zio_grpc.ZTransform[Context, $Status, Context1]): ${ztraitName.fullName}[Context1] = new ${ztraitName.fullName}[Context1] {" - ).indented( - _.print(service.getMethods().asScala.toVector)( - printServerTransform - ) - ).add("}") + _.print(service.getMethods().asScala.toVector)( + printServerTransform + ) ).add("}") - def clientTranformableService(fp: FunctionalPrinter): FunctionalPrinter = + def printClientTransformMethod(fp: FunctionalPrinter): FunctionalPrinter = fp.add( - s"implicit val transformableService: scalapb.zio_grpc.TransformableService[ZService] = new scalapb.zio_grpc.TransformableService[ZService] {" + s"def transform(f: $Transform): ${clientServiceName.name} = new ${clientServiceName.name} {" ).indented( - _.add( - s"def transform[Context, Context1](self: ZService[Context], f: scalapb.zio_grpc.ZTransform[Context, $Status, Context1]): ZService[Context1] = new ZService[Context1] {" - ).indented( - _.print(service.getMethods().asScala.toVector)( - printClientTransform + _.print(service.getMethods().asScala.toVector)( + printClientTransform + ) + .add( + "// Returns a client that gives access to headers and trailers from server's response", + s"def withResponseMetadata: ${clientWithResponseMetadataServiceName.name} = self.withResponseMetadata.transform(f)" + ) + .add( + "// Returns a copy of the client with updated call options", + s"def mapCallOptions(cf: $CallOptions => $CallOptions): ${clientServiceName.name} = self.mapCallOptions(cf).transform(f)", + "// Returns a copy of the client with updated metadata", + s"def mapMetadataZIO(mdf: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientServiceName.name} = self.mapMetadataZIO(mdf).transform(f)" ) - .add( - "// Returns a client that gives access to headers and trailers", - s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[Context1] = self.withMetadata.transform[Context1](f)" - ) - .add( - "// Returns a copy of the service with new default metadata", - s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.mapCallOptionsZIO(cf), f)", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context1] = transform[Context, Context1](self.withMetadataZIO(headersEffect), f)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.withCallOptionsZIO(callOptions), f)" - ) - ).add("}") ).add("}") - def clientWithMetadataTranformableService(fp: FunctionalPrinter): FunctionalPrinter = + def clientWithResponseMetadataTranformMethod(fp: FunctionalPrinter): FunctionalPrinter = fp.add( - s"implicit val transformableService: scalapb.zio_grpc.TransformableService[ZService] = new scalapb.zio_grpc.TransformableService[ZService] {" + s"def transform(f: $Transform): ${clientWithResponseMetadataServiceName.name} = new ${clientWithResponseMetadataServiceName.name} {" ).indented( - _.add( - s"def transform[Context, Context1](self: ZService[Context], f: scalapb.zio_grpc.ZTransform[Context, $Status, Context1]): ZService[Context1] = new ZService[Context1] {" - ).indented( - _.print(service.getMethods().asScala.toVector)( - printClientWithMetadataTransform + _.print(service.getMethods().asScala.toVector)( + printClientWithResponseMetadataTransform + ) + .add( + "// Returns a copy of the client with updated call options", + s"def mapCallOptions(cf: $CallOptions => $CallOptions): ${clientWithResponseMetadataServiceName.name} = self.mapCallOptions(cf).transform(f)", + "// Returns a copy of the client with updated metadata", + s"def mapMetadataZIO(mdf: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientWithResponseMetadataServiceName.name} = self.mapMetadataZIO(mdf).transform(f)" ) - .add( - "// Returns a copy of the service with new default metadata", - s"def mapCallOptionsZIO(cf: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.mapCallOptionsZIO(cf), f)", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context1] = transform[Context, Context1](self.withMetadataZIO(headersEffect), f)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context1] = transform[Context, Context1](self.withCallOptionsZIO(callOptions), f)" - ) - ).add("}") ).add("}") def print(fp: FunctionalPrinter): FunctionalPrinter = @@ -348,22 +335,59 @@ class ZioFilePrinter( _.add("self =>") .print(service.getMethods().asScala.toVector)( printMethodSignature( - outEnvType = "Context" + contextType = Some("Context") ) ) + .add("") + .call(printZTransformMethod) ).add("}") + .add("") + .add( + s"trait ${traitName.name} extends scalapb.zio_grpc.GeneratedService {" + ) + .indented( + _.add("self =>") + .add(s"type WithContext[-C] = ${ztraitName.name}[C]") + .print(service.getMethods().asScala.toVector)( + printMethodSignature(contextType = None) + ) + .add("") + .add(s"override def withContext: ${ztraitName.name}[Any] = new ${ztraitName.name}[Any] {") + .indented( + _.print(service.getMethods().asScala.toVector) { (fp, method) => + ( + fp.add(s"${methodSignature(method, contextType = Some("Any"))} = self.${method.name}(request)") + ) + } + ) + .add("}") + .add(s"def transform(z: $Transform): ${ztraitName.name}[Any] = withContext.transform(z)") + .add(s"def transform[C](z: $ZTransform[Any, C]): ${ztraitName.name}[C] = withContext.transform(z)") + ) + .add("}") + .add("") + .add(s"object ${traitName.name} {") + .indented( + _.add( + s"implicit val genericBindable: scalapb.zio_grpc.GenericBindable[${traitName.fullName}] = new scalapb.zio_grpc.GenericBindable[${traitName.fullName}] {" + ) + .indented( + _.add( + s"""def bind(serviceImpl: ${traitName.fullName}): zio.UIO[$serverServiceDef] = ${ztraitName.fullName}.genericBindable.bind(serviceImpl.withContext)""" + ) + ) + .add("}") + ) + .add("}") .add( - s"type ${traitName.name} = ${ztraitName.name}[Any]", s"type RC${traitName.name} = ${ztraitName.name}[$RequestContext]" ) .add("") .add(s"object ${ztraitName.name} {") .indented( - _.call(serverTranformableService) - .add( - s"implicit def ops[C](service: ${ztraitName.fullName}[C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[${ztraitName.fullName}, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[${ztraitName.fullName}, C](service)", - s"implicit val genericBindable: scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}] = new scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}] {" - ) + _.add( + s"implicit val genericBindable: scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}[$RequestContext]] = new scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}[$RequestContext]] {" + ) .indented( _.add( s"""def bind(serviceImpl: ${ztraitName.fullName}[$RequestContext]): zio.UIO[$serverServiceDef] =""" @@ -389,162 +413,140 @@ class ZioFilePrinter( .add("}") .add("") .pipe(genClient) - .pipe(genClientWithMetadata) + .pipe(genClientWithResponseMetadata) - def genClientWithMetadata(fp: FunctionalPrinter): FunctionalPrinter = + def genClientWithResponseMetadata(fp: FunctionalPrinter): FunctionalPrinter = fp - .add( - s"type ${clientWithMetadataServiceName.name} = ${clientWithMetadataServiceName.name}.Service" - ) .add("") .add("// accessor with metadata methods") .add( - s"class ${accessorsWithMetadataClassName.name}[Context: zio.Tag](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsWithMetadataClassName.name}[Context]] {" + s"class ${accessorsWithResponseMetadataClassName.name}(callOptionsFunc: $CallOptions => $CallOptions, metadataFunc: $SafeMetadata => zio.UIO[$SafeMetadata]) extends scalapb.zio_grpc.ClientMethods[${accessorsWithResponseMetadataClassName.name}] {" ) .indented( - _.add(s"def this() = this(zio.ZIO.succeed($CallOptions.DEFAULT))") - .print(service.getMethods().asScala.toVector)(printAccessorWithMetadata) + _.add(s"def this() = this(identity, zio.ZIO.succeed(_))") + .print(service.getMethods().asScala.toVector)(printAccessorWithResponseMetadata) .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]) = new ${accessorsWithMetadataClassName.name}(callOptions.flatMap(f))" + "// Returns new instance with modified call options. See ClientMethods for more.", + s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${accessorsWithResponseMetadataClassName.name} = new ${accessorsWithResponseMetadataClassName.name}(co => f(callOptionsFunc(co)), metadataFunc)", + "// Returns new instance with modified metadata. See ClientMethods for more.", + s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${accessorsWithResponseMetadataClassName.name} = new ${accessorsWithResponseMetadataClassName.name}(callOptionsFunc, md => metadataFunc(md).flatMap(f))" ) ) .add("}") .add("") .add( - s"object ${clientWithMetadataServiceName.name} extends ${accessorsWithMetadataClassName.name}[Any](zio.ZIO.succeed($CallOptions.DEFAULT)) {" - ) - .indent - .add( - s"trait ZService[Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[Context]] {" + s"trait ${clientWithResponseMetadataServiceName.name} extends scalapb.zio_grpc.ClientMethods[${clientWithResponseMetadataServiceName.name}] {" ) .indented( - _.print(service.getMethods().asScala.toVector)( - printClientWithMetadataMethodSignature( - outEnvType = "Context" - ) - ) - .add("") - .add( - "// Returns a copy of the service with new default metadata", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context]", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context]" + _.add("self =>") + .print(service.getMethods().asScala.toVector)( + printClientWithResponseMetadataMethodSignature ) + .call(clientWithResponseMetadataTranformMethod) ) .add("}") - .add(s"type Service = ZService[Any]") - .add(s"type Accessors[Context] = ${accessorsClassName.fullName}[Context]") - .call(clientWithMetadataTranformableService) + .add("") .add( - s"implicit def ops[C](service: ZService[C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C](service)" + s"object ${clientWithResponseMetadataServiceName.name} extends ${accessorsWithResponseMetadataClassName.name} {" ) - .add("") - .add("") + .indent .add( - s"private[this] class ServiceStub[Context](channel: $ZChannel, options: zio.IO[$Status, $CallOptions], headers: zio.ZIO[Context, $Status, $SafeMetadata])" + s"private[this] class ServiceStub(channel: $ZChannel, callOptions: $CallOptions, metadata: zio.UIO[$SafeMetadata])" ) - .add(s" extends ${clientWithMetadataServiceName.name}.ZService[Context] {") + .add(s" extends ${clientWithResponseMetadataServiceName.name} {") .indented( _.print(service.getMethods().asScala.toVector)( - printClientWithMetadataImpl(envType = "Context") + printClientWithResponseMetadataImpl ) .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(channel, options.flatMap(f), headers)", - s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context] = new ServiceStub(channel, options, headersEffect)", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(channel, callOptions, headers)" + "// Returns new instance with modified call options. See ClientMethods for more.", + s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${clientWithResponseMetadataServiceName.name} = new ServiceStub(channel, f(callOptions), metadata)", + "// Returns new instance with modified metadata. See ClientMethods for more.", + s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientWithResponseMetadataServiceName.name} = new ServiceStub(channel, callOptions, metadata.flatMap(f))" ) ) .add("}") .add("") .add( - s"def scoped[Context](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithMetadataServiceName.name}.ZService[Context]] = managedChannel.map {" + s"def scoped(managedChannel: $ZManagedChannel, options: $CallOptions = $CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithResponseMetadataServiceName.name}] = managedChannel.map {" ) - .add(" channel => new ServiceStub[Context](channel, options, headers)") + .add(" channel => new ServiceStub(channel, options, metadata)") .add("}") .add("") .add( - s"def live[Context: zio.Tag](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientWithMetadataServiceName.name}.ZService[Context]] = zio.ZLayer.scoped[Any](scoped[Context](managedChannel, options, headers))" + s"def live[Context](managedChannel: $ZManagedChannel, options: $CallOptions=$CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientWithResponseMetadataServiceName.name}] = zio.ZLayer.scoped(scoped(managedChannel, options, metadata))" ) .outdent .add("}") def genClient(fp: FunctionalPrinter): FunctionalPrinter = fp - .add( - s"type ${clientServiceName.name} = ${clientServiceName.name}.Service" - ) .add("") .add("// accessor methods") .add( - s"class ${accessorsClassName.name}[Context: zio.Tag](callOptions: zio.IO[$Status, $CallOptions]) extends scalapb.zio_grpc.CallOptionsMethods[${accessorsClassName.name}[Context]] {" + s"class ${accessorsClassName.name}(callOptionsFunc: $CallOptions => $CallOptions, metadataFunc: $SafeMetadata => zio.UIO[$SafeMetadata]) extends scalapb.zio_grpc.ClientMethods[${accessorsClassName.name}] {" ) .indented( - _.add(s"def this() = this(zio.ZIO.succeed($CallOptions.DEFAULT))") + _.add(s"def this() = this(identity, zio.ZIO.succeed(_))") .print(service.getMethods().asScala.toVector)(printAccessor) .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]) = new ${accessorsClassName.name}(callOptions.flatMap(f))" + "// Returns new instance with modified call options. See ClientMethods for more.", + s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${accessorsClassName.name} = new ${accessorsClassName.name}(co => f(callOptionsFunc(co)), metadataFunc)", + "// Returns new instance with modified metadata. See ClientMethods for more.", + s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${accessorsClassName.name} = new ${accessorsClassName.name}(callOptionsFunc, md => metadataFunc(md).flatMap(f))" ) ) .add("}") .add("") .add( - s"object ${clientServiceName.name} extends ${accessorsClassName.name}[Any](zio.ZIO.succeed($CallOptions.DEFAULT)) {" - ) - .indent - .add( - s"trait ZService[Context] extends scalapb.zio_grpc.CallOptionsMethods[ZService[Context]] {" + s"trait ${clientServiceName.name} extends scalapb.zio_grpc.ClientMethods[${clientServiceName.name}] with scalapb.zio_grpc.TransformableClient[${clientServiceName.name}] {" ) .indented( - _.print(service.getMethods().asScala.toVector)( - printClientMethodSignature( - outEnvType = "Context" + _.add("self =>") + .print(service.getMethods().asScala.toVector)( + printClientMethodSignature( + outEnvType = "Any" + ) ) - ) .add("") .add( - "// Returns a client that gives access to headers and trailers", - s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[Context]" - ) - .add( - "// Returns a copy of the service with new default metadata", - s"def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context]", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context]" + "// Returns a client that gives access to headers and trailers from server's response", + s"def withResponseMetadata: ${clientWithResponseMetadataServiceName.name}" ) + .call(printClientTransformMethod) ) .add("}") - .add(s"type Service = ZService[Any]") - .add(s"type Accessors[Context] = ${accessorsClassName.fullName}[Context]") - .call(clientTranformableService) + .add("") .add( - s"implicit def ops[C](service: ZService[C]): scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C] = new scalapb.zio_grpc.TransformableService.TransformableServiceOps[ZService, C](service)" + s"object ${clientServiceName.name} extends ${accessorsClassName.name} {" ) - .add("") + .indent .add("") .add( - s"private[this] class ServiceStub[Context](underlying: ${clientWithMetadataServiceName.name}.ZService[Context])" + s"private[this] class ServiceStub(underlying: ${clientWithResponseMetadataServiceName.name})" ) - .add(s" extends ${clientServiceName.name}.ZService[Context] {") + .add(s" extends ${clientServiceName.name} {") .indented( _.print(service.getMethods().asScala.toVector)( - printClientImpl(envType = "Context") + printClientImpl(envType = "Any") ) .add( - "// Returns a client that gives access to headers and trailers", - s"def withMetadata: ${clientWithMetadataServiceName.name}.ZService[Context] = underlying" - ) - .add( - s"def mapCallOptionsZIO(f: $CallOptions => zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(underlying.mapCallOptionsZIO(f))", - s"override def withMetadataZIO(headersEffect: zio.IO[$Status, $SafeMetadata]): ZService[Context] = new ServiceStub(underlying.withMetadataZIO(headersEffect))", - s"def withCallOptionsZIO(callOptions: zio.IO[$Status, $CallOptions]): ZService[Context] = new ServiceStub(underlying.withCallOptionsZIO(callOptions))" + "// Returns a client that gives access to headers and trailers from server's response", + s"def withResponseMetadata: ${clientWithResponseMetadataServiceName.name} = underlying", + "// Returns new instance with modified call options. See ClientMethods for more.", + s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${clientServiceName.name} = new ServiceStub(underlying.mapCallOptions(f))", + "// Returns new instance with modified metadata. See ClientMethods for more.", + s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientServiceName.name} = new ServiceStub(underlying.mapMetadataZIO(f))" ) ) .add("}") .add("") .add( - s"def scoped[Context](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions] = zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}.ZService[Context]] = ${clientWithMetadataServiceName.name}.scoped(managedChannel, options, headers).map(client => new ServiceStub(client))" + s"def scoped(managedChannel: $ZManagedChannel, options: $CallOptions = $CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}] = ${clientWithResponseMetadataServiceName.name}.scoped(managedChannel, options, metadata).map(client => new ServiceStub(client))" ) .add("") .add( - s"def live[Context: zio.Tag](managedChannel: $ZManagedChannel, options: zio.IO[$Status, $CallOptions]=zio.ZIO.succeed($CallOptions.DEFAULT), headers: zio.ZIO[Context, $Status, $SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientServiceName.name}.ZService[Context]] = ${clientWithMetadataServiceName.name}.live(managedChannel, options, headers).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))" + s"def live(managedChannel: $ZManagedChannel, options: $CallOptions=$CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientServiceName.name}] = ${clientWithResponseMetadataServiceName.name}.live(managedChannel, options, metadata).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))" ) .outdent .add("}") @@ -556,48 +558,46 @@ class ZioFilePrinter( val sigWithoutContext = clientMethodSignature( method, - outEnvType = s"${clientServiceName.name}.ZService[Context] with Context" + contextType = s"${clientServiceName.name}" ) + " = " - val innerCall = s"_.withCallOptionsZIO(callOptions).${method.name}(request)" + val innerCall = s"_.mapCallOptions(callOptionsFunc).mapMetadataZIO(metadataFunc).${method.name}(request)" val clientCall = method.streamType match { case StreamType.Unary => - s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}]($innerCall)" case StreamType.ClientStreaming => - s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}]($innerCall)" case StreamType.ServerStreaming => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}]($innerCall)" case StreamType.Bidirectional => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientServiceName.name}]($innerCall)" } fp.add(sigWithoutContext + clientCall) } - def printAccessorWithMetadata( + def printAccessorWithResponseMetadata( fp: FunctionalPrinter, method: MethodDescriptor ): FunctionalPrinter = { val sigWithoutContext = - clientWithMetadataMethodSignature( + clientWithResponseMetadataSignature( method, - outEnvType = s"${clientWithMetadataServiceName.name}.ZService[Context] with Context" + envOutType = s"${clientWithResponseMetadataServiceName.name}" ) + " = " - val innerCall = s"_.withCallOptionsZIO(callOptions).${method.name}(request)" + val innerCall = s"_.mapCallOptions(callOptionsFunc).mapMetadataZIO(metadataFunc).${method.name}(request)" val clientCall = method.streamType match { case StreamType.Unary => - s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientWithResponseMetadataServiceName.name}]($innerCall)" case StreamType.ClientStreaming => - s"_root_.zio.ZIO.serviceWithZIO[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.ZIO.serviceWithZIO[${clientWithResponseMetadataServiceName.name}]($innerCall)" case StreamType.ServerStreaming => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithResponseMetadataServiceName.name}]($innerCall)" case StreamType.Bidirectional => - s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithMetadataServiceName.name}.ZService[Context]]($innerCall)" + s"_root_.zio.stream.ZStream.serviceWithStream[${clientWithResponseMetadataServiceName.name}]($innerCall)" } fp.add(sigWithoutContext + clientCall) } - def printClientWithMetadataImpl( - envType: String - )(fp: FunctionalPrinter, method: MethodDescriptor): FunctionalPrinter = { + def printClientWithResponseMetadataImpl(fp: FunctionalPrinter, method: MethodDescriptor): FunctionalPrinter = { val clientCall = method.streamType match { case StreamType.Unary => s"$ClientCalls.withMetadata.unaryCall" case StreamType.ClientStreaming => s"$ClientCalls.withMetadata.clientStreamingCall" @@ -605,21 +605,21 @@ class ZioFilePrinter( case StreamType.Bidirectional => s"$ClientCalls.withMetadata.bidiCall" } val prefix = method.streamType match { - case StreamType.Unary => s"headers.zip(options).flatMap" - case StreamType.ClientStreaming => s"headers.zip(options).flatMap" + case StreamType.Unary => s"metadata.flatMap" + case StreamType.ClientStreaming => s"metadata.flatMap" case StreamType.ServerStreaming => - s"zio.stream.ZStream.fromZIO(headers.zip(options)).flatMap" + s"zio.stream.ZStream.fromZIO(metadata).flatMap" case StreamType.Bidirectional => - s"zio.stream.ZStream.fromZIO(headers.zip(options)).flatMap" + s"zio.stream.ZStream.fromZIO(metadata).flatMap" } fp.add( - clientWithMetadataMethodSignature( + clientWithResponseMetadataSignature( method, - outEnvType = envType - ) + s" = $prefix { case (headers, options) => $clientCall(" + envOutType = "Any" + ) + s" = $prefix { headers => $clientCall(" ).indent .add( - s"channel, ${method.grpcDescriptor.fullName}, options," + s"channel, ${method.grpcDescriptor.fullName}, callOptions," ) .add(s"headers,") .add(s"request") @@ -640,7 +640,7 @@ class ZioFilePrinter( fp.add( clientMethodSignature( method, - outEnvType = envType + contextType = envType ) + s" = underlying.${method.name}(request)$suffix" ) } @@ -664,7 +664,7 @@ class ZioFilePrinter( s"${method.grpcDescriptor.fullName}," ) .add( - s"$CH.$serverCall(runtime, (t: ${methodInType(method)})=>serviceImpl.${method.name}(t))" + s"$CH.$serverCall(runtime, serviceImpl.${method.name}(_, _))" ) .outdent .add(")") diff --git a/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala b/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala deleted file mode 100644 index 151f002d6..000000000 --- a/core/src/main/scala/scalapb/zio_grpc/CallOptionsMethods.scala +++ /dev/null @@ -1,18 +0,0 @@ -package scalapb.zio_grpc - -import io.grpc.CallOptions -import io.grpc.Status -import java.util.concurrent.TimeUnit -import zio.ZIO -import zio.Duration -import io.grpc.Deadline - -trait CallOptionsMethods[Repr] { - def mapCallOptionsZIO(f: CallOptions => zio.IO[Status, CallOptions]): Repr - - def withCallOptions(callOptions: CallOptions): Repr = mapCallOptionsZIO(_ => ZIO.succeed(callOptions)) - def withDeadline(deadline: Deadline): Repr = mapCallOptionsZIO(co => ZIO.succeed(co.withDeadline(deadline))) - def withTimeout(duration: Duration): Repr = - mapCallOptionsZIO(co => ZIO.succeed(co.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))) - def withTimeoutMillis(millis: Long): Repr = withTimeout(Duration.fromMillis(millis)) -} diff --git a/core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala b/core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala new file mode 100644 index 000000000..37cc7f339 --- /dev/null +++ b/core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala @@ -0,0 +1,35 @@ +package scalapb.zio_grpc + +import io.grpc.CallOptions +import java.util.concurrent.TimeUnit +import zio.Duration +import zio.UIO +import io.grpc.Deadline + +trait ClientMethods[Repr] { + // Returns new instance with modified call options + def mapCallOptions(f: CallOptions => CallOptions): Repr + + // Returns new instance with modified metadata + def mapMetadataZIO(f: SafeMetadata => UIO[SafeMetadata]): Repr + + // Returns new instance with the metadata set to the one provide + def withMetadataZIO(metadata: UIO[SafeMetadata]): Repr = mapMetadataZIO(_ => metadata) + + // Returns new instance with the call options set to the one provide + def withCallOptions(callOptions: CallOptions): Repr = mapCallOptions(_ => callOptions) + + // Updates the deadline on the existing call options (results in new copy of CallOptions) + def withDeadline(deadline: Deadline): Repr = mapCallOptions(_.withDeadline(deadline)) + + // Updates the timeout on the existing call options (results in new copy of CallOptions) + def withTimeout(duration: Duration): Repr = + mapCallOptions(_.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS)) + + // Updates the timeout on the existing call options (results in new copy of CallOptions) + def withTimeoutMillis(millis: Long): Repr = withTimeout(Duration.fromMillis(millis)) +} + +trait TransformableClient[Repr] { + def transform(t: Transform): Repr +} diff --git a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala b/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala deleted file mode 100644 index e7782c77b..000000000 --- a/core/src/main/scala/scalapb/zio_grpc/TransformableService.scala +++ /dev/null @@ -1,43 +0,0 @@ -package scalapb.zio_grpc - -import io.grpc.Status - -import zio.{IO, Tag, ZIO, ZLayer} -import zio.ULayer - -trait TransformableService[S[_]] { - def transform[ContextIn, ContextOut]( - instance: S[ContextIn], - transform: ZTransform[ContextIn, Status, ContextOut] - ): S[ContextOut] - - def transformContextZIO[FromContext: Tag, ToContext: Tag]( - s: S[FromContext], - f: ToContext => IO[Status, FromContext] - ): S[ToContext] = - transform[FromContext, ToContext](s, ZTransform.transformContext[FromContext, Status, ToContext](f)) - - def transformContext[FromContext: Tag, ToContext: Tag]( - s: S[FromContext], - f: ToContext => FromContext - ): S[ToContext] = - transformContextZIO[FromContext, ToContext](s, (hc2: ToContext) => ZIO.succeed(f(hc2))) -} - -object TransformableService { - def apply[S[_]](implicit ts: TransformableService[S]) = ts - - final class TransformableServiceOps[S[_], C](private val service: S[C]) extends AnyVal { - def transform[ContextOut]( - transform: ZTransform[C, Status, ContextOut] - )(implicit TS: TransformableService[S]): S[ContextOut] = - TS.transform[C, ContextOut](service, transform) - - def transformContextZIO[C2: Tag]( - f: C2 => IO[Status, C] - )(implicit TS: TransformableService[S], cTagged: Tag[C]): S[C2] = - TS.transformContextZIO[C, C2](service, f) - - def toLayer(implicit tag: Tag[S[C]]): ULayer[S[C]] = ZLayer.succeed(service) - } -} diff --git a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala index a582c6400..c0bcc9f1e 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala @@ -30,16 +30,22 @@ object ZBindableService { )(implicit bs: ZBindableService[S]): UIO[ServerServiceDefinition] = bs.bindService(serviceImpl) - implicit def fromZGeneratedService1[C, S[-_], T](implicit + implicit def fromZGeneratedService[C, S[-_], T](implicit ev1: T <:< ZGeneratedService[C, S], ev2: T <:< S[C], - ev3: GenericBindable[S], + ev3: GenericBindable[S[RequestContext]], ev4: CanBind[C], - ev5: TransformableService[S], ev6: Tag[C] ): ZBindableService[T] = new ZBindableService[T] { def bindService(s: T): zio.UIO[ServerServiceDefinition] = - ev3.bind(ev5.transformContext(s, ev4.bind(_))) + ev3.bind(s.transformContext[RequestContext](ev4.bind(_))) + } + + implicit def fromGeneratedService[T <: GeneratedService](implicit + ev: GenericBindable[T] + ): ZBindableService[T] = + new ZBindableService[T] { + def bindService(serviceImpl: T): UIO[ServerServiceDefinition] = ev.bind(serviceImpl) } } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala index a16e108d8..327ff5f8f 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala @@ -1,12 +1,32 @@ package scalapb.zio_grpc import zio.UIO +import zio.IO import io.grpc.ServerServiceDefinition +import io.grpc.Status trait ZGeneratedService[-C, S[-_]] { this: S[C] => + + def transform[COut](zt: ZTransform[C, COut]): S[COut] + + def transform(t: Transform): S[C] = transform[C](t.toZTransform[C]) + + def transformContextZIO[ContextOut](f: ContextOut => IO[Status, C]): S[ContextOut] = transform(ZTransform(f)) + + def transformContext[ContextOut](f: ContextOut => C): S[ContextOut] = transformContextZIO(c => zio.ZIO.succeed(f(c))) +} + +trait GeneratedService { + type WithContext[-_] + + def withContext: WithContext[Any] + + def transform(t: Transform): WithContext[Any] + + def transform[C](zt: ZTransform[Any, C]): WithContext[C] } -trait GenericBindable[S[_]] { - def bind(s: S[RequestContext]): UIO[ServerServiceDefinition] +trait GenericBindable[-S] { + def bind(s: S): UIO[ServerServiceDefinition] } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala b/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala deleted file mode 100644 index 032858c88..000000000 --- a/core/src/main/scala/scalapb/zio_grpc/ZTransform.scala +++ /dev/null @@ -1,57 +0,0 @@ -package scalapb.zio_grpc - -import zio.{IO, Tag, ZEnvironment, ZIO} -import zio.stream.ZStream - -/** Describes a transformation of an effect or a stream. - * - * Instances of this class can be used to apply a transformation to all methods of a service to generate a new - * "decorated" service. This can be used for pre- or post-processing of requests/responses and also for environment and - * context transformations. - */ -trait ZTransform[+ContextIn, E, -ContextOut] { self => - def effect[A](io: ZIO[ContextIn, E, A]): ZIO[ContextOut, E, A] - def stream[A](io: ZStream[ContextIn, E, A]): ZStream[ContextOut, E, A] - - /** Combine two ZTransforms - */ - def andThen[ContextIn2 <: ContextOut, ContextOut2]( - zt: ZTransform[ContextIn2, E, ContextOut2] - ): ZTransform[ContextIn, E, ContextOut2] = - new ZTransform[ContextIn, E, ContextOut2] { - override def effect[A](io: ZIO[ContextIn, E, A]): ZIO[ContextOut2, E, A] = - zt.effect(self.effect(io)) - - override def stream[A](io: ZStream[ContextIn, E, A]): ZStream[ContextOut2, E, A] = - zt.stream(self.stream(io)) - } -} - -object ZTransform { - - /** Changes the Context type of the service from Context1 to Context2, by applying an effectful function on the - * environment before the request is further processed. - */ - def transformContext[ContextIn: Tag, E, ContextOut: Tag]( - f: ContextOut => IO[E, ContextIn] - ): ZTransform[ContextIn, E, ContextOut] = - new ZTransform[ContextIn, E, ContextOut] { - def effect[A](io: ZIO[ContextIn, E, A]): ZIO[ContextOut, E, A] = - ZIO - .environmentWithZIO { (env: ZEnvironment[ContextOut]) => - f(env.get[ContextOut]) - } - .flatMap { env => - io.provideEnvironment(ZEnvironment(env)) - } - - def stream[A](io: ZStream[ContextIn, E, A]): ZStream[ContextOut, E, A] = - ZStream - .fromZIO(ZIO.environmentWithZIO { (env: ZEnvironment[ContextOut]) => - f(env.get[ContextOut]) - }) - .flatMap { env => - io.provideEnvironment(ZEnvironment(env)) - } - } -} diff --git a/core/src/main/scala/scalapb/zio_grpc/transforms.scala b/core/src/main/scala/scalapb/zio_grpc/transforms.scala new file mode 100644 index 000000000..d3471d971 --- /dev/null +++ b/core/src/main/scala/scalapb/zio_grpc/transforms.scala @@ -0,0 +1,62 @@ +package scalapb.zio_grpc + +import zio.ZIO +import zio.stream.ZStream +import io.grpc.Status + +/** Describes a transformation for all effects and streams of a service. + * + * Instances of this class can be used to apply a transformation to all methods of a service to generate a new + * "decorated" service. This can be used for pre- or post-processing of requests/response. + */ +trait Transform { + self => + def effect[A](io: ZIO[Any, Status, A]): ZIO[Any, Status, A] + def stream[A](io: ZStream[Any, Status, A]): ZStream[Any, Status, A] + + // Converts this Transform to ZTransform that transforms the effects like this, but + // leaves the Context unchanged. + def toZTransform[Context]: ZTransform[Context, Context] = new ZTransform[Context, Context] { + def effect[A](io: Context => ZIO[Any, Status, A]): Context => ZIO[Any, Status, A] = { c => + self.effect(io(c)) + } + + def stream[A](io: Context => ZStream[Any, Status, A]): Context => ZStream[Any, Status, A] = { c => + self.stream(io(c)) + } + } +} + +object Transform { + def fromZTransform(ct: ZTransform[Any, Any]) = new Transform { + def effect[A](io: ZIO[Any, Status, A]): ZIO[Any, Status, A] = ct.effect(_ => io)(()) + + def stream[A](io: ZStream[Any, Status, A]): ZStream[Any, Status, A] = ct.stream(_ => io)(()) + } +} + +/** Describes a transformation for all effects and streams of a service that has context. + * + * Instances of this class can be used to apply a transformation to all methods of a service to generate a new + * "decorated" service. This can be used for pre- or post-processing of requests/response or to transform the context. + */ +trait ZTransform[+ContextIn, -ContextOut] { + def effect[A](io: ContextIn => ZIO[Any, Status, A]): (ContextOut => ZIO[Any, Status, A]) + def stream[A](io: ContextIn => ZStream[Any, Status, A]): (ContextOut => ZStream[Any, Status, A]) +} + +object ZTransform { + // Returns a ZTransform that effectfully transforms the context parameter + def apply[ContextIn, ContextOut](f: ContextOut => ZIO[Any, Status, ContextIn]): ZTransform[ContextIn, ContextOut] = + new ZTransform[ContextIn, ContextOut] { + def effect[A](io: ContextIn => ZIO[Any, Status, A]): ContextOut => ZIO[Any, Status, A] = { + (context: ContextOut) => + f(context).flatMap(io) + } + + def stream[A](io: ContextIn => ZStream[Any, Status, A]): ContextOut => ZStream[Any, Status, A] = { + (context: ContextOut) => + ZStream.fromZIO(f(context)).flatMap(io) + } + } +} diff --git a/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala index 48ed27eeb..488a4d16f 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -12,21 +12,21 @@ trait ServerCallHandler[Req, Res] object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZIO[RequestContext, Status, Res] + impl: (Req, RequestContext) => ZIO[Any, Status, Res] ): ServerCallHandler[Req, Res] = ??? def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZStream[RequestContext, Status, Res] + impl: (Req, RequestContext) => ZStream[Any, Status, Res] ): ServerCallHandler[Req, Res] = ??? def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZIO[RequestContext, Status, Res] + impl: (Stream[Status, Req], RequestContext) => ZIO[Any, Status, Res] ): ServerCallHandler[Req, Res] = ??? def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZStream[RequestContext, Status, Res] + impl: (Stream[Status, Req], RequestContext) => ZStream[Any, Status, Res] ): ServerCallHandler[Req, Res] = ??? } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 7891d4cc0..08c6f625f 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -66,42 +66,39 @@ object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZIO[RequestContext, Status, Res] + impl: (Req, RequestContext) => ZIO[Any, Status, Res] ): ServerCallHandler[Req, Res] = unaryInput[Req, Res]( runtime, - (req, requestContext, call) => - impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) + (req, requestContext, call) => impl(req, requestContext).flatMap[Any, Status, Unit](call.sendMessage) ) def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Req => ZStream[RequestContext, Status, Res] + impl: (Req, RequestContext) => ZStream[Any, Status, Res] ): ServerCallHandler[Req, Res] = unaryInput[Req, Res]( runtime, (req: Req, requestContext: RequestContext, call: ZServerCall[Res]) => - serverStreamingWithBackpressure(call, impl(req).provideEnvironment(ZEnvironment(requestContext))) + serverStreamingWithBackpressure(call, impl(req, requestContext)) ) def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZIO[RequestContext, Status, Res] + impl: (Stream[Status, Req], RequestContext) => ZIO[Any, Status, Res] ): ServerCallHandler[Req, Res] = streamingInput[Req, Res]( runtime, - (req, requestContext, call) => - impl(req).provideEnvironment(ZEnvironment(requestContext)).flatMap[Any, Status, Unit](call.sendMessage) + (req, requestContext, call) => impl(req, requestContext).flatMap[Any, Status, Unit](call.sendMessage) ) def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: Stream[Status, Req] => ZStream[RequestContext, Status, Res] + impl: (Stream[Status, Req], RequestContext) => ZStream[Any, Status, Res] ): ServerCallHandler[Req, Res] = streamingInput[Req, Res]( runtime, - (req, requestContext, call) => - serverStreamingWithBackpressure(call, impl(req).provideEnvironment(ZEnvironment(requestContext))) + (req, requestContext, call) => serverStreamingWithBackpressure(call, impl(req, requestContext)) ) def serverStreamingWithBackpressure[Res]( diff --git a/docs/context.md b/docs/context.md index 81ceff5f6..ceaca33a6 100644 --- a/docs/context.md +++ b/docs/context.md @@ -21,16 +21,13 @@ import io.grpc.Status case class User(name: String) object MyService extends ZSimpleService[User] { - def sayHello(req: Request): ZIO[User, Status, Response] = + def sayHello(req: Request, user: User): ZIO[Any, Status, Response] = for { - user <- ZIO.service[User] _ <- printLine("I am here!").orDie } yield Response(s"Hello, ${user.name}") } ``` -As you can see above, we can access the `User` in our effects. If one of the methods does not need to access the dependencies or context, the returned type from the method can be cleaned up to reflect that certain things are not needed. - ## Context transformations In order to be able to bind our service to a gRPC server, we need to have the @@ -196,9 +193,8 @@ trait DepB { } case class MyService2(depA: DepA, depB: DepB) extends ZSimpleService[User] { - def sayHello(req: Request): ZIO[User, Status, Response] = + def sayHello(req: Request, user: User): ZIO[Any, Status, Response] = for { - user <- ZIO.service[User] num1 <- depA.methodA(user.name) num2 <- depB.methodB(12.3f) _ <- printLine("I am here $num1 $num2!").orDie @@ -219,7 +215,7 @@ Our service layer now depends on the `DepA` and `DepB` interfaces. A server can ```scala mdoc object MyServer3 extends zio.ZIOAppDefault { - val serverLayer = + val serverLayer = ServerLayer.fromServiceList( io.grpc.ServerBuilder.forPort(9000), ServiceList.addFromEnvironment[ZSimpleService[RequestContext]] diff --git a/docs/deadlines.md b/docs/deadlines.md index 36451c14f..d3fba0511 100644 --- a/docs/deadlines.md +++ b/docs/deadlines.md @@ -41,9 +41,8 @@ val channel = ZManagedChannel( // create layer: val clientLayer = ServiceNameClient.live( channel, - options=ZIO.succeed( - CallOptions.DEFAULT.withDeadlineAfter(3000, TimeUnit.MILLISECONDS)), - headers=SafeMetadata.make) + options=CallOptions.DEFAULT.withDeadlineAfter(3000, TimeUnit.MILLISECONDS), + metadata=SafeMetadata.make) val myAppLogicNeedsEnv = for { // use layer through accessor methods: @@ -89,7 +88,7 @@ be safely done for each individual call: val clientScoped = ServiceNameClient.scoped(channel) val myAppLogic = ZIO.scoped { - clientScoped.flatMap { client => + clientScoped.flatMap { client => for { res <- client .withTimeoutMillis(3000).unary(Request()) diff --git a/docs/decorating.md b/docs/decorating.md index 0153e16a3..3165a4066 100644 --- a/docs/decorating.md +++ b/docs/decorating.md @@ -9,8 +9,7 @@ in the service, for example to add access and error logging. It can be done with the help of `ZTransform`. Instances of this class can be used to apply a transformation to all methods of a service to generate a new "decorated" service. -This can be used for pre- or post-processing of requests/responses and also for environment -and context transformations. +This can be used for pre- or post-processing of requests/responses and also for context transformations. We define decoration: @@ -20,31 +19,34 @@ import scalapb.zio_grpc.{ RequestContext, ZTransform } import zio._ import zio.stream.ZStream -class LoggingTransform[R] extends ZTransform[Any, Status, RequestContext] { +class LoggingTransform extends ZTransform[Any, RequestContext] { - def logCause(cause: Cause[Status]): URIO[RequestContext, Unit] = ??? + def logCause(rc: RequestContext, cause: Cause[Status]): UIO[Unit] = ??? - def accessLog: URIO[RequestContext, Unit] = ??? + def accessLog(rc: RequestContext): UIO[Unit] = ??? - override def effect[A](io: ZIO[Any, Status, A]): ZIO[RequestContext, Status, A] = - io.zipLeft(accessLog).tapErrorCause(logCause) + override def effect[A](io: Any => ZIO[Any, Status, A]): RequestContext => ZIO[Any, Status, A] = { + rc => io(rc).zipLeft(accessLog(rc)).tapErrorCause(logCause(rc, _)) + } - override def stream[A](io: ZStream[Any, Status, A]): ZStream[RequestContext, Status, A] = - (io ++ ZStream.fromZIO(accessLog).drain).onError(logCause) + override def stream[A](io: Any => ZStream[Any, Status, A]): RequestContext => ZStream[Any, Status, A] = { + rc => (io(rc) ++ ZStream.fromZIO(accessLog(rc)).drain).onError(logCause(rc, _)) + } } ``` and then we apply it to our service: ```scala mdoc -import myexample.testservice.ZioTestservice.ZSimpleService +import myexample.testservice.ZioTestservice._ import myexample.testservice.{Request, Response} -object MyService extends ZSimpleService[Any] { +object MyService extends SimpleService { def sayHello(req: Request): ZIO[Any, Status, Response] = ZIO.succeed(Response(s"Hello user")) } -val decoratedService = - MyService.transform(new LoggingTransform[Any]) +// Note we now have a service with a RequestContext as context. +val decoratedService: ZSimpleService[RequestContext] = + MyService.transform(new LoggingTransform) ``` diff --git a/docs/generated-code.md b/docs/generated-code.md index 0ff013b47..17e72ee9e 100644 --- a/docs/generated-code.md +++ b/docs/generated-code.md @@ -14,33 +14,29 @@ You can read more on how ScalaPB determines the Scala package name and how can t ## Service trait -Inside the object, for each service `ServiceName` that is defined in a `.proto` file, the following structure is generated: +Inside the object, for each service `MyService` that is defined in a `.proto` file, the following structure is generated: ```scala -trait ZServiceName[Context] { +trait MyService { // methods for each RPC def sayHello(request: HelloRequest): - ZIO[Context, Status, HelloReply] + ZIO[Any, Status, HelloReply] } -type ServiceName = ZServiceName[Any] ``` -The trait `ZServiceName` is to be extended when implementing a server for this service. The trait takes one type parameter `Context`. The `Context` type parameter represents any domain object that you would like your RPC methods to have available in the environment. - -You can set `Context` to `Any` when implementing a service to indicate that the service does not have any dependencies or expectations from the environment. Since it is very common situation, especially when getting started, you can have your service implementation extends `ServiceName` which is a type alias to `ZServiceName[Any]`: +The trait `MyService` is to be extended when implementing a server for this service. +It is common that services need to extract information from the request context, for example the caller's identity. To accomplish that, there is another trait `ZMyService` which takes one +type parameter `Context`. The `Context` type parameter represents any domain object that you would like your RPC methods to receive. Later on, we will see how to convert between a `RequestContext` which represents the underlying context of the requset with your domain model. ```scala -object ServiceNameImpl extends ServiceName { +object MyServiceImpl extends MyService { + def sayHello(request: HelloRequest): ZIO[Any, Status, HelloReply] = ??? } ``` Learn more about using [context and dependencies](context.md) in the next section. -:::info -**Why `Any` means that there are no dependencies?** All Scala objects are instances of `Any`. Therefore, any object that is provided as a dependency to our service would satisfy being of type `Any`. In other words, there is no specific instance type required. -::: - ### Running the server The easiest way to run a service, is to create an object that extends `scalapb.zio_grpc.ServerMain`: diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index fb58a2b2e..aed8f8697 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -1,27 +1,33 @@ package scalapb.zio_grpc +import scalapb.zio_grpc.testservice.ZioTestservice.TestService import scalapb.zio_grpc.testservice.ZioTestservice.ZTestService import zio.ZIO import io.grpc.Status import scalapb.zio_grpc.testservice.{Request, Response} -import zio.stream.ZStream import io.grpc.ServerBuilder import zio.test._ -import zio.ZLayer +import zio.IO object BindableServiceSpec extends ZIOSpecDefault { implicitly[ZBindableService[ZTestService[RequestContext]]] implicitly[ZBindableService[ZTestService[SafeMetadata]]] implicitly[ZBindableService[ZTestService[Any]]] + implicitly[ZBindableService[TestService]] class UnimpTestService[C] extends ZTestService[C] { - def unary(request: Request): ZIO[C, Status, Response] = ??? - def serverStreaming(request: Request): ZStream[C, Status, Response] = ??? + override def unary(request: Request, context: C): IO[Status, Response] = ??? - def clientStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZIO[C, Status, Response] = ??? + override def serverStreaming(request: Request, context: C): zio.stream.Stream[Status, Response] = ??? + + override def clientStreaming(request: zio.stream.Stream[Status, Request], context: C): IO[Status, Response] = ??? + + override def bidiStreaming( + request: zio.stream.Stream[Status, Request], + context: C + ): zio.stream.Stream[Status, Response] = ??? - def bidiStreaming(request: zio.stream.ZStream[Any, Status, Request]): ZStream[C, Status, Response] = ??? } object S1 extends UnimpTestService[RequestContext] diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 975c1e941..96dc77fee 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc import zio.test._ import zio._ -import testservice.ZioTestservice.{TestServiceClient, TestServiceClientWithMetadata} +import testservice.ZioTestservice.{TestServiceClient, TestServiceClientWithResponseMetadata} import testservice.ZioTestservice.ZTestService import testservice._ import io.grpc.ServerBuilder @@ -16,48 +16,39 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { case class Context(user: User, response: SafeMetadata) - val getUser = ZIO.serviceWith[Context](_.user) - val getResponseMetadata = ZIO.serviceWith[Context](_.response) - object ServiceWithConsole extends ZTestService[Context] { - def unary(request: Request): ZIO[Context, Status, Response] = + def unary(request: Request, context: Context): ZIO[Any, Status, Response] = for { - user <- getUser - md <- getResponseMetadata - _ <- md.put(RequestIdKey, "1") - } yield Response(out = user.name) + _ <- context.response.put(RequestIdKey, "1") + } yield Response(out = context.user.name) def serverStreaming( - request: Request - ): ZStream[Context, Status, Response] = - ZStream.environmentWithStream { (u: ZEnvironment[Context]) => - ZStream - .fromZIO( - u.get.response.put(RequestIdKey, "1") - ) - .drain ++ - ZStream( - Response(u.get.user.name), - Response(u.get.user.name) - ) - } + request: Request, + context: Context + ): ZStream[Any, Status, Response] = + ZStream + .fromZIO( + context.response.put(RequestIdKey, "1") + ) + .drain ++ + ZStream( + Response(context.user.name), + Response(context.user.name) + ) def clientStreaming( - request: zio.stream.ZStream[Any, Status, Request] - ): ZIO[Context, Status, Response] = + request: zio.stream.ZStream[Any, Status, Request], + context: Context + ): ZIO[Any, Status, Response] = for { - n <- getUser - md <- getResponseMetadata - _ <- md.put(RequestIdKey, "1") - } yield Response(n.name) + _ <- context.response.put(RequestIdKey, "1") + } yield Response(context.user.name) def bidiStreaming( - request: zio.stream.ZStream[Any, Status, Request] - ): ZStream[Context, Status, Response] = - ZStream.environmentWithStream { (u: ZEnvironment[Context]) => - ZStream.fromZIO(u.get.response.put(RequestIdKey, "1")).drain ++ ZStream(Response(u.get.user.name)) - - } + request: zio.stream.ZStream[Any, Status, Request], + context: Context + ): ZStream[Any, Status, Response] = + ZStream.fromZIO(context.response.put(RequestIdKey, "1")).drain ++ ZStream(Response(context.user.name)) } val UserKey = @@ -97,7 +88,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { } } - override def clientMetadataLayer: URLayer[Server, TestServiceClientWithMetadata] = + override def clientMetadataLayer: URLayer[Server, TestServiceClientWithResponseMetadata] = ZLayer.scoped { ZIO.environmentWithZIO { (ss: ZEnvironment[Server]) => ss.get[Server].port.orDie flatMap { (port: Int) => @@ -107,7 +98,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { ZClientInterceptor.headersUpdater((_, _, md) => md.put(UserKey, "bob").unit) ) ) - TestServiceClientWithMetadata + TestServiceClientWithResponseMetadata .scoped(ch) .orDie } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala index d9677a095..bc47cb2d0 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala @@ -15,7 +15,7 @@ trait MetadataTests { userName: Option[String] ): ZLayer[Server, Nothing, TestServiceClient] - def clientMetadataLayer: ZLayer[Server, Nothing, TestServiceClientWithMetadata] + def clientMetadataLayer: ZLayer[Server, Nothing, TestServiceClientWithResponseMetadata] val RequestIdKey = Metadata.Key.of("request-id", io.grpc.Metadata.ASCII_STRING_MARSHALLER) @@ -34,13 +34,13 @@ trait MetadataTests { val bidiEffect = TestServiceClient.bidiStreaming(ZStream.empty).runCollect val unaryEffectWithMd = - ZioTestservice.TestServiceClientWithMetadata.unary(Request()) + ZioTestservice.TestServiceClientWithResponseMetadata.unary(Request()) val serverStreamingEffectWithMd = - ZioTestservice.TestServiceClientWithMetadata.serverStreaming(Request()).runCollect + ZioTestservice.TestServiceClientWithResponseMetadata.serverStreaming(Request()).runCollect val clientStreamingEffectWithMd = - ZioTestservice.TestServiceClientWithMetadata.clientStreaming(ZStream.empty) + ZioTestservice.TestServiceClientWithResponseMetadata.clientStreaming(ZStream.empty) val bidiEffectWithMd = - ZioTestservice.TestServiceClientWithMetadata.bidiStreaming(ZStream.empty).runCollect + ZioTestservice.TestServiceClientWithResponseMetadata.bidiStreaming(ZStream.empty).runCollect val properTrailer = Assertion.assertion[Metadata]("trailers") { md => md.containsKey(RequestIdKey) && md.get(RequestIdKey) == "1" diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index fa92c90a2..f539885f6 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -35,9 +35,7 @@ package object server { case _ => ZIO.fail(Status.UNKNOWN) })).onExit(exit.succeed(_)) - def serverStreaming( - request: Request - ): ZStream[Any, Status, Response] = + def serverStreaming(request: Request): ZStream[Any, Status, Response] = ZStream .acquireReleaseExitWith(requestReceived.succeed(())) { (_, ex) => ex.foldExit( From 69bc2875a1954add083cb64e25693962c31c5f06 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 4 Feb 2023 22:47:36 -0800 Subject: [PATCH 117/245] Update examples to 0.6.0-rc1 --- examples/fullapp/project/plugins.sbt | 2 +- .../scala/ExampleServerWithMetadata.scala | 8 +-- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/HelloWorldClientMetadata.scala | 56 ++++--------------- .../helloworld/HelloWorldServer.scala | 4 +- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideServer.scala | 2 +- 7 files changed, 22 insertions(+), 54 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 864d9cb27..e53c2f3e7 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test7" +val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index dd79d82c7..6bd6fead6 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -54,16 +54,16 @@ object GreeterServiceWithMetadata { // Each request gets a User as a context parameter. The service itself // depends on a GreetingsRepo service. case class GreeterImpl(greetingsRepo: GreetingsRepo) extends ZGreeter[User] { - def greet(req: Request): ZIO[User, Status, Response] = + def greet(req: Request, user: User): ZIO[Any, Status, Response] = for { - user <- ZIO.service[User] greeting <- greetingsRepo.greetingForUser(user) } yield Response(s"${greeting}, req: ${req}") - def points(request: Request): Stream[Status, Point] = ??? + def points(request: Request, user: User): Stream[Status, Point] = ??? def bidi( - request: Stream[Status, Point] + request: Stream[Status, Point], + user: User ): Stream[Status, Response] = ??? } diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index e1f532d77..e7b733bb1 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test7" +val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index c1fef1d75..7bf487627 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -36,38 +36,24 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { ) // Option 1: through layer and accessors - val clientLayer = GreeterClient.live(channel, headers = userEnvToMetadata) + val clientLayer = GreeterClient.live(channel) - type UserClient = GreeterClient.ZService[User] - - // The default accessors expect the client type that has no context. We need - // to set up accessors for the User context - object UserClient extends GreeterClient.Accessors[User] - - def appLogic1: ZIO[UserClient, Status, Unit] = + def appLogic1: ZIO[GreeterClient, Status, Unit] = for { - // With provideSomeLayer: + // With client accessor r1 <- - UserClient + GreeterClient + .withMetadataZIO(userToMetadata(User("user1"))) .sayHello(HelloRequest("World")) - .provideSomeLayer[UserClient](ZLayer.succeed(User("user1"))) _ <- printLine(r1.message).orDie - - // With provideSomeEnvironment: - r2 <- - UserClient - .sayHello(HelloRequest("World")) - .provideSomeEnvironment( - (_: ZEnvironment[UserClient]) ++ ZEnvironment( - User("user1") - ) - ) - _ <- printLine(r2.message).orDie } yield () // Option 2: through a managed client - val userClientManaged: ZIO[Scope, Throwable, GreeterClient.ZService[User]] = - GreeterClient.scoped(channel, headers = userEnvToMetadata) + + // The metadata is fixed for the client, but can be overriden by + // `withMetadataZIO`, or mapped with `mapMetadataZIO` - see below. + val userClientManaged: ZIO[Scope, Throwable, GreeterClient] = + GreeterClient.scoped(channel, metadata = userToMetadata(User("user1"))) def appLogic2 = ZIO.scoped { @@ -76,37 +62,19 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { r1 <- client .sayHello(HelloRequest("World")) - .provideEnvironment(ZEnvironment(User("user1"))) _ <- printLine(r1.message) r2 <- client + .withMetadataZIO(userToMetadata(User("user2"))) .sayHello(HelloRequest("World")) - .provideEnvironment(ZEnvironment(User("user2"))) _ <- printLine(r2.message) } yield () } } - // Option 3: by changing the stub - val clientManaged = GreeterClient.scoped(channel) - def appLogic3 = - ZIO.scoped { - clientManaged.flatMap { client => - for { - // Pass metadata effectfully - r1 <- - client - .withMetadataZIO(userToMetadata(User("hello"))) - .sayHello(HelloRequest("World")) - _ <- printLine(r1.message) - } yield () - } - } - final def run = ( appLogic1.provideLayer(clientLayer) *> - appLogic2 *> - appLogic3 + appLogic2 ).exitCode } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala index 37ef6da39..b1c2c0706 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala @@ -6,10 +6,10 @@ import scalapb.zio_grpc.ServiceList import zio._ import zio.Console._ -import io.grpc.examples.helloworld.helloworld.ZioHelloworld.ZGreeter +import io.grpc.examples.helloworld.helloworld.ZioHelloworld.Greeter import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} -object GreeterImpl extends ZGreeter[Any] { +object GreeterImpl extends Greeter { def sayHello( request: HelloRequest ): ZIO[Any, Status, HelloReply] = diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index e1f532d77..e7b733bb1 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-test7" +val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index bb16c8068..ca0a2c6b7 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -15,7 +15,7 @@ import zio.UIO class RouteGuideService( features: Seq[Feature], routeNotesRef: Ref[Map[Point, List[RouteNote]]] -) extends ZioRouteGuide.ZRouteGuide[Any] { +) extends ZioRouteGuide.RouteGuide { /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the * requested [[Point]]. If no feature at that location exists, a NOT FOUND From d23252b4afecf93e4526d15988e2b7c046a23f31 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 7 Feb 2023 09:30:19 -0800 Subject: [PATCH 118/245] Re-add andThen to transforms. --- .../scala/scalapb/zio_grpc/transforms.scala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/src/main/scala/scalapb/zio_grpc/transforms.scala b/core/src/main/scala/scalapb/zio_grpc/transforms.scala index d3471d971..0493d1555 100644 --- a/core/src/main/scala/scalapb/zio_grpc/transforms.scala +++ b/core/src/main/scala/scalapb/zio_grpc/transforms.scala @@ -25,6 +25,12 @@ trait Transform { self.stream(io(c)) } } + + def andThen(other: Transform): Transform = new Transform { + def effect[A](io: ZIO[Any, Status, A]): ZIO[Any, Status, A] = other.effect(self.effect(io)) + + def stream[A](io: ZStream[Any, Status, A]): ZStream[Any, Status, A] = other.stream(self.stream(io)) + } } object Transform { @@ -41,8 +47,19 @@ object Transform { * "decorated" service. This can be used for pre- or post-processing of requests/response or to transform the context. */ trait ZTransform[+ContextIn, -ContextOut] { + self => def effect[A](io: ContextIn => ZIO[Any, Status, A]): (ContextOut => ZIO[Any, Status, A]) def stream[A](io: ContextIn => ZStream[Any, Status, A]): (ContextOut => ZStream[Any, Status, A]) + + def andThen[ContextIn2 <: ContextOut, ContextOut2]( + other: ZTransform[ContextIn2, ContextOut2] + ): ZTransform[ContextIn, ContextOut2] = new ZTransform[ContextIn, ContextOut2] { + def effect[A](io: ContextIn => ZIO[Any, Status, A]): ContextOut2 => ZIO[Any, Status, A] = + other.effect(self.effect(io)) + + def stream[A](io: ContextIn => ZStream[Any, Status, A]): ContextOut2 => ZStream[Any, Status, A] = + other.stream(self.stream(io)) + } } object ZTransform { From eac3d493824fb1fce8907182f58f24cbe33bb37e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 8 Feb 2023 20:43:27 +0100 Subject: [PATCH 119/245] Update zio, zio-streams, zio-test, ... to 2.0.7 (#480) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 12f37abc5..30d09c222 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.5" + val zio = "2.0.7" val grpc = "1.47.0" } From 20df0778a598a1bf626530db48d1b7aef61b1acc Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 8 Feb 2023 20:52:28 +0100 Subject: [PATCH 120/245] Update compilerplugin, scalapb-runtime, ... to 0.11.13 (#479) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 0d1ca180e..9c7a221c5 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,7 @@ ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.12" +libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.13" addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") From 49d73ddf5238cd4586d054c6393e846961c25128 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 10 Feb 2023 22:59:45 +0100 Subject: [PATCH 121/245] Update zio, zio-streams, zio-test, ... to 2.0.8 (#481) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 30d09c222..479f6c050 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.7" + val zio = "2.0.8" val grpc = "1.47.0" } From 9fb60a8dc07cf38a27ec2883a11a7d4f4e50571a Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz <629976+regiskuckaertz@users.noreply.github.com> Date: Sat, 11 Feb 2023 19:12:35 +0000 Subject: [PATCH 122/245] Optimise backpressure loop (#478) Optimise backpressure loop Co-authored-by: Regis Kuckaertz --- .../scalapb/zio_grpc/server/ZServerCall.scala | 2 +- .../zio_grpc/server/ZServerCallHandler.scala | 65 +++++++++++++------ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala index 89493c1f0..11adccade 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCall.scala @@ -7,7 +7,7 @@ import zio.stm.TSemaphore import zio.UIO /** Wrapper around [[io.grpc.ServerCall]] that lifts its effects into ZIO values */ -final class ZServerCall[Res](private val call: ServerCall[_, Res], private val canSend: TSemaphore) { +final class ZServerCall[Res](private[zio_grpc] val call: ServerCall[_, Res], private val canSend: TSemaphore) { def isReady: UIO[Boolean] = ZIO.succeed(call.isReady()) def request(n: Int): GIO[Unit] = GIO.fromTask(ZIO.attempt(call.request(n))) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 08c6f625f..6fe5b2115 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -11,6 +11,9 @@ import scalapb.zio_grpc.RequestContext import io.grpc.Metadata import scalapb.zio_grpc.SafeMetadata import zio.stm.TSemaphore +import zio.Exit.Failure +import zio.Exit.Success +import scala.annotation.tailrec class ZServerCallHandler[Req, Res]( runtime: Runtime[Any], @@ -105,30 +108,54 @@ object ZServerCallHandler { call: ZServerCall[Res], stream: ZStream[Any, Status, Res] ): ZIO[Any, Status, Unit] = { - def innerLoop(queue: Dequeue[Exit[Option[Status], Res]]): ZIO[Any, Status, Boolean] = - queue.take - .flatMap { - case Exit.Success(res) => call.sendMessage(res).as(true) - case Exit.Failure(cause) => - cause.failureOrCause match { - case Left(Some(status)) => ZIO.fail(status) - case Left(None) => ZIO.succeed(false) - case Right(cause) => ZIO.failCause(cause) + def takeFromQueue(queue: Dequeue[Exit[Option[Status], Res]]): ZIO[Any, Status, Unit] = + queue.takeAll.flatMap(takeFromCache(_, queue)) + + def takeFromCache( + xs: Chunk[Exit[Option[Status], Res]], + queue: Dequeue[Exit[Option[Status], Res]] + ): ZIO[Any, Status, Unit] = + ZIO.suspendSucceed { + @tailrec def innerLoop(loop: Boolean, i: Int): IO[Status, Unit] = + if (i < xs.length && loop) { + xs(i) match { + case Failure(cause) => + cause.failureOrCause match { + case Left(Some(status)) => + ZIO.fail(status) + case Left(None) => + ZIO.unit + case Right(cause) => + ZIO.failCause(cause) + } + case Success(value) => + call.call.sendMessage(value) + // the loop iteration may only continue if the call can + // still accept elements and we have more elements to send + innerLoop(call.call.isReady, i + 1) } - } - .repeatWhileZIO(res => call.isReady.map(_ && res)) + } else if (loop) + // ^ if we reached the end of the chunk but the call can still + // proceed, we pull from the queue and continue + takeFromQueue(queue) + else + // ^ otherwise, we wait for the call to be ready and then start again + call.awaitReady *> takeFromCache(xs.drop(i), queue) - def outerLoop(queue: Dequeue[Exit[Option[Status], Res]]): ZIO[Any, Status, Boolean] = - (call.awaitReady *> innerLoop(queue)) - .repeatWhile(identity) + if (xs.isEmpty) + takeFromQueue(queue) + else + innerLoop(true, 0) + } for { queueSize <- backpressureQueueSize - _ <- ZIO.scoped[Any]( - stream - .toQueueOfElements(queueSize) - .flatMap(outerLoop) - ) + _ <- ZIO + .scoped[Any]( + stream + .toQueueOfElements(queueSize) + .flatMap(queue => call.awaitReady *> takeFromQueue(queue)) + ) } yield () } } From dc7d392b20fa0cf83f0f261603c4847bbb0bcb15 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Wed, 15 Feb 2023 13:30:49 -0800 Subject: [PATCH 123/245] Add implementation for client streaming transforms --- .../main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index 3bccce826..249f24735 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -250,9 +250,9 @@ class ZioFilePrinter( case StreamType.ServerStreaming => s"f.stream($delegate(request))" case StreamType.ClientStreaming => - s"""zio.ZIO.fail($Status.INTERNAL.withDescription("Transforming client-side client-streaming calls is not supported"))""" + s"f.effect($delegate(request))" case StreamType.Bidirectional => - s"""zio.stream.ZStream.fail($Status.INTERNAL.withDescription("Transforming client-side bidi calls is not supported"))""" + s"f.stream($delegate(request))" } fp.add( clientWithResponseMetadataSignature( @@ -273,9 +273,9 @@ class ZioFilePrinter( case StreamType.ServerStreaming => s"f.stream($delegate(request))" case StreamType.ClientStreaming => - s"""zio.ZIO.fail($Status.INTERNAL.withDescription("Transforming client-side client-streaming calls is not supported"))""" + s"f.effect($delegate(request))" case StreamType.Bidirectional => - s"""zio.stream.ZStream.fail($Status.INTERNAL.withDescription("Transforming client-side bidi calls is not supported"))""" + s"f.stream($delegate(request))" } fp.add( clientMethodSignature( From 02c7210fc6c503bf81d4424424679b689df44ba7 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 16 Feb 2023 22:31:41 +0100 Subject: [PATCH 124/245] Update zio, zio-streams, zio-test, ... to 2.0.9 (#482) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 479f6c050..c2c0d4563 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.8" + val zio = "2.0.9" val grpc = "1.47.0" } From f7a8cf760936d76286a395813b8f49190d2dfbaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 25 Feb 2023 12:46:31 -0800 Subject: [PATCH 125/245] Bump http-cache-semantics from 4.1.0 to 4.1.1 in /website (#477) Bumps [http-cache-semantics](https://github.com/kornelski/http-cache-semantics) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/kornelski/http-cache-semantics/releases) - [Commits](https://github.com/kornelski/http-cache-semantics/compare/v4.1.0...v4.1.1) --- updated-dependencies: - dependency-name: http-cache-semantics dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index a4a525658..94fb23269 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -5384,9 +5384,9 @@ htmlparser2@^8.0.1: entities "^4.3.0" http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-deceiver@^1.2.7: version "1.2.7" From cb0f4482021cfb7c12e881f6e2b6b14caed82dd3 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 25 Feb 2023 21:46:45 +0100 Subject: [PATCH 126/245] Update sbt-scalajs, scalajs-compiler, ... to 1.13.0 (#474) --- examples/fullapp/project/plugins.sbt | 4 ++-- project/plugins.sbt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index e53c2f3e7..a6e42f3ae 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -8,11 +8,11 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") diff --git a/project/plugins.sbt b/project/plugins.sbt index 9c7a221c5..cdec42c79 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -10,7 +10,7 @@ addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") From 8317a38308f2bbf6319b5a87e979487c8f282e9d Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 25 Feb 2023 12:50:18 -0800 Subject: [PATCH 127/245] scalafmt update --- .scalafmt.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index ebff12733..148545920 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.6.1" +version = "3.7.1" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 align.preset = most From 1a882753f982a49d34475b5de55aaff19887b27b Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 25 Feb 2023 12:54:12 -0800 Subject: [PATCH 128/245] Scalafmt changes --- examples/fullapp/.scalafmt.conf | 2 +- examples/fullapp/project/plugins.sbt | 2 +- examples/helloworld/.scalafmt.conf | 2 +- examples/routeguide/.scalafmt.conf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/.scalafmt.conf b/examples/fullapp/.scalafmt.conf index a30babc5e..7f2f20269 100644 --- a/examples/fullapp/.scalafmt.conf +++ b/examples/fullapp/.scalafmt.conf @@ -1,2 +1,2 @@ -version = "3.5.8" +version = "3.7.1" runner.dialect = scala213source3 diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index a6e42f3ae..0a7eb85c9 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -8,7 +8,7 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: diff --git a/examples/helloworld/.scalafmt.conf b/examples/helloworld/.scalafmt.conf index a30babc5e..7f2f20269 100644 --- a/examples/helloworld/.scalafmt.conf +++ b/examples/helloworld/.scalafmt.conf @@ -1,2 +1,2 @@ -version = "3.5.8" +version = "3.7.1" runner.dialect = scala213source3 diff --git a/examples/routeguide/.scalafmt.conf b/examples/routeguide/.scalafmt.conf index a30babc5e..7f2f20269 100644 --- a/examples/routeguide/.scalafmt.conf +++ b/examples/routeguide/.scalafmt.conf @@ -1,2 +1,2 @@ -version = "3.5.8" +version = "3.7.1" runner.dialect = scala213source3 From b0d25ad5e85032ec552e8de96b37cae7e65a8eee Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 25 Feb 2023 13:14:53 -0800 Subject: [PATCH 129/245] Upate scalajs-bundler --- examples/fullapp/project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 0a7eb85c9..cd1324828 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -16,4 +16,4 @@ addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") -addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.0") +addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1") From 8f52bc05e80013cb227beb010cba5189a99eb682 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 25 Feb 2023 22:15:13 +0100 Subject: [PATCH 130/245] Update sbt to 1.8.2 (#465) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 6a9f03889..46e43a97e 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.2 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 6a9f03889..46e43a97e 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.2 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 6a9f03889..46e43a97e 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.2 diff --git a/project/build.properties b/project/build.properties index 6a9f03889..46e43a97e 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.7.3 +sbt.version=1.8.2 From ffe0fa5075724d571c0e35da702e00c68b71fad5 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 25 Feb 2023 19:44:43 -0800 Subject: [PATCH 131/245] Update github actions versions --- .github/workflows/ci.yml | 6 +++--- .github/workflows/release.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 14d39bfe5..7b1c01e5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,15 +10,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: java-version: 1.8 - name: Mount caches - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ~/.sbt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b31af982..41c555a24 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -12,7 +12,7 @@ jobs: with: node-version: '16.x' - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: java-version: 1.8 - name: Update docs From 490cabe35868af41dfa46c9e2e21f1b204bb9fc2 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 25 Feb 2023 19:59:22 -0800 Subject: [PATCH 132/245] Update github java distribution --- .github/workflows/ci.yml | 1 + .github/workflows/release.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b1c01e5b..ede361694 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ jobs: uses: actions/setup-java@v3 with: java-version: 1.8 + distribution: temurin - name: Mount caches uses: actions/cache@v3 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 41c555a24..5eb8c93d0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,6 +15,7 @@ jobs: uses: actions/setup-java@v3 with: java-version: 1.8 + distribution: temurin - name: Update docs run: | git config --global user.name "ZIO-gRPC Docs" From b7272607ed6eefb16cf984fb82cd3ffcbbd7589e Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 4 Mar 2023 11:02:05 -0800 Subject: [PATCH 133/245] ScalaJS w/ Scala3 support --- build.sbt | 2 +- project/Settings.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 07afee6ab..4bf1e491a 100644 --- a/build.sbt +++ b/build.sbt @@ -55,7 +55,7 @@ lazy val core = projectMatrix ) .customRow( true, - Seq(Scala212, Scala213), + ScalaVersions, Seq(VirtualAxis.js), _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( diff --git a/project/Settings.scala b/project/Settings.scala index 97e13869c..e242bb258 100644 --- a/project/Settings.scala +++ b/project/Settings.scala @@ -44,6 +44,6 @@ object Settings { def stdSettings = Seq( - scalacOptions := stdOptions ++ extraOptions(scalaVersion.value) + scalacOptions ++= stdOptions ++ extraOptions(scalaVersion.value) ) } From 04d355ebf5542ceef3b60c9c88f5cbbd0a8aecf0 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 4 Mar 2023 15:19:59 -0800 Subject: [PATCH 134/245] Fix java version --- .github/workflows/ci.yml | 4 ++-- .github/workflows/release.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ede361694..427f1491d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,10 +12,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 1.8 + - name: Set up JDK 8 uses: actions/setup-java@v3 with: - java-version: 1.8 + java-version: 8 distribution: temurin - name: Mount caches diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5eb8c93d0..f201c84af 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,10 +11,10 @@ jobs: - uses: actions/setup-node@v3 with: node-version: '16.x' - - name: Set up JDK 1.8 + - name: Set up JDK 8 uses: actions/setup-java@v3 with: - java-version: 1.8 + java-version: 8 distribution: temurin - name: Update docs run: | From f8260abeed7759c2656ff5052af77b39b20f2fbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Mar 2023 15:27:33 -0800 Subject: [PATCH 135/245] Bump dns-packet from 5.3.1 to 5.4.0 in /website (#484) Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/mafintosh/dns-packet/releases) - [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md) - [Commits](https://github.com/mafintosh/dns-packet/compare/v5.3.1...5.4.0) --- updated-dependencies: - dependency-name: dns-packet dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index 94fb23269..dc2e6528b 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -4451,9 +4451,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^5.2.2: - version "5.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" - integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== dependencies: "@leichtgewicht/ip-codec" "^2.0.1" From e916a85714ac425860e53dbcbb0ed23011afdae1 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sun, 5 Mar 2023 00:28:07 +0100 Subject: [PATCH 136/245] Update scalafmt-core to 3.7.2 (#483) * Update scalafmt-core to 3.7.2 * Reformat with scalafmt 3.7.2 Executed command: scalafmt --non-interactive * Add 'Reformat with scalafmt 3.7.2' to .git-blame-ignore-revs --- .git-blame-ignore-revs | 2 + .scalafmt.conf | 2 +- .../scalapb/zio_grpc/BackpressureSpec.scala | 4 +- examples/fullapp/.scalafmt.conf | 2 +- examples/fullapp/build.sbt | 4 +- .../client/src/main/scala/ExampleClient.scala | 2 +- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 3 +- .../scala/ExampleServerWithMetadata.scala | 13 ++-- examples/helloworld/.scalafmt.conf | 2 +- examples/helloworld/build.sbt | 4 +- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/HelloWorldClientMetadata.scala | 16 ++--- .../helloworld/MultipleServices.scala | 2 +- examples/routeguide/.scalafmt.conf | 2 +- examples/routeguide/build.sbt | 6 +- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideClientApp.scala | 35 +++++----- .../routeguide/RouteGuideServer.scala | 64 ++++++++----------- 19 files changed, 77 insertions(+), 92 deletions(-) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..3513d5640 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Scala Steward: Reformat with scalafmt 3.7.2 +34b9f2c2d303a4c50988182586860b57dca5fa5d diff --git a/.scalafmt.conf b/.scalafmt.conf index 148545920..66db887ae 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.7.1" +version = "3.7.2" rewrite.rules = [SortImports, RedundantBraces] maxColumn = 120 align.preset = most diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala index 69e497683..efde92b66 100644 --- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala +++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -12,7 +12,9 @@ import io.grpc.inprocess.InProcessChannelBuilder object BackpressureSpec extends ZIOSpecDefault { val server = - ServerLayer.fromEnvironment[ZioTestservice.TestService](InProcessServerBuilder.forName("backpressure-test").directExecutor()) + ServerLayer.fromEnvironment[ZioTestservice.TestService]( + InProcessServerBuilder.forName("backpressure-test").directExecutor() + ) val client = ZLayer.scoped[Server] { diff --git a/examples/fullapp/.scalafmt.conf b/examples/fullapp/.scalafmt.conf index 7f2f20269..6d01e3c7e 100644 --- a/examples/fullapp/.scalafmt.conf +++ b/examples/fullapp/.scalafmt.conf @@ -1,2 +1,2 @@ -version = "3.7.1" +version = "3.7.2" runner.dialect = scala213source3 diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index af12cf361..7ccd53b2d 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -11,8 +11,8 @@ val grpcVersion = "1.50.1" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) .settings( - Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + Compile / PB.targets := Seq( + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ), Compile / PB.protoSources := Seq( diff --git a/examples/fullapp/client/src/main/scala/ExampleClient.scala b/examples/fullapp/client/src/main/scala/ExampleClient.scala index 88d28290f..b6caf741f 100644 --- a/examples/fullapp/client/src/main/scala/ExampleClient.scala +++ b/examples/fullapp/client/src/main/scala/ExampleClient.scala @@ -26,6 +26,6 @@ object ExampleClient extends zio.ZIOAppDefault { f <- GreeterClient.greet(Request("Bye")) _ <- printLine(f.resp) } yield ()) - .onError { c => printLine(c.prettyPrint).orDie } + .onError(c => printLine(c.prettyPrint).orDie) .provideLayer(clientLayer) } diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index cd1324828..bdb7e627f 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -8,7 +8,7 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index 8e5296e93..26ef4705c 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -30,9 +30,8 @@ object GreeterService { def bidi( request: Stream[Status, Point] - ): Stream[Status, Response] = { + ): Stream[Status, Response] = request.grouped(3).map(r => Response(r.toString())) - } } } diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 6bd6fead6..19bbd7177 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -25,7 +25,7 @@ trait UserRepo { case class UserRepoImpl() extends UserRepo { def findUser(name: String): ZIO[Any, Status, User] = name match { case "john" => ZIO.succeed(User("John")) - case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) } } @@ -75,15 +75,14 @@ object GreeterServiceWithMetadata { def findUser(userRepo: UserRepo, rc: RequestContext): IO[Status, User] = for { name <- rc.metadata - .get(UserKey) - .someOrFail( - Status.UNAUTHENTICATED.withDescription("No user-key header provided") - ) + .get(UserKey) + .someOrFail( + Status.UNAUTHENTICATED.withDescription("No user-key header provided") + ) user <- userRepo.findUser(name) } yield user - val layer - : ZLayer[UserRepo with GreetingsRepo, Nothing, ZGreeter[RequestContext]] = + val layer: ZLayer[UserRepo with GreetingsRepo, Nothing, ZGreeter[RequestContext]] = ZLayer.fromFunction((userRepo: UserRepo, greetingsRepo: GreetingsRepo) => GreeterImpl(greetingsRepo).transformContextZIO(findUser(userRepo, _)) ) diff --git a/examples/helloworld/.scalafmt.conf b/examples/helloworld/.scalafmt.conf index 7f2f20269..6d01e3c7e 100644 --- a/examples/helloworld/.scalafmt.conf +++ b/examples/helloworld/.scalafmt.conf @@ -1,2 +1,2 @@ -version = "3.7.1" +version = "3.7.2" runner.dialect = scala213source3 diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index 37dac1276..3efccc407 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -5,12 +5,12 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.50.1" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index e7b733bb1..1a135e536 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -8,5 +8,5 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" ) diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index 7bf487627..5916fa90b 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -2,13 +2,7 @@ package zio_grpc.examples.helloworld import io.grpc.examples.helloworld.helloworld.ZioHelloworld.GreeterClient import io.grpc.examples.helloworld.helloworld.HelloRequest -import io.grpc.{ - ManagedChannelBuilder, - Metadata, - MethodDescriptor, - CallOptions, - Status -} +import io.grpc.{CallOptions, ManagedChannelBuilder, Metadata, MethodDescriptor, Status} import zio.Console._ import scalapb.zio_grpc.{SafeMetadata, ZClientInterceptor, ZManagedChannel} import zio._ @@ -22,7 +16,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { def userToMetadata(user: User): UIO[SafeMetadata] = for { metadata <- SafeMetadata.make - _ <- metadata.put(UserKey, user.name) + _ <- metadata.put(UserKey, user.name) } yield metadata // An effect that fetches a User from the environment and transforms it to @@ -45,7 +39,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { GreeterClient .withMetadataZIO(userToMetadata(User("user1"))) .sayHello(HelloRequest("World")) - _ <- printLine(r1.message).orDie + _ <- printLine(r1.message).orDie } yield () // Option 2: through a managed client @@ -62,12 +56,12 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { r1 <- client .sayHello(HelloRequest("World")) - _ <- printLine(r1.message) + _ <- printLine(r1.message) r2 <- client .withMetadataZIO(userToMetadata(User("user2"))) .sayHello(HelloRequest("World")) - _ <- printLine(r2.message) + _ <- printLine(r2.message) } yield () } } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala index 4bab86f39..311b4c6fd 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala @@ -8,7 +8,7 @@ import scalapb.zio_grpc.ServiceList import zio._ import zio.Console._ -import io.grpc.examples.helloworld.helloworld.ZioHelloworld.{Welcomer, Greeter} +import io.grpc.examples.helloworld.helloworld.ZioHelloworld.{Greeter, Welcomer} import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} import zio_grpc.examples.helloworld.userdatabase.UserDatabase import scalapb.zio_grpc.ServerLayer diff --git a/examples/routeguide/.scalafmt.conf b/examples/routeguide/.scalafmt.conf index 7f2f20269..6d01e3c7e 100644 --- a/examples/routeguide/.scalafmt.conf +++ b/examples/routeguide/.scalafmt.conf @@ -1,2 +1,2 @@ -version = "3.7.1" +version = "3.7.2" runner.dialect = scala213source3 diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index 2447eaeac..eca423f57 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -5,14 +5,14 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.50.1" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" ) run / fork := true diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index e7b733bb1..1a135e536 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -8,5 +8,5 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" ) diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index eb61668e7..eaf3443e3 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -37,30 +37,27 @@ object RouteGuideClientApp extends ZIOAppDefault { val features = RouteGuideServer.featuresDatabase.feature - /** Sends numPoints randomly chosen points from [[features]] with a variable - * delay in between. Prints the statistics when they are sent from the - * server. + /** Sends numPoints randomly chosen points from [[features]] with a variable delay in between. Prints the statistics + * when they are sent from the server. */ // start: recordRoute def recordRoute(numPoints: Int) = for { summary <- RouteGuideClient.recordRoute( - ZStream - .repeatZIO( - nextIntBetween(0, features.size).map(features(_).getLocation) - ) - .tap(p => - printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie - ) - .schedule(Schedule.spaced(300.millis)) - .take(numPoints) - ) - _ <- printLine( - s"Finished trip with ${summary.pointCount} points. " + - s"Passed ${summary.featureCount} features. " + - s"Travelled ${summary.distance} meters. " + - s"It took ${summary.elapsedTime} seconds." - ) + ZStream + .repeatZIO( + nextIntBetween(0, features.size).map(features(_).getLocation) + ) + .tap(p => printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie) + .schedule(Schedule.spaced(300.millis)) + .take(numPoints) + ) + _ <- printLine( + s"Finished trip with ${summary.pointCount} points. " + + s"Passed ${summary.featureCount} features. " + + s"Travelled ${summary.distance} meters. " + + s"It took ${summary.elapsedTime} seconds." + ) } yield () // end: recordRoute diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index ca0a2c6b7..8cc014f96 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -17,9 +17,8 @@ class RouteGuideService( routeNotesRef: Ref[Map[Point, List[RouteNote]]] ) extends ZioRouteGuide.RouteGuide { - /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the - * requested [[Point]]. If no feature at that location exists, a NOT FOUND - * error is returned. + /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the requested [[Point]]. If no feature at that + * location exists, a NOT FOUND error is returned. * * @param request * the requested location for the feature. @@ -29,17 +28,16 @@ class RouteGuideService( ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND) // end: getFeature - /** Streams all features contained within the given bounding {@link - * Rectangle}. + /** Streams all features contained within the given bounding {@link Rectangle}. * * @param request * the bounding rectangle for the requested features. */ // start: listFeatures def listFeatures(request: Rectangle): ZStream[Any, Status, Feature] = { - val left = request.getLo.longitude min request.getHi.longitude - val right = request.getLo.longitude max request.getHi.longitude - val top = request.getLo.latitude max request.getHi.latitude + val left = request.getLo.longitude min request.getHi.longitude + val right = request.getLo.longitude max request.getHi.longitude + val top = request.getLo.latitude max request.getHi.latitude val bottom = request.getLo.latitude min request.getHi.latitude ZStream.fromIterable( @@ -52,9 +50,8 @@ class RouteGuideService( } // end: listFeatures - /** Gets a stream of points, and responds with statistics about the "trip": - * number of points, number of known features visited, total distance - * traveled, and total time spent. + /** Gets a stream of points, and responds with statistics about the "trip": number of points, number of known features + * visited, total distance traveled, and total time spent. * * @param request * a stream of points to process @@ -62,27 +59,24 @@ class RouteGuideService( // start: recordRoute def recordRoute( request: zio.stream.Stream[Status, Point] - ): ZIO[Any, Status, RouteSummary] = { + ): ZIO[Any, Status, RouteSummary] = // Zips each element with the previous element, initially accompanied by None. request.zipWithPrevious - .runFold(RouteSummary()) { - case (summary, (maybePrevPoint, currentPoint)) => - // Compute the next status based on the current status. - summary.copy( - pointCount = summary.pointCount + 1, - featureCount = - summary.featureCount + (if (findFeature(currentPoint).isDefined) 1 - else 0), - distance = summary.distance + maybePrevPoint - .map(calcDistance(_, currentPoint)) - .getOrElse(0) - ) + .runFold(RouteSummary()) { case (summary, (maybePrevPoint, currentPoint)) => + // Compute the next status based on the current status. + summary.copy( + pointCount = summary.pointCount + 1, + featureCount = summary.featureCount + (if (findFeature(currentPoint).isDefined) 1 + else 0), + distance = summary.distance + maybePrevPoint + .map(calcDistance(_, currentPoint)) + .getOrElse(0) + ) } .timed // returns a new effect that times the execution .map { case (duration, summary) => summary.copy(elapsedTime = (duration.toMillis / 1000).toInt) } - } // end: recordRoute // start: routeChat @@ -110,16 +104,14 @@ class RouteGuideService( * @param location * the location to check * @return - * A non-empty option if a feature is defined at that point, None - * otherwise. + * A non-empty option if a feature is defined at that point, None otherwise. */ // start: findFeature def findFeature(point: Point): Option[Feature] = features.find(f => f.getLocation == point && f.name.nonEmpty) // end: findFeature - /** Calculate the distance between two points using the "haversine" formula. - * The formula is based on + /** Calculate the distance between two points using the "haversine" formula. The formula is based on * http://mathforum.org/library/drmath/view/51879.html. * * @param start @@ -130,14 +122,14 @@ class RouteGuideService( * The distance between the points in meters */ def calcDistance(start: Point, end: Point): Int = { - val r = 6371000 // earth radius in meters + val r = 6371000 // earth radius in meters val CoordFactor: Double = 1e7 - val lat1 = toRadians(start.latitude) / CoordFactor - val lat2 = toRadians(end.latitude) / CoordFactor - val lon1 = toRadians(start.longitude) / CoordFactor - val lon2 = toRadians(end.longitude) / CoordFactor - val deltaLat = lat2 - lat1 - val deltaLon = lon2 - lon1 + val lat1 = toRadians(start.latitude) / CoordFactor + val lat2 = toRadians(end.latitude) / CoordFactor + val lon1 = toRadians(start.longitude) / CoordFactor + val lon2 = toRadians(end.longitude) / CoordFactor + val deltaLat = lat2 - lat1 + val deltaLon = lon2 - lon1 val a = sin(deltaLat / 2) * sin(deltaLat / 2) +cos(lat1) * cos(lat2) * sin(deltaLon / 2) * sin(deltaLon / 2) From 0c1ed55d8dc6958df0e5b41628f1533b8da630f7 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 4 Mar 2023 15:38:06 -0800 Subject: [PATCH 137/245] Scalafmt fix --- examples/fullapp/build.sbt | 4 +- examples/fullapp/project/plugins.sbt | 2 +- .../scala/ExampleServerWithMetadata.scala | 13 ++-- examples/helloworld/build.sbt | 4 +- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/HelloWorldClientMetadata.scala | 16 +++-- examples/routeguide/build.sbt | 6 +- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideClientApp.scala | 35 ++++++----- .../routeguide/RouteGuideServer.scala | 61 +++++++++++-------- 10 files changed, 81 insertions(+), 64 deletions(-) diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt index 7ccd53b2d..af12cf361 100644 --- a/examples/fullapp/build.sbt +++ b/examples/fullapp/build.sbt @@ -11,8 +11,8 @@ val grpcVersion = "1.50.1" lazy val protos = crossProject(JSPlatform, JVMPlatform) .in(file("protos")) .settings( - Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + Compile / PB.targets := Seq( + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ), Compile / PB.protoSources := Seq( diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index bdb7e627f..cd1324828 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -8,7 +8,7 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7" ) // For Scala.js: diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 19bbd7177..6bd6fead6 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -25,7 +25,7 @@ trait UserRepo { case class UserRepoImpl() extends UserRepo { def findUser(name: String): ZIO[Any, Status, User] = name match { case "john" => ZIO.succeed(User("John")) - case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) } } @@ -75,14 +75,15 @@ object GreeterServiceWithMetadata { def findUser(userRepo: UserRepo, rc: RequestContext): IO[Status, User] = for { name <- rc.metadata - .get(UserKey) - .someOrFail( - Status.UNAUTHENTICATED.withDescription("No user-key header provided") - ) + .get(UserKey) + .someOrFail( + Status.UNAUTHENTICATED.withDescription("No user-key header provided") + ) user <- userRepo.findUser(name) } yield user - val layer: ZLayer[UserRepo with GreetingsRepo, Nothing, ZGreeter[RequestContext]] = + val layer + : ZLayer[UserRepo with GreetingsRepo, Nothing, ZGreeter[RequestContext]] = ZLayer.fromFunction((userRepo: UserRepo, greetingsRepo: GreetingsRepo) => GreeterImpl(greetingsRepo).transformContextZIO(findUser(userRepo, _)) ) diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt index 3efccc407..37dac1276 100644 --- a/examples/helloworld/build.sbt +++ b/examples/helloworld/build.sbt @@ -5,12 +5,12 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.50.1" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion ) diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index 1a135e536..e7b733bb1 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -8,5 +8,5 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" ) diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index 5916fa90b..fe07604bc 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -2,7 +2,13 @@ package zio_grpc.examples.helloworld import io.grpc.examples.helloworld.helloworld.ZioHelloworld.GreeterClient import io.grpc.examples.helloworld.helloworld.HelloRequest -import io.grpc.{CallOptions, ManagedChannelBuilder, Metadata, MethodDescriptor, Status} +import io.grpc.{ + CallOptions, + ManagedChannelBuilder, + Metadata, + MethodDescriptor, + Status +} import zio.Console._ import scalapb.zio_grpc.{SafeMetadata, ZClientInterceptor, ZManagedChannel} import zio._ @@ -16,7 +22,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { def userToMetadata(user: User): UIO[SafeMetadata] = for { metadata <- SafeMetadata.make - _ <- metadata.put(UserKey, user.name) + _ <- metadata.put(UserKey, user.name) } yield metadata // An effect that fetches a User from the environment and transforms it to @@ -39,7 +45,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { GreeterClient .withMetadataZIO(userToMetadata(User("user1"))) .sayHello(HelloRequest("World")) - _ <- printLine(r1.message).orDie + _ <- printLine(r1.message).orDie } yield () // Option 2: through a managed client @@ -56,12 +62,12 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { r1 <- client .sayHello(HelloRequest("World")) - _ <- printLine(r1.message) + _ <- printLine(r1.message) r2 <- client .withMetadataZIO(userToMetadata(User("user2"))) .sayHello(HelloRequest("World")) - _ <- printLine(r2.message) + _ <- printLine(r2.message) } yield () } } diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt index eca423f57..2447eaeac 100644 --- a/examples/routeguide/build.sbt +++ b/examples/routeguide/build.sbt @@ -5,14 +5,14 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots") val grpcVersion = "1.50.1" Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, scalapb.zio_grpc.ZioCodeGenerator -> (Compile / sourceManaged).value ) libraryDependencies ++= Seq( - "io.grpc" % "grpc-netty" % grpcVersion, + "io.grpc" % "grpc-netty" % grpcVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, - "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" + "com.thesamet.scalapb" %% "scalapb-json4s" % "0.12.0" ) run / fork := true diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index 1a135e536..e7b733bb1 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -8,5 +8,5 @@ val zioGrpcVersion = "0.6.0-rc1" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, - "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" + "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10" ) diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index eaf3443e3..eb61668e7 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -37,27 +37,30 @@ object RouteGuideClientApp extends ZIOAppDefault { val features = RouteGuideServer.featuresDatabase.feature - /** Sends numPoints randomly chosen points from [[features]] with a variable delay in between. Prints the statistics - * when they are sent from the server. + /** Sends numPoints randomly chosen points from [[features]] with a variable + * delay in between. Prints the statistics when they are sent from the + * server. */ // start: recordRoute def recordRoute(numPoints: Int) = for { summary <- RouteGuideClient.recordRoute( - ZStream - .repeatZIO( - nextIntBetween(0, features.size).map(features(_).getLocation) - ) - .tap(p => printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie) - .schedule(Schedule.spaced(300.millis)) - .take(numPoints) - ) - _ <- printLine( - s"Finished trip with ${summary.pointCount} points. " + - s"Passed ${summary.featureCount} features. " + - s"Travelled ${summary.distance} meters. " + - s"It took ${summary.elapsedTime} seconds." - ) + ZStream + .repeatZIO( + nextIntBetween(0, features.size).map(features(_).getLocation) + ) + .tap(p => + printLine(s"Visiting (${p.latitude}, ${p.longitude})").orDie + ) + .schedule(Schedule.spaced(300.millis)) + .take(numPoints) + ) + _ <- printLine( + s"Finished trip with ${summary.pointCount} points. " + + s"Passed ${summary.featureCount} features. " + + s"Travelled ${summary.distance} meters. " + + s"It took ${summary.elapsedTime} seconds." + ) } yield () // end: recordRoute diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index 8cc014f96..e7fa02e30 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -17,8 +17,9 @@ class RouteGuideService( routeNotesRef: Ref[Map[Point, List[RouteNote]]] ) extends ZioRouteGuide.RouteGuide { - /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the requested [[Point]]. If no feature at that - * location exists, a NOT FOUND error is returned. + /** Gets the [[io.grpc.examples.routeguide.route_guide.Feature]] at the + * requested [[Point]]. If no feature at that location exists, a NOT FOUND + * error is returned. * * @param request * the requested location for the feature. @@ -28,16 +29,17 @@ class RouteGuideService( ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND) // end: getFeature - /** Streams all features contained within the given bounding {@link Rectangle}. + /** Streams all features contained within the given bounding {@link + * Rectangle}. * * @param request * the bounding rectangle for the requested features. */ // start: listFeatures def listFeatures(request: Rectangle): ZStream[Any, Status, Feature] = { - val left = request.getLo.longitude min request.getHi.longitude - val right = request.getLo.longitude max request.getHi.longitude - val top = request.getLo.latitude max request.getHi.latitude + val left = request.getLo.longitude min request.getHi.longitude + val right = request.getLo.longitude max request.getHi.longitude + val top = request.getLo.latitude max request.getHi.latitude val bottom = request.getLo.latitude min request.getHi.latitude ZStream.fromIterable( @@ -50,8 +52,9 @@ class RouteGuideService( } // end: listFeatures - /** Gets a stream of points, and responds with statistics about the "trip": number of points, number of known features - * visited, total distance traveled, and total time spent. + /** Gets a stream of points, and responds with statistics about the "trip": + * number of points, number of known features visited, total distance + * traveled, and total time spent. * * @param request * a stream of points to process @@ -62,16 +65,18 @@ class RouteGuideService( ): ZIO[Any, Status, RouteSummary] = // Zips each element with the previous element, initially accompanied by None. request.zipWithPrevious - .runFold(RouteSummary()) { case (summary, (maybePrevPoint, currentPoint)) => - // Compute the next status based on the current status. - summary.copy( - pointCount = summary.pointCount + 1, - featureCount = summary.featureCount + (if (findFeature(currentPoint).isDefined) 1 - else 0), - distance = summary.distance + maybePrevPoint - .map(calcDistance(_, currentPoint)) - .getOrElse(0) - ) + .runFold(RouteSummary()) { + case (summary, (maybePrevPoint, currentPoint)) => + // Compute the next status based on the current status. + summary.copy( + pointCount = summary.pointCount + 1, + featureCount = + summary.featureCount + (if (findFeature(currentPoint).isDefined) 1 + else 0), + distance = summary.distance + maybePrevPoint + .map(calcDistance(_, currentPoint)) + .getOrElse(0) + ) } .timed // returns a new effect that times the execution .map { case (duration, summary) => @@ -104,14 +109,16 @@ class RouteGuideService( * @param location * the location to check * @return - * A non-empty option if a feature is defined at that point, None otherwise. + * A non-empty option if a feature is defined at that point, None + * otherwise. */ // start: findFeature def findFeature(point: Point): Option[Feature] = features.find(f => f.getLocation == point && f.name.nonEmpty) // end: findFeature - /** Calculate the distance between two points using the "haversine" formula. The formula is based on + /** Calculate the distance between two points using the "haversine" formula. + * The formula is based on * http://mathforum.org/library/drmath/view/51879.html. * * @param start @@ -122,14 +129,14 @@ class RouteGuideService( * The distance between the points in meters */ def calcDistance(start: Point, end: Point): Int = { - val r = 6371000 // earth radius in meters + val r = 6371000 // earth radius in meters val CoordFactor: Double = 1e7 - val lat1 = toRadians(start.latitude) / CoordFactor - val lat2 = toRadians(end.latitude) / CoordFactor - val lon1 = toRadians(start.longitude) / CoordFactor - val lon2 = toRadians(end.longitude) / CoordFactor - val deltaLat = lat2 - lat1 - val deltaLon = lon2 - lon1 + val lat1 = toRadians(start.latitude) / CoordFactor + val lat2 = toRadians(end.latitude) / CoordFactor + val lon1 = toRadians(start.longitude) / CoordFactor + val lon2 = toRadians(end.longitude) / CoordFactor + val deltaLat = lat2 - lat1 + val deltaLon = lon2 - lon1 val a = sin(deltaLat / 2) * sin(deltaLat / 2) +cos(lat1) * cos(lat2) * sin(deltaLon / 2) * sin(deltaLon / 2) From 257fdb7fb0a261990302af7a9523348a3657c9d3 Mon Sep 17 00:00:00 2001 From: "Taewoo An (Alan)" Date: Sun, 12 Mar 2023 00:51:33 +0900 Subject: [PATCH 138/245] change Status to StatusRuntimeException(breaking change) (#466) feat: change Status to StatusException with handling trailers on even error --- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 42 ++++++------- .../src/main/scala/scalapb/zio_grpc/GIO.scala | 13 ++-- .../scalapb/zio_grpc/ZClientInterceptor.scala | 10 ++-- .../scalapb/zio_grpc/ZGeneratedService.scala | 7 ++- .../main/scala/scalapb/zio_grpc/package.scala | 8 +-- .../scala/scalapb/zio_grpc/transforms.scala | 59 ++++++++++++------- .../scalapb/zio_grpc/client/ClientCalls.scala | 48 ++++++++------- .../scalapb/zio_grpc/client/ZClientCall.scala | 4 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 40 ++++++------- .../client/StreamingClientCallListener.scala | 10 ++-- .../client/UnaryClientCallListener.scala | 17 +++--- .../scalapb/zio_grpc/client/ZClientCall.scala | 27 ++++----- .../zio_grpc/server/ListenerDriver.scala | 23 ++++---- .../zio_grpc/server/ZServerCallHandler.scala | 42 +++++++------ .../scalapb/zio_grpc/BackpressureSpec.scala | 10 ++-- .../zio_grpc/BindableServiceSpec.scala | 16 +++-- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 38 ++++++++---- .../scalapb/zio_grpc/ListenerDriverSpec.scala | 4 +- .../scalapb/zio_grpc/MetadataTests.scala | 26 ++++++-- .../scalapb/zio_grpc/TestServiceImpl.scala | 47 ++++++++------- .../scalapb/zio_grpc/TestServiceSpec.scala | 8 +-- .../scala/scalapb/zio_grpc/TestUtils.scala | 13 +++- 22 files changed, 288 insertions(+), 224 deletions(-) diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index 249f24735..d05c569af 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -56,23 +56,23 @@ class ZioFilePrinter( ) { import implicits._ - val Channel = "io.grpc.Channel" - val CallOptions = "io.grpc.CallOptions" - val ClientCalls = "scalapb.zio_grpc.client.ClientCalls" - val Duration = "zio.Duration" - val SafeMetadata = "scalapb.zio_grpc.SafeMetadata" - val Status = "io.grpc.Status" - val Deadline = "io.grpc.Deadline" - val methodDescriptor = "io.grpc.MethodDescriptor" - val RequestContext = "scalapb.zio_grpc.RequestContext" - val ZClientCall = "scalapb.zio_grpc.client.ZClientCall" - val ZManagedChannel = "scalapb.zio_grpc.ZManagedChannel" - val ZChannel = "scalapb.zio_grpc.ZChannel" - val ZTransform = "scalapb.zio_grpc.ZTransform" - val Transform = "scalapb.zio_grpc.Transform" - val Nanos = "java.util.concurrent.TimeUnit.NANOSECONDS" - val serverServiceDef = "_root_.io.grpc.ServerServiceDefinition" - private val OuterObject = + val Channel = "io.grpc.Channel" + val CallOptions = "io.grpc.CallOptions" + val ClientCalls = "scalapb.zio_grpc.client.ClientCalls" + val Duration = "zio.Duration" + val SafeMetadata = "scalapb.zio_grpc.SafeMetadata" + val StatusRuntimeException = "io.grpc.StatusRuntimeException" + val Deadline = "io.grpc.Deadline" + val methodDescriptor = "io.grpc.MethodDescriptor" + val RequestContext = "scalapb.zio_grpc.RequestContext" + val ZClientCall = "scalapb.zio_grpc.client.ZClientCall" + val ZManagedChannel = "scalapb.zio_grpc.ZManagedChannel" + val ZChannel = "scalapb.zio_grpc.ZChannel" + val ZTransform = "scalapb.zio_grpc.ZTransform" + val Transform = "scalapb.zio_grpc.Transform" + val Nanos = "java.util.concurrent.TimeUnit.NANOSECONDS" + val serverServiceDef = "_root_.io.grpc.ServerServiceDefinition" + private val OuterObject = file.scalaPackage / s"Zio${NameUtils.snakeCaseToCamelCase(baseName(file.getName), true)}" def scalaFileName = @@ -673,13 +673,13 @@ class ZioFilePrinter( def stream(res: String, envType: String) = envType match { - case "Any" => s"_root_.zio.stream.Stream[$Status, $res]" - case r => s"_root_.zio.stream.ZStream[$r, $Status, $res]" + case "Any" => s"_root_.zio.stream.Stream[$StatusRuntimeException, $res]" + case r => s"_root_.zio.stream.ZStream[$r, $StatusRuntimeException, $res]" } def io(res: String, envType: String) = envType match { - case "Any" => s"_root_.zio.IO[$Status, $res]" - case r => s"_root_.zio.ZIO[$r, $Status, $res]" + case "Any" => s"_root_.zio.IO[$StatusRuntimeException, $res]" + case r => s"_root_.zio.ZIO[$r, $StatusRuntimeException, $res]" } } diff --git a/core/src/main/scala/scalapb/zio_grpc/GIO.scala b/core/src/main/scala/scalapb/zio_grpc/GIO.scala index dcb3b85c2..0ec85a356 100644 --- a/core/src/main/scala/scalapb/zio_grpc/GIO.scala +++ b/core/src/main/scala/scalapb/zio_grpc/GIO.scala @@ -1,15 +1,14 @@ package scalapb.zio_grpc -import zio.Task -import zio.ZIO -import io.grpc.Status +import io.grpc.{Status, StatusRuntimeException} +import zio.{IO, Task, ZIO} object GIO { - def fromTask[A](task: Task[A]) = - task.mapError(e => Status.INTERNAL.withDescription(e.getMessage).withCause(e)) + def fromTask[A](task: Task[A]): IO[StatusRuntimeException, A] = + task.mapError(e => new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage).withCause(e))) @deprecated("use attempt", "0.6.0") - def effect[A](effect: => A) = attempt(effect) + def effect[A](effect: => A): IO[StatusRuntimeException, A] = attempt(effect) - def attempt[A](effect: => A) = fromTask(ZIO.attempt(effect)) + def attempt[A](effect: => A): IO[StatusRuntimeException, A] = fromTask(ZIO.attempt(effect)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala index 743b49da1..843fa8e6d 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala @@ -1,10 +1,8 @@ package scalapb.zio_grpc -import io.grpc.MethodDescriptor -import io.grpc.CallOptions -import zio.IO -import io.grpc.Status +import io.grpc.{CallOptions, MethodDescriptor, StatusRuntimeException} import scalapb.zio_grpc.client.ZClientCall +import zio.IO abstract class ZClientInterceptor { self => @@ -20,7 +18,7 @@ object ZClientInterceptor { effect: ( MethodDescriptor[_, _], CallOptions - ) => IO[Status, SafeMetadata] + ) => IO[StatusRuntimeException, SafeMetadata] ): ZClientInterceptor = new ZClientInterceptor { def interceptCall[Req, Res]( @@ -39,7 +37,7 @@ object ZClientInterceptor { MethodDescriptor[_, _], CallOptions, SafeMetadata - ) => IO[Status, Unit] + ) => IO[StatusRuntimeException, Unit] ): ZClientInterceptor = new ZClientInterceptor { def interceptCall[Req, Res]( diff --git a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala index 327ff5f8f..20ddb3a1d 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala @@ -2,8 +2,7 @@ package scalapb.zio_grpc import zio.UIO import zio.IO -import io.grpc.ServerServiceDefinition -import io.grpc.Status +import io.grpc.{ServerServiceDefinition, StatusRuntimeException} trait ZGeneratedService[-C, S[-_]] { this: S[C] => @@ -12,7 +11,9 @@ trait ZGeneratedService[-C, S[-_]] { def transform(t: Transform): S[C] = transform[C](t.toZTransform[C]) - def transformContextZIO[ContextOut](f: ContextOut => IO[Status, C]): S[ContextOut] = transform(ZTransform(f)) + def transformContextZIO[ContextOut](f: ContextOut => IO[StatusRuntimeException, C]): S[ContextOut] = transform( + ZTransform(f) + ) def transformContext[ContextOut](f: ContextOut => C): S[ContextOut] = transformContextZIO(c => zio.ZIO.succeed(f(c))) } diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index 2ce44eac6..6d1a79520 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -1,13 +1,13 @@ package scalapb -import io.grpc.Status -import zio.{IO, Scope, ZIO} +import io.grpc.StatusRuntimeException import zio.stream.Stream +import zio.{IO, Scope, ZIO} package object zio_grpc { - type GIO[A] = IO[Status, A] + type GIO[A] = IO[StatusRuntimeException, A] - type GStream[A] = Stream[Status, A] + type GStream[A] = Stream[StatusRuntimeException, A] type ZManagedChannel = ZIO[Scope, Throwable, ZChannel] diff --git a/core/src/main/scala/scalapb/zio_grpc/transforms.scala b/core/src/main/scala/scalapb/zio_grpc/transforms.scala index 0493d1555..d6a77891e 100644 --- a/core/src/main/scala/scalapb/zio_grpc/transforms.scala +++ b/core/src/main/scala/scalapb/zio_grpc/transforms.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc import zio.ZIO import zio.stream.ZStream -import io.grpc.Status +import io.grpc.StatusRuntimeException /** Describes a transformation for all effects and streams of a service. * @@ -11,33 +11,40 @@ import io.grpc.Status */ trait Transform { self => - def effect[A](io: ZIO[Any, Status, A]): ZIO[Any, Status, A] - def stream[A](io: ZStream[Any, Status, A]): ZStream[Any, Status, A] + def effect[A](io: ZIO[Any, StatusRuntimeException, A]): ZIO[Any, StatusRuntimeException, A] + def stream[A](io: ZStream[Any, StatusRuntimeException, A]): ZStream[Any, StatusRuntimeException, A] // Converts this Transform to ZTransform that transforms the effects like this, but // leaves the Context unchanged. def toZTransform[Context]: ZTransform[Context, Context] = new ZTransform[Context, Context] { - def effect[A](io: Context => ZIO[Any, Status, A]): Context => ZIO[Any, Status, A] = { c => + def effect[A]( + io: Context => ZIO[Any, StatusRuntimeException, A] + ): Context => ZIO[Any, StatusRuntimeException, A] = { c => self.effect(io(c)) } - def stream[A](io: Context => ZStream[Any, Status, A]): Context => ZStream[Any, Status, A] = { c => + def stream[A]( + io: Context => ZStream[Any, StatusRuntimeException, A] + ): Context => ZStream[Any, StatusRuntimeException, A] = { c => self.stream(io(c)) } } def andThen(other: Transform): Transform = new Transform { - def effect[A](io: ZIO[Any, Status, A]): ZIO[Any, Status, A] = other.effect(self.effect(io)) + def effect[A](io: ZIO[Any, StatusRuntimeException, A]): ZIO[Any, StatusRuntimeException, A] = + other.effect(self.effect(io)) - def stream[A](io: ZStream[Any, Status, A]): ZStream[Any, Status, A] = other.stream(self.stream(io)) + def stream[A](io: ZStream[Any, StatusRuntimeException, A]): ZStream[Any, StatusRuntimeException, A] = + other.stream(self.stream(io)) } } object Transform { def fromZTransform(ct: ZTransform[Any, Any]) = new Transform { - def effect[A](io: ZIO[Any, Status, A]): ZIO[Any, Status, A] = ct.effect(_ => io)(()) + def effect[A](io: ZIO[Any, StatusRuntimeException, A]): ZIO[Any, StatusRuntimeException, A] = ct.effect(_ => io)(()) - def stream[A](io: ZStream[Any, Status, A]): ZStream[Any, Status, A] = ct.stream(_ => io)(()) + def stream[A](io: ZStream[Any, StatusRuntimeException, A]): ZStream[Any, StatusRuntimeException, A] = + ct.stream(_ => io)(()) } } @@ -48,32 +55,44 @@ object Transform { */ trait ZTransform[+ContextIn, -ContextOut] { self => - def effect[A](io: ContextIn => ZIO[Any, Status, A]): (ContextOut => ZIO[Any, Status, A]) - def stream[A](io: ContextIn => ZStream[Any, Status, A]): (ContextOut => ZStream[Any, Status, A]) + def effect[A]( + io: ContextIn => ZIO[Any, StatusRuntimeException, A] + ): (ContextOut => ZIO[Any, StatusRuntimeException, A]) + def stream[A]( + io: ContextIn => ZStream[Any, StatusRuntimeException, A] + ): (ContextOut => ZStream[Any, StatusRuntimeException, A]) def andThen[ContextIn2 <: ContextOut, ContextOut2]( other: ZTransform[ContextIn2, ContextOut2] ): ZTransform[ContextIn, ContextOut2] = new ZTransform[ContextIn, ContextOut2] { - def effect[A](io: ContextIn => ZIO[Any, Status, A]): ContextOut2 => ZIO[Any, Status, A] = + def effect[A]( + io: ContextIn => ZIO[Any, StatusRuntimeException, A] + ): ContextOut2 => ZIO[Any, StatusRuntimeException, A] = other.effect(self.effect(io)) - def stream[A](io: ContextIn => ZStream[Any, Status, A]): ContextOut2 => ZStream[Any, Status, A] = + def stream[A]( + io: ContextIn => ZStream[Any, StatusRuntimeException, A] + ): ContextOut2 => ZStream[Any, StatusRuntimeException, A] = other.stream(self.stream(io)) } } object ZTransform { // Returns a ZTransform that effectfully transforms the context parameter - def apply[ContextIn, ContextOut](f: ContextOut => ZIO[Any, Status, ContextIn]): ZTransform[ContextIn, ContextOut] = + def apply[ContextIn, ContextOut]( + f: ContextOut => ZIO[Any, StatusRuntimeException, ContextIn] + ): ZTransform[ContextIn, ContextOut] = new ZTransform[ContextIn, ContextOut] { - def effect[A](io: ContextIn => ZIO[Any, Status, A]): ContextOut => ZIO[Any, Status, A] = { - (context: ContextOut) => - f(context).flatMap(io) + def effect[A]( + io: ContextIn => ZIO[Any, StatusRuntimeException, A] + ): ContextOut => ZIO[Any, StatusRuntimeException, A] = { (context: ContextOut) => + f(context).flatMap(io) } - def stream[A](io: ContextIn => ZStream[Any, Status, A]): ContextOut => ZStream[Any, Status, A] = { - (context: ContextOut) => - ZStream.fromZIO(f(context)).flatMap(io) + def stream[A]( + io: ContextIn => ZStream[Any, StatusRuntimeException, A] + ): ContextOut => ZStream[Any, StatusRuntimeException, A] = { (context: ContextOut) => + ZStream.fromZIO(f(context)).flatMap(io) } } } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index 584684f86..ac89f973f 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -5,10 +5,8 @@ import scalapb.zio_grpc.ResponseContext import scalapb.zio_grpc.ResponseFrame import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.ZChannel -import io.grpc.MethodDescriptor -import io.grpc.CallOptions +import io.grpc.{CallOptions, MethodDescriptor, Status, StatusRuntimeException} import scalapb.grpcweb.native.ErrorInfo -import io.grpc.Status import zio.stream.ZStream import scalapb.grpcweb.native.StatusInfo @@ -20,8 +18,8 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[Status, ResponseContext[Res]] = - ZIO.fail(Status.INTERNAL.withDescription("Not supported")) + ): IO[StatusRuntimeException, ResponseContext[Res]] = + ZIO.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) def serverStreamingCall[Req, Res]( channel: ZChannel, @@ -29,26 +27,26 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, Status, ResponseFrame[Res]] = - ZStream.fail(Status.INTERNAL.withDescription("Not supported")) + ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + ZStream.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) def clientStreamingCall[Req, Res]( channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): IO[Status, ResponseContext[Res]] = - ZIO.fail(Status.INTERNAL.withDescription("Not supported")) + req: ZStream[Any, StatusRuntimeException, Req] + ): IO[StatusRuntimeException, ResponseContext[Res]] = + ZIO.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) def bidiCall[Req, Res]( channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): ZStream[Any, Status, ResponseFrame[Res]] = - ZStream.fail(Status.INTERNAL.withDescription("Not supported")) + req: ZStream[Any, StatusRuntimeException, Req] + ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + ZStream.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) } def unaryCall[Req, Res]( @@ -57,7 +55,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[Status, Res] = + ): IO[StatusRuntimeException, Res] = ZIO.async { callback => channel.channel.client.rpcCall[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -66,7 +64,7 @@ object ClientCalls { method.methodInfo, (errorInfo: ErrorInfo, resp: Res) => if (errorInfo != null) - callback(ZIO.fail(Status.fromErrorInfo(errorInfo))) + callback(ZIO.fail(new StatusRuntimeException(Status.fromErrorInfo(errorInfo)))) else callback(ZIO.succeed(resp)) ) } @@ -77,8 +75,8 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, Status, Res] = - ZStream.async[Any, Status, Res] { cb => + ): ZStream[Any, StatusRuntimeException, Res] = + ZStream.async[Any, StatusRuntimeException, Res] { cb => channel.channel.client .serverStreaming[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -95,7 +93,7 @@ object ClientCalls { .on( "error", { (ei: ErrorInfo) => - val _ = cb(ZIO.fail(Some(Status.fromErrorInfo(ei)))) + val _ = cb(ZIO.fail(Some(new StatusRuntimeException(Status.fromErrorInfo(ei))))) } ) .on( @@ -108,7 +106,7 @@ object ClientCalls { "status", (status: StatusInfo) => if (status.code != 0) - cb(ZIO.fail(Some(Status.fromStatusInfo(status)))) + cb(ZIO.fail(Some(new StatusRuntimeException(Status.fromStatusInfo(status))))) ) } @@ -117,16 +115,16 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): ZIO[Any, Status, Res] = - ZIO.fail(Status.INTERNAL.withDescription("Not supported")) + req: ZStream[Any, StatusRuntimeException, Req] + ): ZIO[Any, StatusRuntimeException, Res] = + ZIO.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) def bidiCall[Req, Res]( channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): ZStream[Any, Status, Res] = - ZStream.fail(Status.INTERNAL.withDescription("Not supported")) + req: ZStream[Any, StatusRuntimeException, Req] + ): ZStream[Any, StatusRuntimeException, Res] = + ZStream.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala index 4ad3a958b..e0c216b06 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala @@ -1,7 +1,7 @@ package scalapb.zio_grpc.client import zio.IO -import io.grpc.Status +import io.grpc.StatusRuntimeException import scalapb.zio_grpc.SafeMetadata trait ZClientCall[Req, Res] extends Any @@ -11,6 +11,6 @@ object ZClientCall { def headersTransformer[Req, Res]( clientCall: ZClientCall[Req, Res], - fetchHeaders: SafeMetadata => IO[Status, SafeMetadata] + fetchHeaders: SafeMetadata => IO[StatusRuntimeException, SafeMetadata] ) = ??? } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala index b4cb14dad..d09b2971b 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc.client -import io.grpc.{CallOptions, MethodDescriptor, Status} +import io.grpc.{CallOptions, MethodDescriptor, StatusRuntimeException} import scalapb.zio_grpc.{ResponseContext, ResponseFrame, SafeMetadata, ZChannel} import zio.stream.ZStream import zio.{Exit, IO, ZIO} @@ -12,7 +12,7 @@ object ClientCalls { call: ZClientCall[Req, Res], headers: SafeMetadata, req: Req - ): IO[Status, ResponseContext[Res]] = + ): IO[StatusRuntimeException, ResponseContext[Res]] = ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => call.start(listener, headers) *> call.request(1) *> @@ -27,7 +27,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[Status, ResponseContext[Res]] = + ): IO[StatusRuntimeException, ResponseContext[Res]] = channel .newCall(method, options) .flatMap(unaryCall(_, headers, req)) @@ -36,7 +36,7 @@ object ClientCalls { call: ZClientCall[Req, Res], headers: SafeMetadata, req: Req - ): ZStream[Any, Status, ResponseFrame[Res]] = + ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = ZStream .acquireReleaseExitWith( StreamingClientCallListener.make[Res](call) @@ -58,7 +58,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, Status, ResponseFrame[Res]] = + ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = ZStream .fromZIO(channel.newCall(method, options)) .flatMap(serverStreamingCall(_, headers, req)) @@ -66,8 +66,8 @@ object ClientCalls { private def clientStreamingCall[Req, Res]( call: ZClientCall[Req, Res], headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): IO[Status, ResponseContext[Res]] = + req: ZStream[Any, StatusRuntimeException, Req] + ): IO[StatusRuntimeException, ResponseContext[Res]] = ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain val resultStream = ZStream.fromZIO(listener.getValue) @@ -85,8 +85,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): IO[Status, ResponseContext[Res]] = + req: ZStream[Any, StatusRuntimeException, Req] + ): IO[StatusRuntimeException, ResponseContext[Res]] = channel .newCall(method, options) .flatMap( @@ -100,8 +100,8 @@ object ClientCalls { private def bidiCall[Req, Res]( call: ZClientCall[Req, Res], headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): ZStream[Any, Status, ResponseFrame[Res]] = + req: ZStream[Any, StatusRuntimeException, Req] + ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = ZStream .acquireReleaseExitWith( StreamingClientCallListener.make[Res](call) @@ -123,8 +123,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): ZStream[Any, Status, ResponseFrame[Res]] = + req: ZStream[Any, StatusRuntimeException, Req] + ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = ZStream .fromZIO( channel.newCall(method, options) @@ -134,7 +134,7 @@ object ClientCalls { def exitHandler[Req, Res]( call: ZClientCall[Req, Res] - )(l: Any, ex: Exit[Status, Any]) = anyExitHandler(call)(l, ex) + )(l: Any, ex: Exit[StatusRuntimeException, Any]) = anyExitHandler(call)(l, ex) // less type safe def anyExitHandler[Req, Res]( @@ -151,7 +151,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[Status, Res] = + ): IO[StatusRuntimeException, Res] = withMetadata.unaryCall(channel, method, options, headers, req).map(_.response) def serverStreamingCall[Req, Res]( @@ -160,7 +160,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, Status, Res] = + ): ZStream[Any, StatusRuntimeException, Res] = withMetadata .serverStreamingCall(channel, method, options, headers, req) .collect { case ResponseFrame.Message(x) => x } @@ -170,8 +170,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): IO[Status, Res] = + req: ZStream[Any, StatusRuntimeException, Req] + ): IO[StatusRuntimeException, Res] = withMetadata.clientStreamingCall(channel, method, options, headers, req).map(_.response) def bidiCall[Req, Res]( @@ -179,8 +179,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, Status, Req] - ): ZStream[Any, Status, Res] = + req: ZStream[Any, StatusRuntimeException, Req] + ): ZStream[Any, StatusRuntimeException, Res] = withMetadata .bidiCall(channel, method, options, headers, req) .collect { case ResponseFrame.Message(x) => x } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 4e3ca60f7..7b6a2bfea 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -1,8 +1,7 @@ package scalapb.zio_grpc.client import scalapb.zio_grpc.ResponseFrame -import io.grpc.ClientCall -import io.grpc.{Metadata, Status} +import io.grpc.{ClientCall, Metadata, Status, StatusRuntimeException} import zio.stream.ZStream import zio._ @@ -33,12 +32,13 @@ class StreamingClientCallListener[Res]( runtime.unsafe.run(queue.offer(ResponseFrame.Trailers(status, trailers)).unit).getOrThrowFiberFailure() } - def stream: ZStream[Any, Status, ResponseFrame[Res]] = + def stream: ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = ZStream .fromQueue(queue) .tap { - case ResponseFrame.Trailers(status, _) => queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(status)) - case _ => ZIO.unit + case ResponseFrame.Trailers(status, trailers) => + queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(new StatusRuntimeException(status, trailers))) + case _ => ZIO.unit } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index 00c82740a..62ed4ecc8 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -1,8 +1,7 @@ package scalapb.zio_grpc.client import zio.{IO, Promise, Ref, Runtime, Unsafe} -import io.grpc.ClientCall -import io.grpc.{Metadata, Status} +import io.grpc.{ClientCall, Metadata, Status, StatusRuntimeException} import UnaryCallState._ import scalapb.zio_grpc.ResponseContext @@ -21,7 +20,7 @@ object UnaryCallState { class UnaryClientCallListener[Res]( runtime: Runtime[Any], state: Ref[UnaryCallState[Res]], - promise: Promise[Status, ResponseContext[Res]] + promise: Promise[StatusRuntimeException, ResponseContext[Res]] ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = @@ -59,16 +58,18 @@ class UnaryClientCallListener[Res]( .run { for { s <- state.get - _ <- if (!status.isOk) promise.fail(status) + _ <- if (!status.isOk) promise.fail(new StatusRuntimeException(status, trailers)) else s match { case ResponseReceived(headers, message) => promise.succeed(ResponseContext(headers, message, trailers)) case Failure(errorMessage) => - promise.fail(Status.INTERNAL.withDescription(errorMessage)) + promise.fail( + Status.INTERNAL.withDescription(errorMessage).asRuntimeException() + ) case _ => promise.fail( - Status.INTERNAL.withDescription("No data received") + Status.INTERNAL.withDescription("No data received").asRuntimeException() ) } } yield () @@ -76,7 +77,7 @@ class UnaryClientCallListener[Res]( .getOrThrowFiberFailure() } - def getValue: IO[Status, ResponseContext[Res]] = promise.await + def getValue: IO[StatusRuntimeException, ResponseContext[Res]] = promise.await } object UnaryClientCallListener { @@ -84,6 +85,6 @@ object UnaryClientCallListener { for { runtime <- zio.ZIO.runtime[Any] state <- Ref.make[UnaryCallState[Res]](Initial) - promise <- Promise.make[Status, ResponseContext[Res]] + promise <- Promise.make[StatusRuntimeException, ResponseContext[Res]] } yield new UnaryClientCallListener[Res](runtime, state, promise) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala index d17d1515c..612b34c4c 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala @@ -1,10 +1,9 @@ package scalapb.zio_grpc.client -import io.grpc.ClientCall +import io.grpc.{ClientCall, StatusRuntimeException} import io.grpc.ClientCall.Listener import scalapb.zio_grpc.GIO import zio.IO -import io.grpc.Status import scalapb.zio_grpc.SafeMetadata trait ZClientCall[Req, Res] extends Any { @@ -12,15 +11,15 @@ trait ZClientCall[Req, Res] extends Any { def start( responseListener: Listener[Res], headers: SafeMetadata - ): IO[Status, Unit] + ): IO[StatusRuntimeException, Unit] - def request(numMessages: Int): IO[Status, Unit] + def request(numMessages: Int): IO[StatusRuntimeException, Unit] - def cancel(message: String): IO[Status, Unit] + def cancel(message: String): IO[StatusRuntimeException, Unit] - def halfClose(): IO[Status, Unit] + def halfClose(): IO[StatusRuntimeException, Unit] - def sendMessage(message: Req): IO[Status, Unit] + def sendMessage(message: Req): IO[StatusRuntimeException, Unit] } class ZClientCallImpl[Req, Res](private val call: ClientCall[Req, Res]) extends AnyVal with ZClientCall[Req, Res] { @@ -49,29 +48,29 @@ object ZClientCall { override def start( responseListener: Listener[Res], headers: SafeMetadata - ): IO[Status, Unit] = delegate.start(responseListener, headers) + ): IO[StatusRuntimeException, Unit] = delegate.start(responseListener, headers) - override def request(numMessages: Int): IO[Status, Unit] = + override def request(numMessages: Int): IO[StatusRuntimeException, Unit] = delegate.request(numMessages) - override def cancel(message: String): IO[Status, Unit] = + override def cancel(message: String): IO[StatusRuntimeException, Unit] = delegate.cancel(message) - override def halfClose(): IO[Status, Unit] = delegate.halfClose() + override def halfClose(): IO[StatusRuntimeException, Unit] = delegate.halfClose() - override def sendMessage(message: Req): IO[Status, Unit] = + override def sendMessage(message: Req): IO[StatusRuntimeException, Unit] = delegate.sendMessage(message) } def headersTransformer[Req, Res]( clientCall: ZClientCall[Req, Res], - updateHeaders: SafeMetadata => IO[Status, SafeMetadata] + updateHeaders: SafeMetadata => IO[StatusRuntimeException, SafeMetadata] ): ZClientCall[Req, Res] = new ForwardingZClientCall[Req, Res](clientCall) { override def start( responseListener: Listener[Res], headers: SafeMetadata - ): IO[Status, Unit] = + ): IO[StatusRuntimeException, Unit] = updateHeaders(headers) flatMap { h => delegate.start(responseListener, h) } } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala index e4efb8540..6c046fec5 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala @@ -1,18 +1,17 @@ package scalapb.zio_grpc.server import io.grpc.ServerCall.Listener -import io.grpc.Status +import io.grpc.{Metadata, Status, StatusRuntimeException} import zio._ import zio.stream.{Stream, ZStream} import scalapb.zio_grpc.RequestContext -import io.grpc.Metadata object ListenerDriver { - def exitToStatus(ex: Exit[Status, Unit]): Status = + def exitToStatus(ex: Exit[StatusRuntimeException, Unit]): Status = ex.foldExit( failed = { cause => if (cause.isInterruptedOnly) Status.CANCELLED - else cause.failureOption.getOrElse(Status.INTERNAL) + else cause.failureOption.map(_.getStatus).getOrElse(Status.INTERNAL) }, completed = _ => Status.OK ) @@ -20,10 +19,10 @@ object ListenerDriver { def unaryInputListener[Req]( runtime: Runtime[Any], call: ZServerCall[_], - completed: Promise[Status, Unit], + completed: Promise[StatusRuntimeException, Unit], request: Promise[Nothing, Req], requestContext: RequestContext, - writeResponse: Req => ZIO[Any, Status, Unit] + writeResponse: Req => ZIO[Any, StatusRuntimeException, Unit] ): ZIO[Any, Nothing, Listener[Req]] = ( call.request(2) *> @@ -56,7 +55,7 @@ object ListenerDriver { request.succeed(message).flatMap { case false => completed - .fail(Status.INTERNAL.withDescription("Too many requests")) + .fail(Status.INTERNAL.withDescription("Too many requests").asRuntimeException()) .unit case true => ZIO.unit @@ -83,14 +82,14 @@ object ListenerDriver { Req, RequestContext, ZServerCall[Res] - ) => ZIO[Any, Status, Unit], + ) => ZIO[Any, StatusRuntimeException, Unit], runtime: Runtime[Any] )( zioCall: ZServerCall[Res], requestContext: RequestContext ): ZIO[Any, Nothing, Listener[Req]] = for { - completed <- Promise.make[Status, Unit] + completed <- Promise.make[StatusRuntimeException, Unit] request <- Promise.make[Nothing, Req] listener <- unaryInputListener( runtime, @@ -107,7 +106,7 @@ object ListenerDriver { call: ZServerCall[Res], queue: Queue[Option[Req]], requestContext: RequestContext, - writeResponse: Stream[Status, Req] => ZIO[Any, Status, Unit] + writeResponse: Stream[StatusRuntimeException, Req] => ZIO[Any, StatusRuntimeException, Unit] ): ZIO[Any, Nothing, Listener[Req]] = { val requestStream = ZStream .fromQueue(queue) @@ -156,10 +155,10 @@ object ListenerDriver { */ def makeStreamingInputListener[Req, Res]( writeResponse: ( - Stream[Status, Req], + Stream[StatusRuntimeException, Req], RequestContext, ZServerCall[Res] - ) => ZIO[Any, Status, Unit] + ) => ZIO[Any, StatusRuntimeException, Unit] )( zioCall: ZServerCall[Res], requestContext: RequestContext diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 6fe5b2115..f53dd139e 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc.server import zio._ import io.grpc.ServerCall.Listener -import io.grpc.Status +import io.grpc.{Status, StatusRuntimeException} import zio.stream.Stream import io.grpc.ServerCall import io.grpc.ServerCallHandler @@ -40,27 +40,27 @@ class ZServerCallHandler[Req, Res]( object ZServerCallHandler { private[zio_grpc] val queueSizeProp = "zio-grpc.backpressure-queue-size" - val backpressureQueueSize: IO[Status, Int] = + val backpressureQueueSize: IO[StatusRuntimeException, Int] = ZIO .attempt(sys.props.get(queueSizeProp).map(_.toInt).getOrElse(16)) .refineToOrDie[NumberFormatException] .catchAll { t => - ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}")) + ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}").asRuntimeException()) } def unaryInput[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[Any, Status, Unit] + impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[Any, StatusRuntimeException, Unit] ): ServerCallHandler[Req, Res] = new ZServerCallHandler(runtime, ListenerDriver.makeUnaryInputListener(impl, runtime)) def streamingInput[Req, Res]( runtime: Runtime[Any], impl: ( - Stream[Status, Req], + Stream[StatusRuntimeException, Req], RequestContext, ZServerCall[Res] - ) => ZIO[Any, Status, Unit] + ) => ZIO[Any, StatusRuntimeException, Unit] ): ServerCallHandler[Req, Res] = new ZServerCallHandler( runtime, @@ -69,16 +69,17 @@ object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext) => ZIO[Any, Status, Res] + impl: (Req, RequestContext) => ZIO[Any, StatusRuntimeException, Res] ): ServerCallHandler[Req, Res] = unaryInput[Req, Res]( runtime, - (req, requestContext, call) => impl(req, requestContext).flatMap[Any, Status, Unit](call.sendMessage) + (req, requestContext, call) => + impl(req, requestContext).flatMap[Any, StatusRuntimeException, Unit](call.sendMessage) ) def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext) => ZStream[Any, Status, Res] + impl: (Req, RequestContext) => ZStream[Any, StatusRuntimeException, Res] ): ServerCallHandler[Req, Res] = unaryInput[Req, Res]( runtime, @@ -88,16 +89,17 @@ object ZServerCallHandler { def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Stream[Status, Req], RequestContext) => ZIO[Any, Status, Res] + impl: (Stream[StatusRuntimeException, Req], RequestContext) => ZIO[Any, StatusRuntimeException, Res] ): ServerCallHandler[Req, Res] = streamingInput[Req, Res]( runtime, - (req, requestContext, call) => impl(req, requestContext).flatMap[Any, Status, Unit](call.sendMessage) + (req, requestContext, call) => + impl(req, requestContext).flatMap[Any, StatusRuntimeException, Unit](call.sendMessage) ) def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Stream[Status, Req], RequestContext) => ZStream[Any, Status, Res] + impl: (Stream[StatusRuntimeException, Req], RequestContext) => ZStream[Any, StatusRuntimeException, Res] ): ServerCallHandler[Req, Res] = streamingInput[Req, Res]( runtime, @@ -106,17 +108,19 @@ object ZServerCallHandler { def serverStreamingWithBackpressure[Res]( call: ZServerCall[Res], - stream: ZStream[Any, Status, Res] - ): ZIO[Any, Status, Unit] = { - def takeFromQueue(queue: Dequeue[Exit[Option[Status], Res]]): ZIO[Any, Status, Unit] = + stream: ZStream[Any, StatusRuntimeException, Res] + ): ZIO[Any, StatusRuntimeException, Unit] = { + def takeFromQueue( + queue: Dequeue[Exit[Option[StatusRuntimeException], Res]] + ): ZIO[Any, StatusRuntimeException, Unit] = queue.takeAll.flatMap(takeFromCache(_, queue)) def takeFromCache( - xs: Chunk[Exit[Option[Status], Res]], - queue: Dequeue[Exit[Option[Status], Res]] - ): ZIO[Any, Status, Unit] = + xs: Chunk[Exit[Option[StatusRuntimeException], Res]], + queue: Dequeue[Exit[Option[StatusRuntimeException], Res]] + ): ZIO[Any, StatusRuntimeException, Unit] = ZIO.suspendSucceed { - @tailrec def innerLoop(loop: Boolean, i: Int): IO[Status, Unit] = + @tailrec def innerLoop(loop: Boolean, i: Int): IO[StatusRuntimeException, Unit] = if (i < xs.length && loop) { xs(i) match { case Failure(cause) => diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala index efde92b66..b057090b6 100644 --- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala +++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import io.grpc.Status +import io.grpc.StatusRuntimeException import io.grpc.inprocess.InProcessServerBuilder import scalapb.zio_grpc.testservice.Request import scalapb.zio_grpc.testservice.Response @@ -31,15 +31,15 @@ object BackpressureSpec extends ZIOSpecDefault { new ZioTestservice.TestService { val responses = ZStream.iterate(0)(_ + 1).map(i => Response(i.toString)).take(100) - def bidiStreaming(request: zio.stream.Stream[Status, Request]): ZStream[Any with Any, Status, Response] = + def bidiStreaming(request: zio.stream.Stream[StatusRuntimeException, Request]): ZStream[Any with Any, StatusRuntimeException, Response] = request.drain ++ responses - def serverStreaming(request: Request): ZStream[Any with Any, Status, Response] = + def serverStreaming(request: Request): ZStream[Any with Any, StatusRuntimeException, Response] = responses - def clientStreaming(request: zio.stream.Stream[Status, Request]): ZIO[Any with Any, Status, Response] = ??? + def clientStreaming(request: zio.stream.Stream[StatusRuntimeException, Request]): ZIO[Any with Any, StatusRuntimeException, Response] = ??? - def unary(request: Request): ZIO[Any with Any, Status, Response] = ??? + def unary(request: Request): ZIO[Any with Any, StatusRuntimeException, Response] = ??? } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index aed8f8697..851801b14 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -3,11 +3,12 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.ZioTestservice.TestService import scalapb.zio_grpc.testservice.ZioTestservice.ZTestService import zio.ZIO -import io.grpc.Status +import io.grpc.StatusRuntimeException import scalapb.zio_grpc.testservice.{Request, Response} import io.grpc.ServerBuilder import zio.test._ import zio.IO +import zio.stream.Stream object BindableServiceSpec extends ZIOSpecDefault { implicitly[ZBindableService[ZTestService[RequestContext]]] @@ -17,16 +18,19 @@ object BindableServiceSpec extends ZIOSpecDefault { class UnimpTestService[C] extends ZTestService[C] { - override def unary(request: Request, context: C): IO[Status, Response] = ??? + override def unary(request: Request, context: C): IO[StatusRuntimeException, Response] = ??? - override def serverStreaming(request: Request, context: C): zio.stream.Stream[Status, Response] = ??? + override def serverStreaming(request: Request, context: C): Stream[StatusRuntimeException, Response] = ??? - override def clientStreaming(request: zio.stream.Stream[Status, Request], context: C): IO[Status, Response] = ??? + override def clientStreaming( + request: Stream[StatusRuntimeException, Request], + context: C + ): IO[StatusRuntimeException, Response] = ??? override def bidiStreaming( - request: zio.stream.Stream[Status, Request], + request: zio.stream.Stream[StatusRuntimeException, Request], context: C - ): zio.stream.Stream[Status, Response] = ??? + ): Stream[StatusRuntimeException, Response] = ??? } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 96dc77fee..195dfeb3c 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -8,7 +8,7 @@ import testservice._ import io.grpc.ServerBuilder import io.grpc.Metadata import io.grpc.ManagedChannelBuilder -import io.grpc.Status +import io.grpc.{Status, StatusRuntimeException} import zio.stream.ZStream object EnvSpec extends ZIOSpecDefault with MetadataTests { @@ -17,18 +17,22 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { case class Context(user: User, response: SafeMetadata) object ServiceWithConsole extends ZTestService[Context] { - def unary(request: Request, context: Context): ZIO[Any, Status, Response] = + def unary(request: Request, context: Context): ZIO[Any, StatusRuntimeException, Response] = for { _ <- context.response.put(RequestIdKey, "1") - } yield Response(out = context.user.name) + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + } yield Response(context.user.name) def serverStreaming( request: Request, context: Context - ): ZStream[Any, Status, Response] = + ): ZStream[Any, StatusRuntimeException, Response] = ZStream .fromZIO( - context.response.put(RequestIdKey, "1") + for { + _ <- context.response.put(RequestIdKey, "1") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + } yield () ) .drain ++ ZStream( @@ -37,31 +41,39 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { ) def clientStreaming( - request: zio.stream.ZStream[Any, Status, Request], + request: ZStream[Any, StatusRuntimeException, Request], context: Context - ): ZIO[Any, Status, Response] = + ): ZIO[Any, StatusRuntimeException, Response] = for { _ <- context.response.put(RequestIdKey, "1") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") } yield Response(context.user.name) def bidiStreaming( - request: zio.stream.ZStream[Any, Status, Request], + request: ZStream[Any, StatusRuntimeException, Request], context: Context - ): ZStream[Any, Status, Response] = - ZStream.fromZIO(context.response.put(RequestIdKey, "1")).drain ++ ZStream(Response(context.user.name)) + ): ZStream[Any, StatusRuntimeException, Response] = + ZStream + .fromZIO( + for { + _ <- context.response.put(RequestIdKey, "1") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + } yield () + ) + .drain ++ ZStream(Response(context.user.name)) } val UserKey = Metadata.Key.of("user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) - def parseUser(rc: RequestContext): IO[Status, Context] = + def parseUser(rc: RequestContext): IO[StatusRuntimeException, Context] = rc.metadata.get(UserKey).flatMap { case Some("alice") => ZIO.fail( - Status.PERMISSION_DENIED.withDescription("You are not allowed!") + Status.PERMISSION_DENIED.withDescription("You are not allowed!").asRuntimeException() ) case Some(name) => ZIO.succeed(Context(User(name), rc.responseMetadata)) - case None => ZIO.fail(Status.UNAUTHENTICATED) + case None => ZIO.fail(Status.UNAUTHENTICATED.asRuntimeException()) } val serviceLayer = ZLayer.succeed(ServiceWithConsole.transformContextZIO(parseUser(_))) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala index 6195f2bd5..b0e1b4b75 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala @@ -17,11 +17,11 @@ object ListenerDriverSpec extends ZIOSpecDefault { for { delay <- nextIntBetween(100, 200) _ <- ClockLive.sleep(delay.milliseconds) - _ <- ZIO.fail(Status.INVALID_ARGUMENT.withDescription(s"i=$i")) + _ <- ZIO.fail(Status.INVALID_ARGUMENT.withDescription(s"i=$i").asRuntimeException()) } yield () ) .withParallelism(128) - assertZIO(effectWithInterruptAndFailure.exit map ListenerDriver.exitToStatus)( + assertZIO(effectWithInterruptAndFailure.exit.map(ListenerDriver.exitToStatus(_).asRuntimeException()))( hasStatusCode(Status.INVALID_ARGUMENT) ) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala index bc47cb2d0..cd2f0341c 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala @@ -22,14 +22,15 @@ trait MetadataTests { val authClient = clientLayer(Some("bob")) val unauthClient = clientLayer(Some("alice")) + val errorClient = clientLayer(Some("Eve")) val unsetClient = clientLayer(None) - val permissionDenied = fails(hasStatusCode(Status.PERMISSION_DENIED)) - val unauthenticated = fails(hasStatusCode(Status.UNAUTHENTICATED)) + val permissionDenied = fails(hasStatusCode(Status.PERMISSION_DENIED)) + val unauthenticated = fails(hasStatusCode(Status.UNAUTHENTICATED)) + val errorWithTrailers = fails(hasStatusCode(Status.FAILED_PRECONDITION) && hasTrailerValue(RequestIdKey, "1")) val unaryEffect = TestServiceClient.unary(Request()) - val serverStreamingEffect = - TestServiceClient.serverStreaming(Request()).runCollect + val serverStreamingEffect = TestServiceClient.serverStreaming(Request()).runCollect val clientStreamingEffect = TestServiceClient.clientStreaming(ZStream.empty) val bidiEffect = TestServiceClient.bidiStreaming(ZStream.empty).runCollect @@ -150,10 +151,27 @@ trait MetadataTests { } ).provideLayer(clientMetadataLayer) + def errorWithTrailersSuite = + suite("errro response with trailers")( + test("unary") { + assertZIO(unaryEffect.exit)(errorWithTrailers) + }, + test("server streaming") { + assertZIO(serverStreamingEffect.exit)(errorWithTrailers) + }, + test("client streaming") { + assertZIO(clientStreamingEffect.exit)(errorWithTrailers) + }, + test("bidi streaming") { + assertZIO(bidiEffect.exit)(errorWithTrailers) + } + ).provideLayer(errorClient) + val specs = suite("Metadata")( permissionDeniedSuite, unauthenticatedSuite, authenticatedSuite, + errorWithTrailersSuite, metadataSuite ) @@ TestAspect.timeout(10.seconds) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index f539885f6..acfd4aded 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -3,7 +3,7 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.Request import zio.{Clock, Console, Exit, Promise, ZIO, ZLayer} import scalapb.zio_grpc.testservice.Response -import io.grpc.Status +import io.grpc.{Status, StatusRuntimeException} import scalapb.zio_grpc.testservice.Request.Scenario import zio.stream.{Stream, ZStream} import zio.ZEnvironment @@ -19,30 +19,32 @@ package object server { class Service( requestReceived: zio.Promise[Nothing, Unit], delayReceived: zio.Promise[Nothing, Unit], - exit: zio.Promise[Nothing, Exit[Status, Response]] + exit: zio.Promise[Nothing, Exit[StatusRuntimeException, Response]] )(clock: Clock, console: Console) extends testservice.ZioTestservice.TestService { - def unary(request: Request): ZIO[Any, Status, Response] = + def unary(request: Request): ZIO[Any, StatusRuntimeException, Response] = (requestReceived.succeed(()) *> (request.scenario match { case Scenario.OK => ZIO.succeed( Response(out = "Res" + request.in.toString) ) case Scenario.ERROR_NOW => - ZIO.fail(Status.INTERNAL.withDescription("FOO!")) + ZIO.fail(Status.INTERNAL.withDescription("FOO!").asRuntimeException()) case Scenario.DELAY => ZIO.never case Scenario.DIE => ZIO.die(new RuntimeException("FOO")) - case _ => ZIO.fail(Status.UNKNOWN) + case _ => ZIO.fail(Status.UNKNOWN.asRuntimeException()) })).onExit(exit.succeed(_)) - def serverStreaming(request: Request): ZStream[Any, Status, Response] = + def serverStreaming( + request: Request + ): ZStream[Any, StatusRuntimeException, Response] = ZStream .acquireReleaseExitWith(requestReceived.succeed(())) { (_, ex) => ex.foldExit( failed => if (failed.isInterrupted || failed.isInterruptedOnly) - exit.succeed(Exit.fail(Status.CANCELLED)) - else exit.succeed(Exit.fail(Status.UNKNOWN)), + exit.succeed(Exit.fail(Status.CANCELLED.asRuntimeException())) + else exit.succeed(Exit.fail(Status.UNKNOWN.asRuntimeException())), _ => exit.succeed(Exit.succeed(Response())) ) } @@ -51,11 +53,11 @@ package object server { case Scenario.OK => ZStream(Response(out = "X1"), Response(out = "X2")) case Scenario.ERROR_NOW => - ZStream.fail(Status.INTERNAL.withDescription("FOO!")) + ZStream.fail(Status.INTERNAL.withDescription("FOO!").asRuntimeException()) case Scenario.ERROR_AFTER => ZStream(Response(out = "X1"), Response(out = "X2")) ++ ZStream .fail( - Status.INTERNAL.withDescription("FOO!") + Status.INTERNAL.withDescription("FOO!").asRuntimeException() ) case Scenario.DELAY => ZStream( @@ -63,13 +65,13 @@ package object server { Response(out = "X2") ) ++ ZStream.never case Scenario.DIE => ZStream.die(new RuntimeException("FOO")) - case _ => ZStream.fail(Status.UNKNOWN) + case _ => ZStream.fail(Status.UNKNOWN.asRuntimeException()) } } def clientStreaming( - request: Stream[Status, Request] - ): ZIO[Any, Status, Response] = + request: Stream[StatusRuntimeException, Request] + ): ZIO[Any, StatusRuntimeException, Response] = requestReceived.succeed(()) *> request .runFoldZIO(0)((state, req) => @@ -78,16 +80,16 @@ package object server { case Scenario.DELAY => delayReceived.succeed(()) *> ZIO.never case Scenario.DIE => ZIO.die(new RuntimeException("foo")) case Scenario.ERROR_NOW => - ZIO.fail((Status.INTERNAL.withDescription("InternalError"))) - case _: Scenario => ZIO.fail(Status.UNKNOWN) + ZIO.fail((Status.INTERNAL.withDescription("InternalError").asRuntimeException())) + case _: Scenario => ZIO.fail(Status.UNKNOWN.asRuntimeException()) } ) .map(r => Response(r.toString)) .onExit(exit.succeed(_)) def bidiStreaming( - request: Stream[Status, Request] - ): Stream[Status, Response] = + request: Stream[StatusRuntimeException, Request] + ): Stream[StatusRuntimeException, Response] = (ZStream.fromZIO(requestReceived.succeed(())).drain ++ (request.flatMap { r => r.scenario match { @@ -97,8 +99,11 @@ package object server { case Scenario.DELAY => ZStream.never case Scenario.DIE => ZStream.die(new RuntimeException("FOO")) case Scenario.ERROR_NOW => - ZStream.fail(Status.INTERNAL.withDescription("Intentional error")) - case _ => ZStream.fail(Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}")) + ZStream.fail(Status.INTERNAL.withDescription("Intentional error").asRuntimeException()) + case _ => + ZStream.fail( + Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}").asRuntimeException() + ) } } ++ ZStream(Response("DONE"))) .ensuring(exit.succeed(Exit.succeed(Response())))) @@ -118,7 +123,7 @@ package object server { for { p1 <- Promise.make[Nothing, Unit] p2 <- Promise.make[Nothing, Unit] - p3 <- Promise.make[Nothing, Exit[Status, Response]] + p3 <- Promise.make[Nothing, Exit[StatusRuntimeException, Response]] } yield new Service(p1, p2, p3)(clock, console) def makeFromEnv: ZIO[Any, Nothing, Service] = @@ -139,7 +144,7 @@ package object server { def awaitDelayReceived: ZIO[TestServiceImpl, Nothing, Unit] = ZIO.environmentWithZIO(_.get.awaitDelayReceived) - def awaitExit: ZIO[TestServiceImpl, Nothing, Exit[Status, Response]] = + def awaitExit: ZIO[TestServiceImpl, Nothing, Exit[StatusRuntimeException, Response]] = ZIO.environmentWithZIO(_.get.awaitExit) } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 81ae62014..912e656e3 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import io.grpc.{ManagedChannelBuilder, ServerBuilder, Status} +import io.grpc.{ManagedChannelBuilder, ServerBuilder, Status, StatusRuntimeException} import scalapb.zio_grpc.TestUtils._ import scalapb.zio_grpc.server.TestServiceImpl import scalapb.zio_grpc.testservice.Request.Scenario @@ -228,7 +228,7 @@ object TestServiceSpec extends ZIOSpecDefault { case class BidiFixture[Req, Res]( in: Queue[Res], out: Queue[Option[Req]], - fiber: Fiber[Status, Unit] + fiber: Fiber[StatusRuntimeException, Unit] ) { def send(r: Req) = out.offer(Some(r)) @@ -239,7 +239,7 @@ object TestServiceSpec extends ZIOSpecDefault { object BidiFixture { def apply[R, Req, Res]( - call: Stream[Status, Req] => ZStream[R, Status, Res] + call: Stream[StatusRuntimeException, Req] => ZStream[R, StatusRuntimeException, Res] ): zio.URIO[R, BidiFixture[Req, Res]] = for { in <- Queue.unbounded[Res] @@ -296,7 +296,7 @@ object TestServiceSpec extends ZIOSpecDefault { ZStream( Request(Scenario.OK, in = 17) ) ++ ZStream.fromZIO(testServiceImpl.get.awaitReceived).drain - ++ ZStream.fail(Status.CANCELLED) + ++ ZStream.fail(Status.CANCELLED.asRuntimeException()) ) ).fork _ <- testServiceImpl.get.awaitExit diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala index fae9e48b8..98a4b1018 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala @@ -1,13 +1,20 @@ package scalapb.zio_grpc import zio.test.Assertion._ -import io.grpc.Status +import io.grpc.{Metadata, Status, StatusRuntimeException} import io.grpc.Status.Code object TestUtils { def hasStatusCode(c: Status) = - hasField[Status, Code]("code", _.getCode, equalTo(c.getCode)) + hasField[StatusRuntimeException, Code]("code", _.getStatus().getCode, equalTo(c.getCode)) def hasDescription(d: String) = - hasField[Status, String]("description", d => Option(d.getDescription()).getOrElse("GotNull"), equalTo(d)) + hasField[StatusRuntimeException, String]( + "description", + e => Option(e.getStatus().getDescription()).getOrElse("GotNull"), + equalTo(d) + ) + + def hasTrailerValue[T](key: Metadata.Key[T], value: T) = + hasField[StatusRuntimeException, T]("trailers", e => Status.trailersFromThrowable(e).get(key), equalTo(value)) } From f07811dd565e839f291364ce14c3047c89b492db Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 11 Mar 2023 08:06:07 -0800 Subject: [PATCH 139/245] Update docs to use StatusRuntimeException. #466 --- docs/basics.md | 22 +++++++++++----------- docs/context.md | 17 +++++++++-------- docs/deadlines.md | 1 - docs/decorating.md | 12 +++++++----- docs/generated-code.md | 14 ++++++-------- 5 files changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/basics.md b/docs/basics.md index ddf15adfb..700453bbf 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -204,9 +204,9 @@ S.example("routeguide/RouteGuideServer.scala", "findFeature") The `getFeature()` method takes the request (of type `Point`), and returns a ZIO effect that represents the work of computing the response. The value that is returned represents a suspended effect: nothing actually happens until ZIO runtime -ultimately runs the effect. The type of the effect is `ZIO[ZEnv, Status, Feature]` which means +ultimately runs the effect. The type of the effect is `ZIO[ZEnv, StatusRuntimeException, Feature]` which means it is a computation: -* can fail with value of type `Status` (this type comes from grpc-java and represents a gRPC status code). +* can fail with value of type `StatusRuntimeException` (this type comes from grpc-java and contains gRPC status information). * can succeed with value of type `Feature`. * requires an environment of type `ZEnv` to run. @@ -227,8 +227,8 @@ S.example("routeguide/RouteGuideServer.scala", "listFeatures") ``` Like the simple RPC, this method gets a request object (the `Rectangle` in which -our client wants to find `Feature`s) and returns a `ZStream[ZEnv, Status, Feature]`, which represents an effectful stream that can produce, provided an environment of type - `ZEnv` zero or more elements of type `Feature` and fail with a value of type of `Status`. +our client wants to find `Feature`s) and returns a `ZStream[ZEnv, StatusRuntimeException, Feature]`, which represents an effectful stream that can produce, provided an environment of type + `ZEnv` zero or more elements of type `Feature` and fail with a exception of type `StatusRuntimeException`. This time, the stream does not need the environment and can not ever fail (since our database is a constant in the same process!) @@ -255,7 +255,7 @@ effect that results in a `RouteSummary`. adding up the distance between successive pair of points, we will use `zipWithPrevious` that gives us a pair `(Option[Point], Point)` where the left element represents the previous element in the stream (which is initially None). -The `fold` method gives us a `IO[Status, RouteSummary]`. Using the `timed` method we are getting a new ZIO effect that upon success gives us the a tuple `(zio.duration.Duration, RouteSummary)` where the duration represents the time it took to process +The `fold` method gives us a `IO[StatusRuntimeException, RouteSummary]`. Using the `timed` method we are getting a new ZIO effect that upon success gives us the a tuple `(zio.duration.Duration, RouteSummary)` where the duration represents the time it took to process the effect thus far. We then use `map` to turn it back to a `RouteSummary` that contains the elapsed time in seconds. ### Bidirectional streaming RPC @@ -327,16 +327,16 @@ that return an effect or a stream that needs a client in the environment to be r ```scala def getFeature(req: Point): - ZIO[RouteGuideClient, Status, Feature] + ZIO[RouteGuideClient, StatusRuntimeException, Feature] def listFeatures(req: Rectangle): - ZStream[RouteGuideClient, Status, Feature] + ZStream[RouteGuideClient, StatusRuntimeException, Feature] -def recordRoute[R0](req: ZStream[R0, Status, Point]): - ZIO[RouteGuideClient with R0, Status, RouteSummary] +def recordRoute[R0](req: ZStream[R0, StatusRuntimeException, Point]): + ZIO[RouteGuideClient with R0, StatusRuntimeException, RouteSummary] -def routeChat[R0](req: ZStream[R0, Status, RouteNote]): - ZStream[RouteGuideClient with R0, Status, RouteNote] +def routeChat[R0](req: ZStream[R0, StatusRuntimeException, RouteNote]): + ZStream[RouteGuideClient with R0, StatusRuntimeException, RouteNote] ``` ### Simple RPC diff --git a/docs/context.md b/docs/context.md index ceaca33a6..227d39ecb 100644 --- a/docs/context.md +++ b/docs/context.md @@ -16,12 +16,12 @@ import zio.Console.printLine import scalapb.zio_grpc.RequestContext import myexample.testservice.ZioTestservice.ZSimpleService import myexample.testservice.{Request, Response} -import io.grpc.Status +import io.grpc.{Status, StatusRuntimeException} case class User(name: String) object MyService extends ZSimpleService[User] { - def sayHello(req: Request, user: User): ZIO[Any, Status, Response] = + def sayHello(req: Request, user: User): ZIO[Any, StatusRuntimeException, Response] = for { _ <- printLine("I am here!").orDie } yield Response(s"Hello, ${user.name}") @@ -59,10 +59,11 @@ import scalapb.zio_grpc.{ServiceList, ServerMain} val UserKey = io.grpc.Metadata.Key.of( "user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) -def findUser(rc: RequestContext): IO[Status, User] = +def findUser(rc: RequestContext): IO[StatusRuntimeException, User] = rc.metadata.get(UserKey).flatMap { case Some(name) => ZIO.succeed(User(name)) - case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case _ => ZIO.fail( + Status.UNAUTHENTICATED.withDescription("No access!").asRuntimeException) } val rcService = @@ -81,13 +82,13 @@ a `fetchUser` effect that retrieves users from a database. Here is how you can d ```scala mdoc trait UserDatabase { - def fetchUser(name: String): IO[Status, User] + def fetchUser(name: String): IO[StatusRuntimeException, User] } object UserDatabase { val layer = zio.ZLayer.succeed( new UserDatabase { - def fetchUser(name: String): IO[Status, User] = + def fetchUser(name: String): IO[StatusRuntimeException, User] = ZIO.succeed(User(name)) }) } @@ -104,7 +105,7 @@ val myServiceAuthWithDatabase: ZIO[UserDatabase, Nothing, ZSimpleService[Request MyService.transformContextZIO { (rc: RequestContext) => rc.metadata.get(UserKey) - .someOrFail(Status.UNAUTHENTICATED) + .someOrFail(Status.UNAUTHENTICATED.asRuntimeException) .flatMap(userDatabase.fetchUser(_)) } ) @@ -193,7 +194,7 @@ trait DepB { } case class MyService2(depA: DepA, depB: DepB) extends ZSimpleService[User] { - def sayHello(req: Request, user: User): ZIO[Any, Status, Response] = + def sayHello(req: Request, user: User): ZIO[Any, StatusRuntimeException, Response] = for { num1 <- depA.methodA(user.name) num2 <- depB.methodB(12.3f) diff --git a/docs/deadlines.md b/docs/deadlines.md index d3fba0511..580d55a1d 100644 --- a/docs/deadlines.md +++ b/docs/deadlines.md @@ -92,7 +92,6 @@ val myAppLogic = ZIO.scoped { for { res <- client .withTimeoutMillis(3000).unary(Request()) - .mapError(_.asRuntimeException) } yield res } } diff --git a/docs/decorating.md b/docs/decorating.md index 3165a4066..03a30a122 100644 --- a/docs/decorating.md +++ b/docs/decorating.md @@ -14,22 +14,24 @@ This can be used for pre- or post-processing of requests/responses and also for We define decoration: ```scala mdoc -import io.grpc.Status +import io.grpc.StatusRuntimeException import scalapb.zio_grpc.{ RequestContext, ZTransform } import zio._ import zio.stream.ZStream class LoggingTransform extends ZTransform[Any, RequestContext] { - def logCause(rc: RequestContext, cause: Cause[Status]): UIO[Unit] = ??? + def logCause(rc: RequestContext, cause: Cause[StatusRuntimeException]): UIO[Unit] = ??? def accessLog(rc: RequestContext): UIO[Unit] = ??? - override def effect[A](io: Any => ZIO[Any, Status, A]): RequestContext => ZIO[Any, Status, A] = { + override def effect[A]( + io: Any => ZIO[Any, StatusRuntimeException, A]): RequestContext => ZIO[Any, StatusRuntimeException, A] = { rc => io(rc).zipLeft(accessLog(rc)).tapErrorCause(logCause(rc, _)) } - override def stream[A](io: Any => ZStream[Any, Status, A]): RequestContext => ZStream[Any, Status, A] = { + override def stream[A]( + io: Any => ZStream[Any, StatusRuntimeException, A]): RequestContext => ZStream[Any, StatusRuntimeException, A] = { rc => (io(rc) ++ ZStream.fromZIO(accessLog(rc)).drain).onError(logCause(rc, _)) } } @@ -42,7 +44,7 @@ import myexample.testservice.ZioTestservice._ import myexample.testservice.{Request, Response} object MyService extends SimpleService { - def sayHello(req: Request): ZIO[Any, Status, Response] = + def sayHello(req: Request): ZIO[Any, StatusRuntimeException, Response] = ZIO.succeed(Response(s"Hello user")) } diff --git a/docs/generated-code.md b/docs/generated-code.md index 17e72ee9e..b82ac975e 100644 --- a/docs/generated-code.md +++ b/docs/generated-code.md @@ -20,7 +20,7 @@ Inside the object, for each service `MyService` that is defined in a `.proto` fi trait MyService { // methods for each RPC def sayHello(request: HelloRequest): - ZIO[Any, Status, HelloReply] + ZIO[Any, StatusRuntimeException, HelloReply] } ``` @@ -31,7 +31,7 @@ type parameter `Context`. The `Context` type parameter represents any domain obj ```scala object MyServiceImpl extends MyService { - def sayHello(request: HelloRequest): ZIO[Any, Status, HelloReply] = ??? + def sayHello(request: HelloRequest): ZIO[Any, StatusRuntimeException, HelloReply] = ??? } ``` @@ -67,13 +67,13 @@ object ServiceNameClient { trait ZService[Context] { // methods for use as a client def sayHello(request: HelloRequest): - ZIO[Context, Status, HelloReply] + ZIO[Context, StatusRuntimeException, HelloReply] } type Service = ZService[Any] // accessor methods def sayHello(request: HelloRequest): - ZIO[ServiceNameClient, Status, HelloReply] + ZIO[ServiceNameClient, StatusRuntimeException, HelloReply] def scoped[R]( managedChannel: ZManagedChannel, @@ -155,10 +155,8 @@ val clientManaged = ServiceNameClient.scoped(channel) val myAppLogic = ZIO.scoped { clientManaged.flatMap { client => for { - res <- client.unary(Request()).mapError(_.asRuntimeException) + res <- client.unary(Request()) } yield res } } -``` - -Since the service acquistion can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. +``` \ No newline at end of file From 267f912cb5d052a246a42984a766dbe54ffcdedc Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 11 Mar 2023 10:01:27 -0800 Subject: [PATCH 140/245] Change StatusRuntimeException to StatusException. #466 --- .../scalapb/zio_grpc/ZioCodeGenerator.scala | 42 ++++++++-------- .../src/main/scala/scalapb/zio_grpc/GIO.scala | 10 ++-- .../scalapb/zio_grpc/ZClientInterceptor.scala | 6 +-- .../scalapb/zio_grpc/ZGeneratedService.scala | 4 +- .../main/scala/scalapb/zio_grpc/package.scala | 6 +-- .../scala/scalapb/zio_grpc/transforms.scala | 48 +++++++++---------- .../scalapb/zio_grpc/client/ClientCalls.scala | 46 +++++++++--------- .../scalapb/zio_grpc/client/ZClientCall.scala | 4 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 40 ++++++++-------- .../client/StreamingClientCallListener.scala | 6 +-- .../client/UnaryClientCallListener.scala | 10 ++-- .../scalapb/zio_grpc/client/ZClientCall.scala | 26 +++++----- .../zio_grpc/server/ListenerDriver.scala | 18 +++---- .../zio_grpc/server/ZServerCallHandler.scala | 40 ++++++++-------- docs/basics.md | 22 ++++----- docs/context.md | 12 ++--- docs/decorating.md | 10 ++-- docs/generated-code.md | 8 ++-- .../scalapb/zio_grpc/BackpressureSpec.scala | 10 ++-- .../zio_grpc/BindableServiceSpec.scala | 14 +++--- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 16 +++---- .../scalapb/zio_grpc/TestServiceImpl.scala | 20 ++++---- .../scalapb/zio_grpc/TestServiceSpec.scala | 6 +-- .../scala/scalapb/zio_grpc/TestUtils.scala | 8 ++-- .../version-0.5.x/generated-code.md | 2 +- 25 files changed, 216 insertions(+), 218 deletions(-) diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala index d05c569af..f9f8b156a 100644 --- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala +++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala @@ -56,23 +56,23 @@ class ZioFilePrinter( ) { import implicits._ - val Channel = "io.grpc.Channel" - val CallOptions = "io.grpc.CallOptions" - val ClientCalls = "scalapb.zio_grpc.client.ClientCalls" - val Duration = "zio.Duration" - val SafeMetadata = "scalapb.zio_grpc.SafeMetadata" - val StatusRuntimeException = "io.grpc.StatusRuntimeException" - val Deadline = "io.grpc.Deadline" - val methodDescriptor = "io.grpc.MethodDescriptor" - val RequestContext = "scalapb.zio_grpc.RequestContext" - val ZClientCall = "scalapb.zio_grpc.client.ZClientCall" - val ZManagedChannel = "scalapb.zio_grpc.ZManagedChannel" - val ZChannel = "scalapb.zio_grpc.ZChannel" - val ZTransform = "scalapb.zio_grpc.ZTransform" - val Transform = "scalapb.zio_grpc.Transform" - val Nanos = "java.util.concurrent.TimeUnit.NANOSECONDS" - val serverServiceDef = "_root_.io.grpc.ServerServiceDefinition" - private val OuterObject = + val Channel = "io.grpc.Channel" + val CallOptions = "io.grpc.CallOptions" + val ClientCalls = "scalapb.zio_grpc.client.ClientCalls" + val Duration = "zio.Duration" + val SafeMetadata = "scalapb.zio_grpc.SafeMetadata" + val StatusException = "io.grpc.StatusException" + val Deadline = "io.grpc.Deadline" + val methodDescriptor = "io.grpc.MethodDescriptor" + val RequestContext = "scalapb.zio_grpc.RequestContext" + val ZClientCall = "scalapb.zio_grpc.client.ZClientCall" + val ZManagedChannel = "scalapb.zio_grpc.ZManagedChannel" + val ZChannel = "scalapb.zio_grpc.ZChannel" + val ZTransform = "scalapb.zio_grpc.ZTransform" + val Transform = "scalapb.zio_grpc.Transform" + val Nanos = "java.util.concurrent.TimeUnit.NANOSECONDS" + val serverServiceDef = "_root_.io.grpc.ServerServiceDefinition" + private val OuterObject = file.scalaPackage / s"Zio${NameUtils.snakeCaseToCamelCase(baseName(file.getName), true)}" def scalaFileName = @@ -673,13 +673,13 @@ class ZioFilePrinter( def stream(res: String, envType: String) = envType match { - case "Any" => s"_root_.zio.stream.Stream[$StatusRuntimeException, $res]" - case r => s"_root_.zio.stream.ZStream[$r, $StatusRuntimeException, $res]" + case "Any" => s"_root_.zio.stream.Stream[$StatusException, $res]" + case r => s"_root_.zio.stream.ZStream[$r, $StatusException, $res]" } def io(res: String, envType: String) = envType match { - case "Any" => s"_root_.zio.IO[$StatusRuntimeException, $res]" - case r => s"_root_.zio.ZIO[$r, $StatusRuntimeException, $res]" + case "Any" => s"_root_.zio.IO[$StatusException, $res]" + case r => s"_root_.zio.ZIO[$r, $StatusException, $res]" } } diff --git a/core/src/main/scala/scalapb/zio_grpc/GIO.scala b/core/src/main/scala/scalapb/zio_grpc/GIO.scala index 0ec85a356..0f6612029 100644 --- a/core/src/main/scala/scalapb/zio_grpc/GIO.scala +++ b/core/src/main/scala/scalapb/zio_grpc/GIO.scala @@ -1,14 +1,14 @@ package scalapb.zio_grpc -import io.grpc.{Status, StatusRuntimeException} +import io.grpc.{Status, StatusException} import zio.{IO, Task, ZIO} object GIO { - def fromTask[A](task: Task[A]): IO[StatusRuntimeException, A] = - task.mapError(e => new StatusRuntimeException(Status.INTERNAL.withDescription(e.getMessage).withCause(e))) + def fromTask[A](task: Task[A]): IO[StatusException, A] = + task.mapError(e => new StatusException(Status.INTERNAL.withDescription(e.getMessage).withCause(e))) @deprecated("use attempt", "0.6.0") - def effect[A](effect: => A): IO[StatusRuntimeException, A] = attempt(effect) + def effect[A](effect: => A): IO[StatusException, A] = attempt(effect) - def attempt[A](effect: => A): IO[StatusRuntimeException, A] = fromTask(ZIO.attempt(effect)) + def attempt[A](effect: => A): IO[StatusException, A] = fromTask(ZIO.attempt(effect)) } diff --git a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala index 843fa8e6d..67039ea5d 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZClientInterceptor.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import io.grpc.{CallOptions, MethodDescriptor, StatusRuntimeException} +import io.grpc.{CallOptions, MethodDescriptor, StatusException} import scalapb.zio_grpc.client.ZClientCall import zio.IO @@ -18,7 +18,7 @@ object ZClientInterceptor { effect: ( MethodDescriptor[_, _], CallOptions - ) => IO[StatusRuntimeException, SafeMetadata] + ) => IO[StatusException, SafeMetadata] ): ZClientInterceptor = new ZClientInterceptor { def interceptCall[Req, Res]( @@ -37,7 +37,7 @@ object ZClientInterceptor { MethodDescriptor[_, _], CallOptions, SafeMetadata - ) => IO[StatusRuntimeException, Unit] + ) => IO[StatusException, Unit] ): ZClientInterceptor = new ZClientInterceptor { def interceptCall[Req, Res]( diff --git a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala index 20ddb3a1d..59d543295 100644 --- a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala +++ b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc import zio.UIO import zio.IO -import io.grpc.{ServerServiceDefinition, StatusRuntimeException} +import io.grpc.{ServerServiceDefinition, StatusException} trait ZGeneratedService[-C, S[-_]] { this: S[C] => @@ -11,7 +11,7 @@ trait ZGeneratedService[-C, S[-_]] { def transform(t: Transform): S[C] = transform[C](t.toZTransform[C]) - def transformContextZIO[ContextOut](f: ContextOut => IO[StatusRuntimeException, C]): S[ContextOut] = transform( + def transformContextZIO[ContextOut](f: ContextOut => IO[StatusException, C]): S[ContextOut] = transform( ZTransform(f) ) diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala index 6d1a79520..ba7fc1820 100644 --- a/core/src/main/scala/scalapb/zio_grpc/package.scala +++ b/core/src/main/scala/scalapb/zio_grpc/package.scala @@ -1,13 +1,13 @@ package scalapb -import io.grpc.StatusRuntimeException +import io.grpc.StatusException import zio.stream.Stream import zio.{IO, Scope, ZIO} package object zio_grpc { - type GIO[A] = IO[StatusRuntimeException, A] + type GIO[A] = IO[StatusException, A] - type GStream[A] = Stream[StatusRuntimeException, A] + type GStream[A] = Stream[StatusException, A] type ZManagedChannel = ZIO[Scope, Throwable, ZChannel] diff --git a/core/src/main/scala/scalapb/zio_grpc/transforms.scala b/core/src/main/scala/scalapb/zio_grpc/transforms.scala index d6a77891e..4371720a3 100644 --- a/core/src/main/scala/scalapb/zio_grpc/transforms.scala +++ b/core/src/main/scala/scalapb/zio_grpc/transforms.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc import zio.ZIO import zio.stream.ZStream -import io.grpc.StatusRuntimeException +import io.grpc.StatusException /** Describes a transformation for all effects and streams of a service. * @@ -11,39 +11,39 @@ import io.grpc.StatusRuntimeException */ trait Transform { self => - def effect[A](io: ZIO[Any, StatusRuntimeException, A]): ZIO[Any, StatusRuntimeException, A] - def stream[A](io: ZStream[Any, StatusRuntimeException, A]): ZStream[Any, StatusRuntimeException, A] + def effect[A](io: ZIO[Any, StatusException, A]): ZIO[Any, StatusException, A] + def stream[A](io: ZStream[Any, StatusException, A]): ZStream[Any, StatusException, A] // Converts this Transform to ZTransform that transforms the effects like this, but // leaves the Context unchanged. def toZTransform[Context]: ZTransform[Context, Context] = new ZTransform[Context, Context] { def effect[A]( - io: Context => ZIO[Any, StatusRuntimeException, A] - ): Context => ZIO[Any, StatusRuntimeException, A] = { c => + io: Context => ZIO[Any, StatusException, A] + ): Context => ZIO[Any, StatusException, A] = { c => self.effect(io(c)) } def stream[A]( - io: Context => ZStream[Any, StatusRuntimeException, A] - ): Context => ZStream[Any, StatusRuntimeException, A] = { c => + io: Context => ZStream[Any, StatusException, A] + ): Context => ZStream[Any, StatusException, A] = { c => self.stream(io(c)) } } def andThen(other: Transform): Transform = new Transform { - def effect[A](io: ZIO[Any, StatusRuntimeException, A]): ZIO[Any, StatusRuntimeException, A] = + def effect[A](io: ZIO[Any, StatusException, A]): ZIO[Any, StatusException, A] = other.effect(self.effect(io)) - def stream[A](io: ZStream[Any, StatusRuntimeException, A]): ZStream[Any, StatusRuntimeException, A] = + def stream[A](io: ZStream[Any, StatusException, A]): ZStream[Any, StatusException, A] = other.stream(self.stream(io)) } } object Transform { def fromZTransform(ct: ZTransform[Any, Any]) = new Transform { - def effect[A](io: ZIO[Any, StatusRuntimeException, A]): ZIO[Any, StatusRuntimeException, A] = ct.effect(_ => io)(()) + def effect[A](io: ZIO[Any, StatusException, A]): ZIO[Any, StatusException, A] = ct.effect(_ => io)(()) - def stream[A](io: ZStream[Any, StatusRuntimeException, A]): ZStream[Any, StatusRuntimeException, A] = + def stream[A](io: ZStream[Any, StatusException, A]): ZStream[Any, StatusException, A] = ct.stream(_ => io)(()) } } @@ -56,23 +56,23 @@ object Transform { trait ZTransform[+ContextIn, -ContextOut] { self => def effect[A]( - io: ContextIn => ZIO[Any, StatusRuntimeException, A] - ): (ContextOut => ZIO[Any, StatusRuntimeException, A]) + io: ContextIn => ZIO[Any, StatusException, A] + ): (ContextOut => ZIO[Any, StatusException, A]) def stream[A]( - io: ContextIn => ZStream[Any, StatusRuntimeException, A] - ): (ContextOut => ZStream[Any, StatusRuntimeException, A]) + io: ContextIn => ZStream[Any, StatusException, A] + ): (ContextOut => ZStream[Any, StatusException, A]) def andThen[ContextIn2 <: ContextOut, ContextOut2]( other: ZTransform[ContextIn2, ContextOut2] ): ZTransform[ContextIn, ContextOut2] = new ZTransform[ContextIn, ContextOut2] { def effect[A]( - io: ContextIn => ZIO[Any, StatusRuntimeException, A] - ): ContextOut2 => ZIO[Any, StatusRuntimeException, A] = + io: ContextIn => ZIO[Any, StatusException, A] + ): ContextOut2 => ZIO[Any, StatusException, A] = other.effect(self.effect(io)) def stream[A]( - io: ContextIn => ZStream[Any, StatusRuntimeException, A] - ): ContextOut2 => ZStream[Any, StatusRuntimeException, A] = + io: ContextIn => ZStream[Any, StatusException, A] + ): ContextOut2 => ZStream[Any, StatusException, A] = other.stream(self.stream(io)) } } @@ -80,18 +80,18 @@ trait ZTransform[+ContextIn, -ContextOut] { object ZTransform { // Returns a ZTransform that effectfully transforms the context parameter def apply[ContextIn, ContextOut]( - f: ContextOut => ZIO[Any, StatusRuntimeException, ContextIn] + f: ContextOut => ZIO[Any, StatusException, ContextIn] ): ZTransform[ContextIn, ContextOut] = new ZTransform[ContextIn, ContextOut] { def effect[A]( - io: ContextIn => ZIO[Any, StatusRuntimeException, A] - ): ContextOut => ZIO[Any, StatusRuntimeException, A] = { (context: ContextOut) => + io: ContextIn => ZIO[Any, StatusException, A] + ): ContextOut => ZIO[Any, StatusException, A] = { (context: ContextOut) => f(context).flatMap(io) } def stream[A]( - io: ContextIn => ZStream[Any, StatusRuntimeException, A] - ): ContextOut => ZStream[Any, StatusRuntimeException, A] = { (context: ContextOut) => + io: ContextIn => ZStream[Any, StatusException, A] + ): ContextOut => ZStream[Any, StatusException, A] = { (context: ContextOut) => ZStream.fromZIO(f(context)).flatMap(io) } } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index ac89f973f..977bc7e5a 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -5,7 +5,7 @@ import scalapb.zio_grpc.ResponseContext import scalapb.zio_grpc.ResponseFrame import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.ZChannel -import io.grpc.{CallOptions, MethodDescriptor, Status, StatusRuntimeException} +import io.grpc.{CallOptions, MethodDescriptor, Status, StatusException} import scalapb.grpcweb.native.ErrorInfo import zio.stream.ZStream import scalapb.grpcweb.native.StatusInfo @@ -18,8 +18,8 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[StatusRuntimeException, ResponseContext[Res]] = - ZIO.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) + ): IO[StatusException, ResponseContext[Res]] = + ZIO.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) def serverStreamingCall[Req, Res]( channel: ZChannel, @@ -27,26 +27,26 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = - ZStream.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) + ): ZStream[Any, StatusException, ResponseFrame[Res]] = + ZStream.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) def clientStreamingCall[Req, Res]( channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): IO[StatusRuntimeException, ResponseContext[Res]] = - ZIO.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) + req: ZStream[Any, StatusException, Req] + ): IO[StatusException, ResponseContext[Res]] = + ZIO.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) def bidiCall[Req, Res]( channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = - ZStream.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) + req: ZStream[Any, StatusException, Req] + ): ZStream[Any, StatusException, ResponseFrame[Res]] = + ZStream.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) } def unaryCall[Req, Res]( @@ -55,7 +55,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[StatusRuntimeException, Res] = + ): IO[StatusException, Res] = ZIO.async { callback => channel.channel.client.rpcCall[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -64,7 +64,7 @@ object ClientCalls { method.methodInfo, (errorInfo: ErrorInfo, resp: Res) => if (errorInfo != null) - callback(ZIO.fail(new StatusRuntimeException(Status.fromErrorInfo(errorInfo)))) + callback(ZIO.fail(new StatusException(Status.fromErrorInfo(errorInfo)))) else callback(ZIO.succeed(resp)) ) } @@ -75,8 +75,8 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, StatusRuntimeException, Res] = - ZStream.async[Any, StatusRuntimeException, Res] { cb => + ): ZStream[Any, StatusException, Res] = + ZStream.async[Any, StatusException, Res] { cb => channel.channel.client .serverStreaming[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, @@ -93,7 +93,7 @@ object ClientCalls { .on( "error", { (ei: ErrorInfo) => - val _ = cb(ZIO.fail(Some(new StatusRuntimeException(Status.fromErrorInfo(ei))))) + val _ = cb(ZIO.fail(Some(new StatusException(Status.fromErrorInfo(ei))))) } ) .on( @@ -106,7 +106,7 @@ object ClientCalls { "status", (status: StatusInfo) => if (status.code != 0) - cb(ZIO.fail(Some(new StatusRuntimeException(Status.fromStatusInfo(status))))) + cb(ZIO.fail(Some(new StatusException(Status.fromStatusInfo(status))))) ) } @@ -115,16 +115,16 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): ZIO[Any, StatusRuntimeException, Res] = - ZIO.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) + req: ZStream[Any, StatusException, Req] + ): ZIO[Any, StatusException, Res] = + ZIO.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) def bidiCall[Req, Res]( channel: ZChannel, method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): ZStream[Any, StatusRuntimeException, Res] = - ZStream.fail(new StatusRuntimeException(Status.INTERNAL.withDescription("Not supported"))) + req: ZStream[Any, StatusException, Req] + ): ZStream[Any, StatusException, Res] = + ZStream.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala index e0c216b06..6b70f1f7c 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ZClientCall.scala @@ -1,7 +1,7 @@ package scalapb.zio_grpc.client import zio.IO -import io.grpc.StatusRuntimeException +import io.grpc.StatusException import scalapb.zio_grpc.SafeMetadata trait ZClientCall[Req, Res] extends Any @@ -11,6 +11,6 @@ object ZClientCall { def headersTransformer[Req, Res]( clientCall: ZClientCall[Req, Res], - fetchHeaders: SafeMetadata => IO[StatusRuntimeException, SafeMetadata] + fetchHeaders: SafeMetadata => IO[StatusException, SafeMetadata] ) = ??? } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala index d09b2971b..d785a9d80 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc.client -import io.grpc.{CallOptions, MethodDescriptor, StatusRuntimeException} +import io.grpc.{CallOptions, MethodDescriptor, StatusException} import scalapb.zio_grpc.{ResponseContext, ResponseFrame, SafeMetadata, ZChannel} import zio.stream.ZStream import zio.{Exit, IO, ZIO} @@ -12,7 +12,7 @@ object ClientCalls { call: ZClientCall[Req, Res], headers: SafeMetadata, req: Req - ): IO[StatusRuntimeException, ResponseContext[Res]] = + ): IO[StatusException, ResponseContext[Res]] = ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => call.start(listener, headers) *> call.request(1) *> @@ -27,7 +27,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[StatusRuntimeException, ResponseContext[Res]] = + ): IO[StatusException, ResponseContext[Res]] = channel .newCall(method, options) .flatMap(unaryCall(_, headers, req)) @@ -36,7 +36,7 @@ object ClientCalls { call: ZClientCall[Req, Res], headers: SafeMetadata, req: Req - ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + ): ZStream[Any, StatusException, ResponseFrame[Res]] = ZStream .acquireReleaseExitWith( StreamingClientCallListener.make[Res](call) @@ -58,7 +58,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + ): ZStream[Any, StatusException, ResponseFrame[Res]] = ZStream .fromZIO(channel.newCall(method, options)) .flatMap(serverStreamingCall(_, headers, req)) @@ -66,8 +66,8 @@ object ClientCalls { private def clientStreamingCall[Req, Res]( call: ZClientCall[Req, Res], headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): IO[StatusRuntimeException, ResponseContext[Res]] = + req: ZStream[Any, StatusException, Req] + ): IO[StatusException, ResponseContext[Res]] = ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener => val callStream = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain val resultStream = ZStream.fromZIO(listener.getValue) @@ -85,8 +85,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): IO[StatusRuntimeException, ResponseContext[Res]] = + req: ZStream[Any, StatusException, Req] + ): IO[StatusException, ResponseContext[Res]] = channel .newCall(method, options) .flatMap( @@ -100,8 +100,8 @@ object ClientCalls { private def bidiCall[Req, Res]( call: ZClientCall[Req, Res], headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + req: ZStream[Any, StatusException, Req] + ): ZStream[Any, StatusException, ResponseFrame[Res]] = ZStream .acquireReleaseExitWith( StreamingClientCallListener.make[Res](call) @@ -123,8 +123,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + req: ZStream[Any, StatusException, Req] + ): ZStream[Any, StatusException, ResponseFrame[Res]] = ZStream .fromZIO( channel.newCall(method, options) @@ -134,7 +134,7 @@ object ClientCalls { def exitHandler[Req, Res]( call: ZClientCall[Req, Res] - )(l: Any, ex: Exit[StatusRuntimeException, Any]) = anyExitHandler(call)(l, ex) + )(l: Any, ex: Exit[StatusException, Any]) = anyExitHandler(call)(l, ex) // less type safe def anyExitHandler[Req, Res]( @@ -151,7 +151,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): IO[StatusRuntimeException, Res] = + ): IO[StatusException, Res] = withMetadata.unaryCall(channel, method, options, headers, req).map(_.response) def serverStreamingCall[Req, Res]( @@ -160,7 +160,7 @@ object ClientCalls { options: CallOptions, headers: SafeMetadata, req: Req - ): ZStream[Any, StatusRuntimeException, Res] = + ): ZStream[Any, StatusException, Res] = withMetadata .serverStreamingCall(channel, method, options, headers, req) .collect { case ResponseFrame.Message(x) => x } @@ -170,8 +170,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): IO[StatusRuntimeException, Res] = + req: ZStream[Any, StatusException, Req] + ): IO[StatusException, Res] = withMetadata.clientStreamingCall(channel, method, options, headers, req).map(_.response) def bidiCall[Req, Res]( @@ -179,8 +179,8 @@ object ClientCalls { method: MethodDescriptor[Req, Res], options: CallOptions, headers: SafeMetadata, - req: ZStream[Any, StatusRuntimeException, Req] - ): ZStream[Any, StatusRuntimeException, Res] = + req: ZStream[Any, StatusException, Req] + ): ZStream[Any, StatusException, Res] = withMetadata .bidiCall(channel, method, options, headers, req) .collect { case ResponseFrame.Message(x) => x } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala index 7b6a2bfea..01d297ecd 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/StreamingClientCallListener.scala @@ -1,7 +1,7 @@ package scalapb.zio_grpc.client import scalapb.zio_grpc.ResponseFrame -import io.grpc.{ClientCall, Metadata, Status, StatusRuntimeException} +import io.grpc.{ClientCall, Metadata, Status, StatusException} import zio.stream.ZStream import zio._ @@ -32,12 +32,12 @@ class StreamingClientCallListener[Res]( runtime.unsafe.run(queue.offer(ResponseFrame.Trailers(status, trailers)).unit).getOrThrowFiberFailure() } - def stream: ZStream[Any, StatusRuntimeException, ResponseFrame[Res]] = + def stream: ZStream[Any, StatusException, ResponseFrame[Res]] = ZStream .fromQueue(queue) .tap { case ResponseFrame.Trailers(status, trailers) => - queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(new StatusRuntimeException(status, trailers))) + queue.shutdown *> ZIO.when(!status.isOk)(ZIO.fail(new StatusException(status, trailers))) case _ => ZIO.unit } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index 62ed4ecc8..a81e2f122 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -1,7 +1,7 @@ package scalapb.zio_grpc.client import zio.{IO, Promise, Ref, Runtime, Unsafe} -import io.grpc.{ClientCall, Metadata, Status, StatusRuntimeException} +import io.grpc.{ClientCall, Metadata, Status, StatusException} import UnaryCallState._ import scalapb.zio_grpc.ResponseContext @@ -20,7 +20,7 @@ object UnaryCallState { class UnaryClientCallListener[Res]( runtime: Runtime[Any], state: Ref[UnaryCallState[Res]], - promise: Promise[StatusRuntimeException, ResponseContext[Res]] + promise: Promise[StatusException, ResponseContext[Res]] ) extends ClientCall.Listener[Res] { override def onHeaders(headers: Metadata): Unit = @@ -58,7 +58,7 @@ class UnaryClientCallListener[Res]( .run { for { s <- state.get - _ <- if (!status.isOk) promise.fail(new StatusRuntimeException(status, trailers)) + _ <- if (!status.isOk) promise.fail(new StatusException(status, trailers)) else s match { case ResponseReceived(headers, message) => @@ -77,7 +77,7 @@ class UnaryClientCallListener[Res]( .getOrThrowFiberFailure() } - def getValue: IO[StatusRuntimeException, ResponseContext[Res]] = promise.await + def getValue: IO[StatusException, ResponseContext[Res]] = promise.await } object UnaryClientCallListener { @@ -85,6 +85,6 @@ object UnaryClientCallListener { for { runtime <- zio.ZIO.runtime[Any] state <- Ref.make[UnaryCallState[Res]](Initial) - promise <- Promise.make[StatusRuntimeException, ResponseContext[Res]] + promise <- Promise.make[StatusException, ResponseContext[Res]] } yield new UnaryClientCallListener[Res](runtime, state, promise) } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala index 612b34c4c..3b2bd9d0f 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ZClientCall.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc.client -import io.grpc.{ClientCall, StatusRuntimeException} +import io.grpc.{ClientCall, StatusException} import io.grpc.ClientCall.Listener import scalapb.zio_grpc.GIO import zio.IO @@ -11,15 +11,15 @@ trait ZClientCall[Req, Res] extends Any { def start( responseListener: Listener[Res], headers: SafeMetadata - ): IO[StatusRuntimeException, Unit] + ): IO[StatusException, Unit] - def request(numMessages: Int): IO[StatusRuntimeException, Unit] + def request(numMessages: Int): IO[StatusException, Unit] - def cancel(message: String): IO[StatusRuntimeException, Unit] + def cancel(message: String): IO[StatusException, Unit] - def halfClose(): IO[StatusRuntimeException, Unit] + def halfClose(): IO[StatusException, Unit] - def sendMessage(message: Req): IO[StatusRuntimeException, Unit] + def sendMessage(message: Req): IO[StatusException, Unit] } class ZClientCallImpl[Req, Res](private val call: ClientCall[Req, Res]) extends AnyVal with ZClientCall[Req, Res] { @@ -48,29 +48,29 @@ object ZClientCall { override def start( responseListener: Listener[Res], headers: SafeMetadata - ): IO[StatusRuntimeException, Unit] = delegate.start(responseListener, headers) + ): IO[StatusException, Unit] = delegate.start(responseListener, headers) - override def request(numMessages: Int): IO[StatusRuntimeException, Unit] = + override def request(numMessages: Int): IO[StatusException, Unit] = delegate.request(numMessages) - override def cancel(message: String): IO[StatusRuntimeException, Unit] = + override def cancel(message: String): IO[StatusException, Unit] = delegate.cancel(message) - override def halfClose(): IO[StatusRuntimeException, Unit] = delegate.halfClose() + override def halfClose(): IO[StatusException, Unit] = delegate.halfClose() - override def sendMessage(message: Req): IO[StatusRuntimeException, Unit] = + override def sendMessage(message: Req): IO[StatusException, Unit] = delegate.sendMessage(message) } def headersTransformer[Req, Res]( clientCall: ZClientCall[Req, Res], - updateHeaders: SafeMetadata => IO[StatusRuntimeException, SafeMetadata] + updateHeaders: SafeMetadata => IO[StatusException, SafeMetadata] ): ZClientCall[Req, Res] = new ForwardingZClientCall[Req, Res](clientCall) { override def start( responseListener: Listener[Res], headers: SafeMetadata - ): IO[StatusRuntimeException, Unit] = + ): IO[StatusException, Unit] = updateHeaders(headers) flatMap { h => delegate.start(responseListener, h) } } } diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala index 6c046fec5..58a9db195 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala @@ -1,13 +1,13 @@ package scalapb.zio_grpc.server import io.grpc.ServerCall.Listener -import io.grpc.{Metadata, Status, StatusRuntimeException} +import io.grpc.{Metadata, Status, StatusException} import zio._ import zio.stream.{Stream, ZStream} import scalapb.zio_grpc.RequestContext object ListenerDriver { - def exitToStatus(ex: Exit[StatusRuntimeException, Unit]): Status = + def exitToStatus(ex: Exit[StatusException, Unit]): Status = ex.foldExit( failed = { cause => if (cause.isInterruptedOnly) Status.CANCELLED @@ -19,10 +19,10 @@ object ListenerDriver { def unaryInputListener[Req]( runtime: Runtime[Any], call: ZServerCall[_], - completed: Promise[StatusRuntimeException, Unit], + completed: Promise[StatusException, Unit], request: Promise[Nothing, Req], requestContext: RequestContext, - writeResponse: Req => ZIO[Any, StatusRuntimeException, Unit] + writeResponse: Req => ZIO[Any, StatusException, Unit] ): ZIO[Any, Nothing, Listener[Req]] = ( call.request(2) *> @@ -82,14 +82,14 @@ object ListenerDriver { Req, RequestContext, ZServerCall[Res] - ) => ZIO[Any, StatusRuntimeException, Unit], + ) => ZIO[Any, StatusException, Unit], runtime: Runtime[Any] )( zioCall: ZServerCall[Res], requestContext: RequestContext ): ZIO[Any, Nothing, Listener[Req]] = for { - completed <- Promise.make[StatusRuntimeException, Unit] + completed <- Promise.make[StatusException, Unit] request <- Promise.make[Nothing, Req] listener <- unaryInputListener( runtime, @@ -106,7 +106,7 @@ object ListenerDriver { call: ZServerCall[Res], queue: Queue[Option[Req]], requestContext: RequestContext, - writeResponse: Stream[StatusRuntimeException, Req] => ZIO[Any, StatusRuntimeException, Unit] + writeResponse: Stream[StatusException, Req] => ZIO[Any, StatusException, Unit] ): ZIO[Any, Nothing, Listener[Req]] = { val requestStream = ZStream .fromQueue(queue) @@ -155,10 +155,10 @@ object ListenerDriver { */ def makeStreamingInputListener[Req, Res]( writeResponse: ( - Stream[StatusRuntimeException, Req], + Stream[StatusException, Req], RequestContext, ZServerCall[Res] - ) => ZIO[Any, StatusRuntimeException, Unit] + ) => ZIO[Any, StatusException, Unit] )( zioCall: ZServerCall[Res], requestContext: RequestContext diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index f53dd139e..fc47b03e1 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -2,7 +2,7 @@ package scalapb.zio_grpc.server import zio._ import io.grpc.ServerCall.Listener -import io.grpc.{Status, StatusRuntimeException} +import io.grpc.{Status, StatusException} import zio.stream.Stream import io.grpc.ServerCall import io.grpc.ServerCallHandler @@ -40,7 +40,7 @@ class ZServerCallHandler[Req, Res]( object ZServerCallHandler { private[zio_grpc] val queueSizeProp = "zio-grpc.backpressure-queue-size" - val backpressureQueueSize: IO[StatusRuntimeException, Int] = + val backpressureQueueSize: IO[StatusException, Int] = ZIO .attempt(sys.props.get(queueSizeProp).map(_.toInt).getOrElse(16)) .refineToOrDie[NumberFormatException] @@ -50,17 +50,17 @@ object ZServerCallHandler { def unaryInput[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[Any, StatusRuntimeException, Unit] + impl: (Req, RequestContext, ZServerCall[Res]) => ZIO[Any, StatusException, Unit] ): ServerCallHandler[Req, Res] = new ZServerCallHandler(runtime, ListenerDriver.makeUnaryInputListener(impl, runtime)) def streamingInput[Req, Res]( runtime: Runtime[Any], impl: ( - Stream[StatusRuntimeException, Req], + Stream[StatusException, Req], RequestContext, ZServerCall[Res] - ) => ZIO[Any, StatusRuntimeException, Unit] + ) => ZIO[Any, StatusException, Unit] ): ServerCallHandler[Req, Res] = new ZServerCallHandler( runtime, @@ -69,17 +69,16 @@ object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext) => ZIO[Any, StatusRuntimeException, Res] + impl: (Req, RequestContext) => ZIO[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = unaryInput[Req, Res]( runtime, - (req, requestContext, call) => - impl(req, requestContext).flatMap[Any, StatusRuntimeException, Unit](call.sendMessage) + (req, requestContext, call) => impl(req, requestContext).flatMap[Any, StatusException, Unit](call.sendMessage) ) def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext) => ZStream[Any, StatusRuntimeException, Res] + impl: (Req, RequestContext) => ZStream[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = unaryInput[Req, Res]( runtime, @@ -89,17 +88,16 @@ object ZServerCallHandler { def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Stream[StatusRuntimeException, Req], RequestContext) => ZIO[Any, StatusRuntimeException, Res] + impl: (Stream[StatusException, Req], RequestContext) => ZIO[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = streamingInput[Req, Res]( runtime, - (req, requestContext, call) => - impl(req, requestContext).flatMap[Any, StatusRuntimeException, Unit](call.sendMessage) + (req, requestContext, call) => impl(req, requestContext).flatMap[Any, StatusException, Unit](call.sendMessage) ) def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Stream[StatusRuntimeException, Req], RequestContext) => ZStream[Any, StatusRuntimeException, Res] + impl: (Stream[StatusException, Req], RequestContext) => ZStream[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = streamingInput[Req, Res]( runtime, @@ -108,19 +106,19 @@ object ZServerCallHandler { def serverStreamingWithBackpressure[Res]( call: ZServerCall[Res], - stream: ZStream[Any, StatusRuntimeException, Res] - ): ZIO[Any, StatusRuntimeException, Unit] = { + stream: ZStream[Any, StatusException, Res] + ): ZIO[Any, StatusException, Unit] = { def takeFromQueue( - queue: Dequeue[Exit[Option[StatusRuntimeException], Res]] - ): ZIO[Any, StatusRuntimeException, Unit] = + queue: Dequeue[Exit[Option[StatusException], Res]] + ): ZIO[Any, StatusException, Unit] = queue.takeAll.flatMap(takeFromCache(_, queue)) def takeFromCache( - xs: Chunk[Exit[Option[StatusRuntimeException], Res]], - queue: Dequeue[Exit[Option[StatusRuntimeException], Res]] - ): ZIO[Any, StatusRuntimeException, Unit] = + xs: Chunk[Exit[Option[StatusException], Res]], + queue: Dequeue[Exit[Option[StatusException], Res]] + ): ZIO[Any, StatusException, Unit] = ZIO.suspendSucceed { - @tailrec def innerLoop(loop: Boolean, i: Int): IO[StatusRuntimeException, Unit] = + @tailrec def innerLoop(loop: Boolean, i: Int): IO[StatusException, Unit] = if (i < xs.length && loop) { xs(i) match { case Failure(cause) => diff --git a/docs/basics.md b/docs/basics.md index 700453bbf..95cca9993 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -204,9 +204,9 @@ S.example("routeguide/RouteGuideServer.scala", "findFeature") The `getFeature()` method takes the request (of type `Point`), and returns a ZIO effect that represents the work of computing the response. The value that is returned represents a suspended effect: nothing actually happens until ZIO runtime -ultimately runs the effect. The type of the effect is `ZIO[ZEnv, StatusRuntimeException, Feature]` which means +ultimately runs the effect. The type of the effect is `ZIO[ZEnv, StatusException, Feature]` which means it is a computation: -* can fail with value of type `StatusRuntimeException` (this type comes from grpc-java and contains gRPC status information). +* can fail with value of type `StatusException` (this type comes from grpc-java and contains gRPC status information). * can succeed with value of type `Feature`. * requires an environment of type `ZEnv` to run. @@ -227,8 +227,8 @@ S.example("routeguide/RouteGuideServer.scala", "listFeatures") ``` Like the simple RPC, this method gets a request object (the `Rectangle` in which -our client wants to find `Feature`s) and returns a `ZStream[ZEnv, StatusRuntimeException, Feature]`, which represents an effectful stream that can produce, provided an environment of type - `ZEnv` zero or more elements of type `Feature` and fail with a exception of type `StatusRuntimeException`. +our client wants to find `Feature`s) and returns a `ZStream[ZEnv, StatusException, Feature]`, which represents an effectful stream that can produce, provided an environment of type + `ZEnv` zero or more elements of type `Feature` and fail with a exception of type `StatusException`. This time, the stream does not need the environment and can not ever fail (since our database is a constant in the same process!) @@ -255,7 +255,7 @@ effect that results in a `RouteSummary`. adding up the distance between successive pair of points, we will use `zipWithPrevious` that gives us a pair `(Option[Point], Point)` where the left element represents the previous element in the stream (which is initially None). -The `fold` method gives us a `IO[StatusRuntimeException, RouteSummary]`. Using the `timed` method we are getting a new ZIO effect that upon success gives us the a tuple `(zio.duration.Duration, RouteSummary)` where the duration represents the time it took to process +The `fold` method gives us a `IO[StatusException, RouteSummary]`. Using the `timed` method we are getting a new ZIO effect that upon success gives us the a tuple `(zio.duration.Duration, RouteSummary)` where the duration represents the time it took to process the effect thus far. We then use `map` to turn it back to a `RouteSummary` that contains the elapsed time in seconds. ### Bidirectional streaming RPC @@ -327,16 +327,16 @@ that return an effect or a stream that needs a client in the environment to be r ```scala def getFeature(req: Point): - ZIO[RouteGuideClient, StatusRuntimeException, Feature] + ZIO[RouteGuideClient, StatusException, Feature] def listFeatures(req: Rectangle): - ZStream[RouteGuideClient, StatusRuntimeException, Feature] + ZStream[RouteGuideClient, StatusException, Feature] -def recordRoute[R0](req: ZStream[R0, StatusRuntimeException, Point]): - ZIO[RouteGuideClient with R0, StatusRuntimeException, RouteSummary] +def recordRoute[R0](req: ZStream[R0, StatusException, Point]): + ZIO[RouteGuideClient with R0, StatusException, RouteSummary] -def routeChat[R0](req: ZStream[R0, StatusRuntimeException, RouteNote]): - ZStream[RouteGuideClient with R0, StatusRuntimeException, RouteNote] +def routeChat[R0](req: ZStream[R0, StatusException, RouteNote]): + ZStream[RouteGuideClient with R0, StatusException, RouteNote] ``` ### Simple RPC diff --git a/docs/context.md b/docs/context.md index 227d39ecb..b42a58544 100644 --- a/docs/context.md +++ b/docs/context.md @@ -16,12 +16,12 @@ import zio.Console.printLine import scalapb.zio_grpc.RequestContext import myexample.testservice.ZioTestservice.ZSimpleService import myexample.testservice.{Request, Response} -import io.grpc.{Status, StatusRuntimeException} +import io.grpc.{Status, StatusException} case class User(name: String) object MyService extends ZSimpleService[User] { - def sayHello(req: Request, user: User): ZIO[Any, StatusRuntimeException, Response] = + def sayHello(req: Request, user: User): ZIO[Any, StatusException, Response] = for { _ <- printLine("I am here!").orDie } yield Response(s"Hello, ${user.name}") @@ -59,7 +59,7 @@ import scalapb.zio_grpc.{ServiceList, ServerMain} val UserKey = io.grpc.Metadata.Key.of( "user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) -def findUser(rc: RequestContext): IO[StatusRuntimeException, User] = +def findUser(rc: RequestContext): IO[StatusException, User] = rc.metadata.get(UserKey).flatMap { case Some(name) => ZIO.succeed(User(name)) case _ => ZIO.fail( @@ -82,13 +82,13 @@ a `fetchUser` effect that retrieves users from a database. Here is how you can d ```scala mdoc trait UserDatabase { - def fetchUser(name: String): IO[StatusRuntimeException, User] + def fetchUser(name: String): IO[StatusException, User] } object UserDatabase { val layer = zio.ZLayer.succeed( new UserDatabase { - def fetchUser(name: String): IO[StatusRuntimeException, User] = + def fetchUser(name: String): IO[StatusException, User] = ZIO.succeed(User(name)) }) } @@ -194,7 +194,7 @@ trait DepB { } case class MyService2(depA: DepA, depB: DepB) extends ZSimpleService[User] { - def sayHello(req: Request, user: User): ZIO[Any, StatusRuntimeException, Response] = + def sayHello(req: Request, user: User): ZIO[Any, StatusException, Response] = for { num1 <- depA.methodA(user.name) num2 <- depB.methodB(12.3f) diff --git a/docs/decorating.md b/docs/decorating.md index 03a30a122..15c4fd1d4 100644 --- a/docs/decorating.md +++ b/docs/decorating.md @@ -14,24 +14,24 @@ This can be used for pre- or post-processing of requests/responses and also for We define decoration: ```scala mdoc -import io.grpc.StatusRuntimeException +import io.grpc.StatusException import scalapb.zio_grpc.{ RequestContext, ZTransform } import zio._ import zio.stream.ZStream class LoggingTransform extends ZTransform[Any, RequestContext] { - def logCause(rc: RequestContext, cause: Cause[StatusRuntimeException]): UIO[Unit] = ??? + def logCause(rc: RequestContext, cause: Cause[StatusException]): UIO[Unit] = ??? def accessLog(rc: RequestContext): UIO[Unit] = ??? override def effect[A]( - io: Any => ZIO[Any, StatusRuntimeException, A]): RequestContext => ZIO[Any, StatusRuntimeException, A] = { + io: Any => ZIO[Any, StatusException, A]): RequestContext => ZIO[Any, StatusException, A] = { rc => io(rc).zipLeft(accessLog(rc)).tapErrorCause(logCause(rc, _)) } override def stream[A]( - io: Any => ZStream[Any, StatusRuntimeException, A]): RequestContext => ZStream[Any, StatusRuntimeException, A] = { + io: Any => ZStream[Any, StatusException, A]): RequestContext => ZStream[Any, StatusException, A] = { rc => (io(rc) ++ ZStream.fromZIO(accessLog(rc)).drain).onError(logCause(rc, _)) } } @@ -44,7 +44,7 @@ import myexample.testservice.ZioTestservice._ import myexample.testservice.{Request, Response} object MyService extends SimpleService { - def sayHello(req: Request): ZIO[Any, StatusRuntimeException, Response] = + def sayHello(req: Request): ZIO[Any, StatusException, Response] = ZIO.succeed(Response(s"Hello user")) } diff --git a/docs/generated-code.md b/docs/generated-code.md index b82ac975e..dd4b8ff20 100644 --- a/docs/generated-code.md +++ b/docs/generated-code.md @@ -20,7 +20,7 @@ Inside the object, for each service `MyService` that is defined in a `.proto` fi trait MyService { // methods for each RPC def sayHello(request: HelloRequest): - ZIO[Any, StatusRuntimeException, HelloReply] + ZIO[Any, StatusException, HelloReply] } ``` @@ -31,7 +31,7 @@ type parameter `Context`. The `Context` type parameter represents any domain obj ```scala object MyServiceImpl extends MyService { - def sayHello(request: HelloRequest): ZIO[Any, StatusRuntimeException, HelloReply] = ??? + def sayHello(request: HelloRequest): ZIO[Any, StatusException, HelloReply] = ??? } ``` @@ -67,13 +67,13 @@ object ServiceNameClient { trait ZService[Context] { // methods for use as a client def sayHello(request: HelloRequest): - ZIO[Context, StatusRuntimeException, HelloReply] + ZIO[Context, StatusException, HelloReply] } type Service = ZService[Any] // accessor methods def sayHello(request: HelloRequest): - ZIO[ServiceNameClient, StatusRuntimeException, HelloReply] + ZIO[ServiceNameClient, StatusException, HelloReply] def scoped[R]( managedChannel: ZManagedChannel, diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala index b057090b6..0d745ac7b 100644 --- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala +++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import io.grpc.StatusRuntimeException +import io.grpc.StatusException import io.grpc.inprocess.InProcessServerBuilder import scalapb.zio_grpc.testservice.Request import scalapb.zio_grpc.testservice.Response @@ -31,15 +31,15 @@ object BackpressureSpec extends ZIOSpecDefault { new ZioTestservice.TestService { val responses = ZStream.iterate(0)(_ + 1).map(i => Response(i.toString)).take(100) - def bidiStreaming(request: zio.stream.Stream[StatusRuntimeException, Request]): ZStream[Any with Any, StatusRuntimeException, Response] = + def bidiStreaming(request: zio.stream.Stream[StatusException, Request]): ZStream[Any with Any, StatusException, Response] = request.drain ++ responses - def serverStreaming(request: Request): ZStream[Any with Any, StatusRuntimeException, Response] = + def serverStreaming(request: Request): ZStream[Any with Any, StatusException, Response] = responses - def clientStreaming(request: zio.stream.Stream[StatusRuntimeException, Request]): ZIO[Any with Any, StatusRuntimeException, Response] = ??? + def clientStreaming(request: zio.stream.Stream[StatusException, Request]): ZIO[Any with Any, StatusException, Response] = ??? - def unary(request: Request): ZIO[Any with Any, StatusRuntimeException, Response] = ??? + def unary(request: Request): ZIO[Any with Any, StatusException, Response] = ??? } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala index 851801b14..5c4fe2ac7 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala @@ -3,7 +3,7 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.ZioTestservice.TestService import scalapb.zio_grpc.testservice.ZioTestservice.ZTestService import zio.ZIO -import io.grpc.StatusRuntimeException +import io.grpc.StatusException import scalapb.zio_grpc.testservice.{Request, Response} import io.grpc.ServerBuilder import zio.test._ @@ -18,19 +18,19 @@ object BindableServiceSpec extends ZIOSpecDefault { class UnimpTestService[C] extends ZTestService[C] { - override def unary(request: Request, context: C): IO[StatusRuntimeException, Response] = ??? + override def unary(request: Request, context: C): IO[StatusException, Response] = ??? - override def serverStreaming(request: Request, context: C): Stream[StatusRuntimeException, Response] = ??? + override def serverStreaming(request: Request, context: C): Stream[StatusException, Response] = ??? override def clientStreaming( - request: Stream[StatusRuntimeException, Request], + request: Stream[StatusException, Request], context: C - ): IO[StatusRuntimeException, Response] = ??? + ): IO[StatusException, Response] = ??? override def bidiStreaming( - request: zio.stream.Stream[StatusRuntimeException, Request], + request: zio.stream.Stream[StatusException, Request], context: C - ): Stream[StatusRuntimeException, Response] = ??? + ): Stream[StatusException, Response] = ??? } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 195dfeb3c..8769292e1 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -8,7 +8,7 @@ import testservice._ import io.grpc.ServerBuilder import io.grpc.Metadata import io.grpc.ManagedChannelBuilder -import io.grpc.{Status, StatusRuntimeException} +import io.grpc.{Status, StatusException} import zio.stream.ZStream object EnvSpec extends ZIOSpecDefault with MetadataTests { @@ -17,7 +17,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { case class Context(user: User, response: SafeMetadata) object ServiceWithConsole extends ZTestService[Context] { - def unary(request: Request, context: Context): ZIO[Any, StatusRuntimeException, Response] = + def unary(request: Request, context: Context): ZIO[Any, StatusException, Response] = for { _ <- context.response.put(RequestIdKey, "1") _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") @@ -26,7 +26,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { def serverStreaming( request: Request, context: Context - ): ZStream[Any, StatusRuntimeException, Response] = + ): ZStream[Any, StatusException, Response] = ZStream .fromZIO( for { @@ -41,18 +41,18 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { ) def clientStreaming( - request: ZStream[Any, StatusRuntimeException, Request], + request: ZStream[Any, StatusException, Request], context: Context - ): ZIO[Any, StatusRuntimeException, Response] = + ): ZIO[Any, StatusException, Response] = for { _ <- context.response.put(RequestIdKey, "1") _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") } yield Response(context.user.name) def bidiStreaming( - request: ZStream[Any, StatusRuntimeException, Request], + request: ZStream[Any, StatusException, Request], context: Context - ): ZStream[Any, StatusRuntimeException, Response] = + ): ZStream[Any, StatusException, Response] = ZStream .fromZIO( for { @@ -66,7 +66,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { val UserKey = Metadata.Key.of("user-key", io.grpc.Metadata.ASCII_STRING_MARSHALLER) - def parseUser(rc: RequestContext): IO[StatusRuntimeException, Context] = + def parseUser(rc: RequestContext): IO[StatusException, Context] = rc.metadata.get(UserKey).flatMap { case Some("alice") => ZIO.fail( diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index acfd4aded..6e94307bd 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -3,7 +3,7 @@ package scalapb.zio_grpc import scalapb.zio_grpc.testservice.Request import zio.{Clock, Console, Exit, Promise, ZIO, ZLayer} import scalapb.zio_grpc.testservice.Response -import io.grpc.{Status, StatusRuntimeException} +import io.grpc.{Status, StatusException} import scalapb.zio_grpc.testservice.Request.Scenario import zio.stream.{Stream, ZStream} import zio.ZEnvironment @@ -19,10 +19,10 @@ package object server { class Service( requestReceived: zio.Promise[Nothing, Unit], delayReceived: zio.Promise[Nothing, Unit], - exit: zio.Promise[Nothing, Exit[StatusRuntimeException, Response]] + exit: zio.Promise[Nothing, Exit[StatusException, Response]] )(clock: Clock, console: Console) extends testservice.ZioTestservice.TestService { - def unary(request: Request): ZIO[Any, StatusRuntimeException, Response] = + def unary(request: Request): ZIO[Any, StatusException, Response] = (requestReceived.succeed(()) *> (request.scenario match { case Scenario.OK => ZIO.succeed( @@ -37,7 +37,7 @@ package object server { def serverStreaming( request: Request - ): ZStream[Any, StatusRuntimeException, Response] = + ): ZStream[Any, StatusException, Response] = ZStream .acquireReleaseExitWith(requestReceived.succeed(())) { (_, ex) => ex.foldExit( @@ -70,8 +70,8 @@ package object server { } def clientStreaming( - request: Stream[StatusRuntimeException, Request] - ): ZIO[Any, StatusRuntimeException, Response] = + request: Stream[StatusException, Request] + ): ZIO[Any, StatusException, Response] = requestReceived.succeed(()) *> request .runFoldZIO(0)((state, req) => @@ -88,8 +88,8 @@ package object server { .onExit(exit.succeed(_)) def bidiStreaming( - request: Stream[StatusRuntimeException, Request] - ): Stream[StatusRuntimeException, Response] = + request: Stream[StatusException, Request] + ): Stream[StatusException, Response] = (ZStream.fromZIO(requestReceived.succeed(())).drain ++ (request.flatMap { r => r.scenario match { @@ -123,7 +123,7 @@ package object server { for { p1 <- Promise.make[Nothing, Unit] p2 <- Promise.make[Nothing, Unit] - p3 <- Promise.make[Nothing, Exit[StatusRuntimeException, Response]] + p3 <- Promise.make[Nothing, Exit[StatusException, Response]] } yield new Service(p1, p2, p3)(clock, console) def makeFromEnv: ZIO[Any, Nothing, Service] = @@ -144,7 +144,7 @@ package object server { def awaitDelayReceived: ZIO[TestServiceImpl, Nothing, Unit] = ZIO.environmentWithZIO(_.get.awaitDelayReceived) - def awaitExit: ZIO[TestServiceImpl, Nothing, Exit[StatusRuntimeException, Response]] = + def awaitExit: ZIO[TestServiceImpl, Nothing, Exit[StatusException, Response]] = ZIO.environmentWithZIO(_.get.awaitExit) } } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index 912e656e3..cf42acb2c 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc -import io.grpc.{ManagedChannelBuilder, ServerBuilder, Status, StatusRuntimeException} +import io.grpc.{ManagedChannelBuilder, ServerBuilder, Status, StatusException} import scalapb.zio_grpc.TestUtils._ import scalapb.zio_grpc.server.TestServiceImpl import scalapb.zio_grpc.testservice.Request.Scenario @@ -228,7 +228,7 @@ object TestServiceSpec extends ZIOSpecDefault { case class BidiFixture[Req, Res]( in: Queue[Res], out: Queue[Option[Req]], - fiber: Fiber[StatusRuntimeException, Unit] + fiber: Fiber[StatusException, Unit] ) { def send(r: Req) = out.offer(Some(r)) @@ -239,7 +239,7 @@ object TestServiceSpec extends ZIOSpecDefault { object BidiFixture { def apply[R, Req, Res]( - call: Stream[StatusRuntimeException, Req] => ZStream[R, StatusRuntimeException, Res] + call: Stream[StatusException, Req] => ZStream[R, StatusException, Res] ): zio.URIO[R, BidiFixture[Req, Res]] = for { in <- Queue.unbounded[Res] diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala index 98a4b1018..b69cdbd86 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala @@ -1,20 +1,20 @@ package scalapb.zio_grpc import zio.test.Assertion._ -import io.grpc.{Metadata, Status, StatusRuntimeException} +import io.grpc.{Metadata, Status, StatusException} import io.grpc.Status.Code object TestUtils { def hasStatusCode(c: Status) = - hasField[StatusRuntimeException, Code]("code", _.getStatus().getCode, equalTo(c.getCode)) + hasField[StatusException, Code]("code", _.getStatus().getCode, equalTo(c.getCode)) def hasDescription(d: String) = - hasField[StatusRuntimeException, String]( + hasField[StatusException, String]( "description", e => Option(e.getStatus().getDescription()).getOrElse("GotNull"), equalTo(d) ) def hasTrailerValue[T](key: Metadata.Key[T], value: T) = - hasField[StatusRuntimeException, T]("trailers", e => Status.trailersFromThrowable(e).get(key), equalTo(value)) + hasField[StatusException, T]("trailers", e => Status.trailersFromThrowable(e).get(key), equalTo(value)) } diff --git a/website/versioned_docs/version-0.5.x/generated-code.md b/website/versioned_docs/version-0.5.x/generated-code.md index 81298ef24..00a55756d 100644 --- a/website/versioned_docs/version-0.5.x/generated-code.md +++ b/website/versioned_docs/version-0.5.x/generated-code.md @@ -174,4 +174,4 @@ val myAppLogic = for { // myAppLogic: ZIO[Any with Any, Throwable, Response] = zio.ZIO$FlatMap@1a4cd330 ``` -Since the service acquistion (through the ZManaged) can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusRuntimeException`. This way, the resulting effect can fail with a `Throwable`. \ No newline at end of file +Since the service acquistion (through the ZManaged) can fail with a `Throwable`, and the RPC effects of ZIO gRPC can fail with `Status` (which is not a subtype of `Throwable`), we use `mapError` to map the RPC error to a `StatusException`. This way, the resulting effect can fail with a `Throwable`. \ No newline at end of file From 58a2c0eaab51e907f3349767ab874d974c063463 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Sat, 11 Mar 2023 10:01:27 -0800 Subject: [PATCH 141/245] Update exception calls (#466) --- build.sbt | 2 +- .../client/UnaryClientCallListener.scala | 4 ++-- .../zio_grpc/server/ListenerDriver.scala | 2 +- .../zio_grpc/server/ZServerCallHandler.scala | 2 +- docs/context.md | 4 ++-- .../test/scala/scalapb/zio_grpc/EnvSpec.scala | 12 +++++----- .../scalapb/zio_grpc/ListenerDriverSpec.scala | 4 ++-- .../scalapb/zio_grpc/TestServiceImpl.scala | 22 +++++++++---------- .../scalapb/zio_grpc/TestServiceSpec.scala | 2 +- .../versioned_docs/version-0.5.x/deadlines.md | 2 +- .../version-0.5.x/generated-code.md | 2 +- 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/build.sbt b/build.sbt index 4bf1e491a..34b0e5c5b 100644 --- a/build.sbt +++ b/build.sbt @@ -60,7 +60,7 @@ lazy val core = projectMatrix _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( libraryDependencies ++= Seq( - "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.5", + "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.6", "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" % "test" ), Compile / npmDependencies += "grpc-web" -> "1.2.1" diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala index a81e2f122..df509fae2 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/UnaryClientCallListener.scala @@ -65,11 +65,11 @@ class UnaryClientCallListener[Res]( promise.succeed(ResponseContext(headers, message, trailers)) case Failure(errorMessage) => promise.fail( - Status.INTERNAL.withDescription(errorMessage).asRuntimeException() + Status.INTERNAL.withDescription(errorMessage).asException() ) case _ => promise.fail( - Status.INTERNAL.withDescription("No data received").asRuntimeException() + Status.INTERNAL.withDescription("No data received").asException() ) } } yield () diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala index 58a9db195..09555a96d 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala @@ -55,7 +55,7 @@ object ListenerDriver { request.succeed(message).flatMap { case false => completed - .fail(Status.INTERNAL.withDescription("Too many requests").asRuntimeException()) + .fail(Status.INTERNAL.withDescription("Too many requests").asException()) .unit case true => ZIO.unit diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index fc47b03e1..b22424ff3 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -45,7 +45,7 @@ object ZServerCallHandler { .attempt(sys.props.get(queueSizeProp).map(_.toInt).getOrElse(16)) .refineToOrDie[NumberFormatException] .catchAll { t => - ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}").asRuntimeException()) + ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}").asException()) } def unaryInput[Req, Res]( diff --git a/docs/context.md b/docs/context.md index b42a58544..1267a1b8f 100644 --- a/docs/context.md +++ b/docs/context.md @@ -63,7 +63,7 @@ def findUser(rc: RequestContext): IO[StatusException, User] = rc.metadata.get(UserKey).flatMap { case Some(name) => ZIO.succeed(User(name)) case _ => ZIO.fail( - Status.UNAUTHENTICATED.withDescription("No access!").asRuntimeException) + Status.UNAUTHENTICATED.withDescription("No access!").asException) } val rcService = @@ -105,7 +105,7 @@ val myServiceAuthWithDatabase: ZIO[UserDatabase, Nothing, ZSimpleService[Request MyService.transformContextZIO { (rc: RequestContext) => rc.metadata.get(UserKey) - .someOrFail(Status.UNAUTHENTICATED.asRuntimeException) + .someOrFail(Status.UNAUTHENTICATED.asException) .flatMap(userDatabase.fetchUser(_)) } ) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala index 8769292e1..4a92c88d9 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala @@ -20,7 +20,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { def unary(request: Request, context: Context): ZIO[Any, StatusException, Response] = for { _ <- context.response.put(RequestIdKey, "1") - _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asException()).when(context.user.name == "Eve") } yield Response(context.user.name) def serverStreaming( @@ -31,7 +31,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { .fromZIO( for { _ <- context.response.put(RequestIdKey, "1") - _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asException()).when(context.user.name == "Eve") } yield () ) .drain ++ @@ -46,7 +46,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { ): ZIO[Any, StatusException, Response] = for { _ <- context.response.put(RequestIdKey, "1") - _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asException()).when(context.user.name == "Eve") } yield Response(context.user.name) def bidiStreaming( @@ -57,7 +57,7 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { .fromZIO( for { _ <- context.response.put(RequestIdKey, "1") - _ <- ZIO.fail(Status.FAILED_PRECONDITION.asRuntimeException()).when(context.user.name == "Eve") + _ <- ZIO.fail(Status.FAILED_PRECONDITION.asException()).when(context.user.name == "Eve") } yield () ) .drain ++ ZStream(Response(context.user.name)) @@ -70,10 +70,10 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests { rc.metadata.get(UserKey).flatMap { case Some("alice") => ZIO.fail( - Status.PERMISSION_DENIED.withDescription("You are not allowed!").asRuntimeException() + Status.PERMISSION_DENIED.withDescription("You are not allowed!").asException() ) case Some(name) => ZIO.succeed(Context(User(name), rc.responseMetadata)) - case None => ZIO.fail(Status.UNAUTHENTICATED.asRuntimeException()) + case None => ZIO.fail(Status.UNAUTHENTICATED.asException()) } val serviceLayer = ZLayer.succeed(ServiceWithConsole.transformContextZIO(parseUser(_))) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala index b0e1b4b75..029dfacba 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala @@ -17,11 +17,11 @@ object ListenerDriverSpec extends ZIOSpecDefault { for { delay <- nextIntBetween(100, 200) _ <- ClockLive.sleep(delay.milliseconds) - _ <- ZIO.fail(Status.INVALID_ARGUMENT.withDescription(s"i=$i").asRuntimeException()) + _ <- ZIO.fail(Status.INVALID_ARGUMENT.withDescription(s"i=$i").asException()) } yield () ) .withParallelism(128) - assertZIO(effectWithInterruptAndFailure.exit.map(ListenerDriver.exitToStatus(_).asRuntimeException()))( + assertZIO(effectWithInterruptAndFailure.exit.map(ListenerDriver.exitToStatus(_).asException()))( hasStatusCode(Status.INVALID_ARGUMENT) ) } diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala index 6e94307bd..80b66b996 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala @@ -29,10 +29,10 @@ package object server { Response(out = "Res" + request.in.toString) ) case Scenario.ERROR_NOW => - ZIO.fail(Status.INTERNAL.withDescription("FOO!").asRuntimeException()) + ZIO.fail(Status.INTERNAL.withDescription("FOO!").asException()) case Scenario.DELAY => ZIO.never case Scenario.DIE => ZIO.die(new RuntimeException("FOO")) - case _ => ZIO.fail(Status.UNKNOWN.asRuntimeException()) + case _ => ZIO.fail(Status.UNKNOWN.asException()) })).onExit(exit.succeed(_)) def serverStreaming( @@ -43,8 +43,8 @@ package object server { ex.foldExit( failed => if (failed.isInterrupted || failed.isInterruptedOnly) - exit.succeed(Exit.fail(Status.CANCELLED.asRuntimeException())) - else exit.succeed(Exit.fail(Status.UNKNOWN.asRuntimeException())), + exit.succeed(Exit.fail(Status.CANCELLED.asException())) + else exit.succeed(Exit.fail(Status.UNKNOWN.asException())), _ => exit.succeed(Exit.succeed(Response())) ) } @@ -53,11 +53,11 @@ package object server { case Scenario.OK => ZStream(Response(out = "X1"), Response(out = "X2")) case Scenario.ERROR_NOW => - ZStream.fail(Status.INTERNAL.withDescription("FOO!").asRuntimeException()) + ZStream.fail(Status.INTERNAL.withDescription("FOO!").asException()) case Scenario.ERROR_AFTER => ZStream(Response(out = "X1"), Response(out = "X2")) ++ ZStream .fail( - Status.INTERNAL.withDescription("FOO!").asRuntimeException() + Status.INTERNAL.withDescription("FOO!").asException() ) case Scenario.DELAY => ZStream( @@ -65,7 +65,7 @@ package object server { Response(out = "X2") ) ++ ZStream.never case Scenario.DIE => ZStream.die(new RuntimeException("FOO")) - case _ => ZStream.fail(Status.UNKNOWN.asRuntimeException()) + case _ => ZStream.fail(Status.UNKNOWN.asException()) } } @@ -80,8 +80,8 @@ package object server { case Scenario.DELAY => delayReceived.succeed(()) *> ZIO.never case Scenario.DIE => ZIO.die(new RuntimeException("foo")) case Scenario.ERROR_NOW => - ZIO.fail((Status.INTERNAL.withDescription("InternalError").asRuntimeException())) - case _: Scenario => ZIO.fail(Status.UNKNOWN.asRuntimeException()) + ZIO.fail((Status.INTERNAL.withDescription("InternalError").asException())) + case _: Scenario => ZIO.fail(Status.UNKNOWN.asException()) } ) .map(r => Response(r.toString)) @@ -99,10 +99,10 @@ package object server { case Scenario.DELAY => ZStream.never case Scenario.DIE => ZStream.die(new RuntimeException("FOO")) case Scenario.ERROR_NOW => - ZStream.fail(Status.INTERNAL.withDescription("Intentional error").asRuntimeException()) + ZStream.fail(Status.INTERNAL.withDescription("Intentional error").asException()) case _ => ZStream.fail( - Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}").asRuntimeException() + Status.INVALID_ARGUMENT.withDescription(s"Got request: ${r.toProtoString}").asException() ) } } ++ ZStream(Response("DONE"))) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index cf42acb2c..f7c3e1bd7 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -296,7 +296,7 @@ object TestServiceSpec extends ZIOSpecDefault { ZStream( Request(Scenario.OK, in = 17) ) ++ ZStream.fromZIO(testServiceImpl.get.awaitReceived).drain - ++ ZStream.fail(Status.CANCELLED.asRuntimeException()) + ++ ZStream.fail(Status.CANCELLED.asException()) ) ).fork _ <- testServiceImpl.get.awaitExit diff --git a/website/versioned_docs/version-0.5.x/deadlines.md b/website/versioned_docs/version-0.5.x/deadlines.md index 93423f232..4be3b1f3b 100644 --- a/website/versioned_docs/version-0.5.x/deadlines.md +++ b/website/versioned_docs/version-0.5.x/deadlines.md @@ -99,7 +99,7 @@ val myAppLogic = for { res <- clientManaged.use( client => client.withTimeoutMillis(3000).unary(Request()) - .mapError(_.asRuntimeException) + .mapError(_.asException) ) } yield res // myAppLogic: ZIO[Any with Any, Throwable, Response] = zio.ZIO$FlatMap@2be1bc9f diff --git a/website/versioned_docs/version-0.5.x/generated-code.md b/website/versioned_docs/version-0.5.x/generated-code.md index 00a55756d..09c34cf09 100644 --- a/website/versioned_docs/version-0.5.x/generated-code.md +++ b/website/versioned_docs/version-0.5.x/generated-code.md @@ -168,7 +168,7 @@ val clientManaged = ServiceNameClient.managed(channel) val myAppLogic = for { res <- clientManaged.use( client => - client.unary(Request()).mapError(_.asRuntimeException) + client.unary(Request()).mapError(_.asException) ) } yield res // myAppLogic: ZIO[Any with Any, Throwable, Response] = zio.ZIO$FlatMap@1a4cd330 From 2e351e02b08313e33253b5c45fb12224e05b66ce Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 27 Mar 2023 22:51:52 -0700 Subject: [PATCH 142/245] Fix Scala.js implementation --- .../scala/scalapb/zio_grpc/GreeterImpl.scala | 6 +- .../scalapb/zio_grpc/client/ClientCalls.scala | 96 ++++++++++--------- .../zio_grpc/server/ZServerCallHandler.scala | 10 +- 3 files changed, 57 insertions(+), 55 deletions(-) diff --git a/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala b/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala index 1e7ca5225..7841705c9 100644 --- a/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala +++ b/benchmarks/src/main/scala/scalapb/zio_grpc/GreeterImpl.scala @@ -2,16 +2,16 @@ package scalapb.zio_grpc import scalapb.zio_grpc.helloworld.testservice.ZioTestservice.Greeter import scalapb.zio_grpc.helloworld.testservice.{HelloReply, HelloRequest} -import io.grpc.Status +import io.grpc.StatusException import zio.ZIO import zio.stream.ZStream class GreeterImpl(size: Long) extends Greeter { - def sayHello(request: HelloRequest): ZIO[Any, Status, HelloReply] = + def sayHello(request: HelloRequest): ZIO[Any, StatusException, HelloReply] = ZIO.succeed(HelloReply(request.request)) - def sayHelloStreaming(request: HelloRequest): ZStream[Any, Status, HelloReply] = + def sayHelloStreaming(request: HelloRequest): ZStream[Any, StatusException, HelloReply] = ZStream.repeat(HelloReply(request.request)).take(size) } diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index 977bc7e5a..b4e1137f1 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -19,7 +19,18 @@ object ClientCalls { headers: SafeMetadata, req: Req ): IO[StatusException, ResponseContext[Res]] = - ZIO.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) + ZIO.async { callback => + channel.channel.client.rpcCall[Req, Res]( + channel.channel.baseUrl + "/" + method.fullName, + req, + scalajs.js.Dictionary[String](), + method.methodInfo, + (errorInfo: ErrorInfo, resp: Res) => + if (errorInfo != null) + callback(ZIO.fail(new StatusException(Status.fromErrorInfo(errorInfo)))) + else callback(ZIO.succeed(ResponseContext(null, resp, null))) + ) + } def serverStreamingCall[Req, Res]( channel: ZChannel, @@ -28,7 +39,39 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[Any, StatusException, ResponseFrame[Res]] = - ZStream.fail(new StatusException(Status.INTERNAL.withDescription("Not supported"))) + ZStream.async[Any, StatusException, ResponseFrame[Res]] { cb => + channel.channel.client + .serverStreaming[Req, Res]( + channel.channel.baseUrl + "/" + method.fullName, + req, + scalajs.js.Dictionary[String](), + method.methodInfo + ) + .on( + "data", + { (res: Res) => + val _ = cb(ZIO.succeed(Chunk.single(ResponseFrame.Message(res)))) + } + ) + .on( + "error", + { (ei: ErrorInfo) => + val _ = cb(ZIO.fail(Some(new StatusException(Status.fromErrorInfo(ei))))) + } + ) + .on( + "end", + { () => + val _ = cb(ZIO.fail(None)) + } + ) + .on( + "status", + (status: StatusInfo) => + if (status.code != 0) + cb(ZIO.fail(Some(new StatusException(Status.fromStatusInfo(status))))) + ) + } def clientStreamingCall[Req, Res]( channel: ZChannel, @@ -56,18 +99,7 @@ object ClientCalls { headers: SafeMetadata, req: Req ): IO[StatusException, Res] = - ZIO.async { callback => - channel.channel.client.rpcCall[Req, Res]( - channel.channel.baseUrl + "/" + method.fullName, - req, - scalajs.js.Dictionary[String](), - method.methodInfo, - (errorInfo: ErrorInfo, resp: Res) => - if (errorInfo != null) - callback(ZIO.fail(new StatusException(Status.fromErrorInfo(errorInfo)))) - else callback(ZIO.succeed(resp)) - ) - } + withMetadata.unaryCall(channel, method, options, headers, req).map(_.response) def serverStreamingCall[Req, Res]( channel: ZChannel, @@ -76,39 +108,9 @@ object ClientCalls { headers: SafeMetadata, req: Req ): ZStream[Any, StatusException, Res] = - ZStream.async[Any, StatusException, Res] { cb => - channel.channel.client - .serverStreaming[Req, Res]( - channel.channel.baseUrl + "/" + method.fullName, - req, - scalajs.js.Dictionary[String](), - method.methodInfo - ) - .on( - "data", - { (res: Res) => - val _ = cb(ZIO.succeed(Chunk.single(res))) - } - ) - .on( - "error", - { (ei: ErrorInfo) => - val _ = cb(ZIO.fail(Some(new StatusException(Status.fromErrorInfo(ei))))) - } - ) - .on( - "end", - { () => - val _ = cb(ZIO.fail(None)) - } - ) - .on( - "status", - (status: StatusInfo) => - if (status.code != 0) - cb(ZIO.fail(Some(new StatusException(Status.fromStatusInfo(status))))) - ) - } + withMetadata + .serverStreamingCall(channel, method, options, headers, req) + .collect { case ResponseFrame.Message(x) => x } def clientStreamingCall[Req, Res]( channel: ZChannel, diff --git a/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala index 488a4d16f..2ff007d29 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -1,6 +1,6 @@ package scalapb.zio_grpc.server -import io.grpc.Status +import io.grpc.StatusException import zio.Runtime import zio.ZIO import zio.stream.{Stream, ZStream} @@ -12,21 +12,21 @@ trait ServerCallHandler[Req, Res] object ZServerCallHandler { def unaryCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext) => ZIO[Any, Status, Res] + impl: (Req, RequestContext) => ZIO[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = ??? def serverStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Req, RequestContext) => ZStream[Any, Status, Res] + impl: (Req, RequestContext) => ZStream[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = ??? def clientStreamingCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Stream[Status, Req], RequestContext) => ZIO[Any, Status, Res] + impl: (Stream[StatusException, Req], RequestContext) => ZIO[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = ??? def bidiCallHandler[Req, Res]( runtime: Runtime[Any], - impl: (Stream[Status, Req], RequestContext) => ZStream[Any, Status, Res] + impl: (Stream[StatusException, Req], RequestContext) => ZStream[Any, StatusException, Res] ): ServerCallHandler[Req, Res] = ??? } From 648b3c331adf3fc203669ae649198d23be2aa34f Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 27 Mar 2023 23:31:45 -0700 Subject: [PATCH 143/245] Update fullapp to 0.6.0-rc4, add docs. Fixes #489 --- examples/fullapp/README.md | 33 ++++++++++ examples/fullapp/docker-compose.yaml | 10 +++ examples/fullapp/envoy/envoy.yaml | 61 +++++++++++++++++++ examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 15 +++-- .../scala/ExampleServerWithMetadata.scala | 31 ++++++---- .../webapp/src/main/scala/WebappMain.scala | 4 +- 7 files changed, 135 insertions(+), 21 deletions(-) create mode 100644 examples/fullapp/README.md create mode 100644 examples/fullapp/docker-compose.yaml create mode 100644 examples/fullapp/envoy/envoy.yaml diff --git a/examples/fullapp/README.md b/examples/fullapp/README.md new file mode 100644 index 000000000..bd3f336f8 --- /dev/null +++ b/examples/fullapp/README.md @@ -0,0 +1,33 @@ +# Full App Demo + +This project demonstrates a zio-grpc server working with a Scala.js client. +The shared protos reside in an SBT subproject named `protos`. + +Requests reaching the server will be handled by envoyproxy on port 8080. The +requests will be proxied to a gRPC server running on port 9000. + +To get this project running: + +1. In SBT, build the client: + + ``` + sbt:fullapp> webapp/fastOptJS/webpack + ``` + +2. Run the gRPC server: + + ``` + sbt:fullapp> server/runMain examples.ExampleServer + ``` + +3. On a different tab, start envoyproxy in a docker container: + + ``` + $ docker-compose up` + ``` + +4. In a browser open `index.html` in this directory. In Google Chrome, you can open a file by pressing + Ctrl-O in Windows or Linux, or Cmd-O on a Mac. + +5. The page should be blank, however if you open `Developer Tools > Console`, + you can see the output of the client program. diff --git a/examples/fullapp/docker-compose.yaml b/examples/fullapp/docker-compose.yaml new file mode 100644 index 000000000..a26d82176 --- /dev/null +++ b/examples/fullapp/docker-compose.yaml @@ -0,0 +1,10 @@ +version: '3' +services: + envoy: + image: envoyproxy/envoy:v1.25-latest + volumes: + - ./envoy/envoy.yaml:/etc/envoy/envoy.yaml + extra_hosts: + - "host.docker.internal:host-gateway" + ports: + - "8080:8080" diff --git a/examples/fullapp/envoy/envoy.yaml b/examples/fullapp/envoy/envoy.yaml new file mode 100644 index 000000000..5b01a4c02 --- /dev/null +++ b/examples/fullapp/envoy/envoy.yaml @@ -0,0 +1,61 @@ +admin: + access_log_path: /tmp/admin_access.log + address: + socket_address: { address: 0.0.0.0, port_value: 9901 } + +static_resources: + listeners: + - name: listener_0 + address: + socket_address: { address: 0.0.0.0, port_value: 8080 } + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager + codec_type: auto + stat_prefix: ingress_http + route_config: + name: local_route + virtual_hosts: + - name: local_service + domains: ["*"] + routes: + - match: { prefix: "/" } + route: + cluster: greeter_service + timeout: 0s + max_stream_duration: + grpc_timeout_header_max: 0s + cors: + allow_origin_string_match: + - prefix: "*" + allow_methods: GET, PUT, DELETE, POST, OPTIONS + allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout + max_age: "1728000" + expose_headers: custom-header-1,grpc-status,grpc-message + http_filters: + - name: envoy.filters.http.grpc_web + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb + - name: envoy.filters.http.cors + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router + clusters: + - name: greeter_service + connect_timeout: 0.25s + type: logical_dns + http2_protocol_options: {} + lb_policy: round_robin + load_assignment: + cluster_name: cluster_0 + endpoints: + - lb_endpoints: + - endpoint: + address: + socket_address: + address: host.docker.internal + port_value: 9000 diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index cd1324828..91c7ad9cc 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-rc1" +val zioGrpcVersion = "0.6.0-rc4" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index 26ef4705c..233e813a6 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -5,32 +5,35 @@ import examples.greeter._ import zio.Duration._ import zio.stream.{Stream, ZStream} import io.grpc.ServerBuilder -import io.grpc.Status +import io.grpc.{Status, StatusException} import zio._ import scalapb.zio_grpc.{ServerMain, ServiceList} import zio.Console.{print, printLine} object GreeterService { object LiveService extends Greeter { - def greet(req: Request): IO[Status, Response] = + def greet(req: Request): IO[StatusException, Response] = Clock.sleep(300.millis).as(Response(resp = "hello " + req.name)) def points( request: Request - ): Stream[Status, Point] = + ): Stream[StatusException, Point] = ZStream(Point(3, 4)) .schedule(Schedule.spaced(1000.millis)) .forever .take(5) ++ ZStream.fail( Status.INTERNAL - .withDescription("There was an error!") + .withDescription( + "There was an error! This error is for demonstration purposes and is expected." + ) .withCause(new RuntimeException) + .asException ) def bidi( - request: Stream[Status, Point] - ): Stream[Status, Response] = + request: Stream[StatusException, Point] + ): Stream[StatusException, Response] = request.grouped(3).map(r => Response(r.toString())) } } diff --git a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala index 6bd6fead6..aa11924c4 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServerWithMetadata.scala @@ -7,7 +7,7 @@ import zio.stream.Stream import io.grpc.Metadata import io.grpc.ServerBuilder import zio.Console._ -import io.grpc.Status +import io.grpc.{Status, StatusException} import scalapb.zio_grpc.Server import scalapb.zio_grpc.SafeMetadata import scalapb.zio_grpc.RequestContext @@ -18,14 +18,15 @@ case class User(name: String) // UserRepo service, used to resolve the user id that is provided to us // by looking into a user database. trait UserRepo { - def findUser(name: String): ZIO[Any, Status, User] + def findUser(name: String): ZIO[Any, StatusException, User] } // This is our "real" implementation of the service. case class UserRepoImpl() extends UserRepo { - def findUser(name: String): ZIO[Any, Status, User] = name match { + def findUser(name: String): ZIO[Any, StatusException, User] = name match { case "john" => ZIO.succeed(User("John")) - case _ => ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!")) + case _ => + ZIO.fail(Status.UNAUTHENTICATED.withDescription("No access!").asException) } } @@ -36,12 +37,12 @@ object UserRepo { // GreetingsRepo is a service that returns an appropriate greeting to // any given user. trait GreetingsRepo { - def greetingForUser(user: User): ZIO[Any, Status, String] + def greetingForUser(user: User): ZIO[Any, StatusException, String] } // An implementation of the service. case class GreetingsRepoImpl() extends GreetingsRepo { - def greetingForUser(user: User): ZIO[Any, Status, String] = + def greetingForUser(user: User): ZIO[Any, StatusException, String] = ZIO.succeed("Hello ${user.name}") } @@ -54,17 +55,18 @@ object GreeterServiceWithMetadata { // Each request gets a User as a context parameter. The service itself // depends on a GreetingsRepo service. case class GreeterImpl(greetingsRepo: GreetingsRepo) extends ZGreeter[User] { - def greet(req: Request, user: User): ZIO[Any, Status, Response] = + def greet(req: Request, user: User): ZIO[Any, StatusException, Response] = for { greeting <- greetingsRepo.greetingForUser(user) } yield Response(s"${greeting}, req: ${req}") - def points(request: Request, user: User): Stream[Status, Point] = ??? + def points(request: Request, user: User): Stream[StatusException, Point] = + ??? def bidi( - request: Stream[Status, Point], + request: Stream[StatusException, Point], user: User - ): Stream[Status, Response] = ??? + ): Stream[StatusException, Response] = ??? } val UserKey = @@ -72,12 +74,17 @@ object GreeterServiceWithMetadata { // Fetches the user-key from the request's metadata and looks it up in the UserRepo. // We trust here that the user is who they claim to be... - def findUser(userRepo: UserRepo, rc: RequestContext): IO[Status, User] = + def findUser( + userRepo: UserRepo, + rc: RequestContext + ): IO[StatusException, User] = for { name <- rc.metadata .get(UserKey) .someOrFail( - Status.UNAUTHENTICATED.withDescription("No user-key header provided") + Status.UNAUTHENTICATED + .withDescription("No user-key header provided") + .asException ) user <- userRepo.findUser(name) } yield user diff --git a/examples/fullapp/webapp/src/main/scala/WebappMain.scala b/examples/fullapp/webapp/src/main/scala/WebappMain.scala index e26bbe817..aaa1205fd 100644 --- a/examples/fullapp/webapp/src/main/scala/WebappMain.scala +++ b/examples/fullapp/webapp/src/main/scala/WebappMain.scala @@ -6,7 +6,7 @@ import zio._ import zio.Console._ import examples.greeter.Request import scalapb.zio_grpc.ZManagedChannel -import io.grpc.Status +import io.grpc.StatusException object WebappMain extends ZIOAppDefault { val clientLayer = GreeterClient.live( @@ -21,7 +21,7 @@ object WebappMain extends ZIOAppDefault { (GreeterClient .points(Request("Foo!")) .foreach(s => printLine(s"success: $s").orDie) - .catchAll { (s: Status) => + .catchAll { (s: StatusException) => printLine(s"Caught: $s") }) From 8d0fe9849d1a96f30272a0e61f2bc35c599a0ebf Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 3 Apr 2023 18:56:47 -0700 Subject: [PATCH 144/245] Add support for client provided metadata in Scala.js For #492 --- .../scalajs/scalapb/zio_grpc/SafeMetadata.scala | 16 ++++++++++++++++ .../scalapb/zio_grpc/client/ClientCalls.scala | 4 ++-- .../scalapb/zio_grpc/SafeMetadata.scala | 8 ++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 core/src/main/scalajs/scalapb/zio_grpc/SafeMetadata.scala rename core/src/main/{scala => scalajvm}/scalapb/zio_grpc/SafeMetadata.scala (81%) diff --git a/core/src/main/scalajs/scalapb/zio_grpc/SafeMetadata.scala b/core/src/main/scalajs/scalapb/zio_grpc/SafeMetadata.scala new file mode 100644 index 000000000..6c29d6474 --- /dev/null +++ b/core/src/main/scalajs/scalapb/zio_grpc/SafeMetadata.scala @@ -0,0 +1,16 @@ +package scalapb.zio_grpc + +import zio.ZIO +import zio.UIO +import scalajs.js.Dictionary + +final class SafeMetadata private ( + private[zio_grpc] val metadata: Dictionary[String] +) {} + +object SafeMetadata { + def make: UIO[SafeMetadata] = ZIO.succeed(new SafeMetadata(Dictionary.empty)) + + def make(pairs: (String, String)*): UIO[SafeMetadata] = + ZIO.succeed(new SafeMetadata(Dictionary(pairs: _*))) +} diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index b4e1137f1..1e13998b1 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -23,7 +23,7 @@ object ClientCalls { channel.channel.client.rpcCall[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, req, - scalajs.js.Dictionary[String](), + headers.metadata, method.methodInfo, (errorInfo: ErrorInfo, resp: Res) => if (errorInfo != null) @@ -44,7 +44,7 @@ object ClientCalls { .serverStreaming[Req, Res]( channel.channel.baseUrl + "/" + method.fullName, req, - scalajs.js.Dictionary[String](), + headers.metadata, method.methodInfo ) .on( diff --git a/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala b/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala similarity index 81% rename from core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala rename to core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala index 20407f508..3d6569e72 100644 --- a/core/src/main/scala/scalapb/zio_grpc/SafeMetadata.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala @@ -29,6 +29,14 @@ final class SafeMetadata private ( object SafeMetadata { def make: UIO[SafeMetadata] = fromMetadata(new Metadata) + def make(pairs: (String, String)*): UIO[SafeMetadata] = { + val md = new Metadata + pairs.foreach { case (key, value) => + md.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value) + } + SafeMetadata.fromMetadata(md) + } + /** Creates a new SafeMetadata by taking ownership of the given metadata. The provided metadata should not be used * after calling this method. */ From 3a2f9864e74d5e562308484473d27411b7102bfb Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 3 Apr 2023 23:58:42 -0700 Subject: [PATCH 145/245] Use ZIO Config for controlling backpressure queue size. The tests in backpressure spec were flaky as they were setting the system property while other tests were running creating unexpected failures (as one of the test is purposefuly inserting invalid values). The value is now configurable using ZIO Config which allows mocking the config provider, but have an unfortunate side effect of slightly changing the property name as described in the changelog and docs. --- CHANGELOG.md | 4 ++++ .../scalapb/zio_grpc/server/ZServerCallHandler.scala | 9 ++++----- docs/backpressure.md | 9 +++++++++ .../scala/scalapb/zio_grpc/BackpressureSpec.scala | 11 +++++------ .../test/scala/scalapb/zio_grpc/MetadataTests.scala | 1 + 5 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 docs/backpressure.md diff --git a/CHANGELOG.md b/CHANGELOG.md index c8d5ca59a..d9822d732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ### What changed? +* Backpressure queue size is controlled by either + `ZIO_GRPC_BACKPRESSURE_QUEUE_SIZE` environment variable or + `zio_grpc.backpressure_queue_size` system property (previously the names + were hyphenated). Change was made for compatibility with ZIO Config. * Removed the `R` type parameter for generated services. Generated services now have a single type parameter for context. This simplifies the previous APIs and encourages the ZIO 2 style that service dependencies are passed via constructors (see [service pattern](https://zio.dev/reference/service-pattern/)) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index b22424ff3..dc310847b 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -38,14 +38,13 @@ class ZServerCallHandler[Req, Res]( } object ZServerCallHandler { - private[zio_grpc] val queueSizeProp = "zio-grpc.backpressure-queue-size" + private[zio_grpc] val queueSizeProp = "backpressure_queue_size" val backpressureQueueSize: IO[StatusException, Int] = ZIO - .attempt(sys.props.get(queueSizeProp).map(_.toInt).getOrElse(16)) - .refineToOrDie[NumberFormatException] - .catchAll { t => - ZIO.fail(Status.INTERNAL.withDescription(s"$queueSizeProp: ${t.getMessage}").asException()) + .config(zio.Config.int(queueSizeProp).nested("zio_grpc").withDefault(16)) + .mapError { (e: zio.Config.Error) => + Status.INTERNAL.withDescription(s"$queueSizeProp: ${e.getMessage}").asException() } def unaryInput[Req, Res]( diff --git a/docs/backpressure.md b/docs/backpressure.md new file mode 100644 index 000000000..63b66a070 --- /dev/null +++ b/docs/backpressure.md @@ -0,0 +1,9 @@ +--- +title: Backpressure +sidebar_label: Backpressure +custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/backpressure.md +--- + +From version 0.5.3 onwards, zio-grpc provides backpressure support for server +streaming RPCs. In case the call is not capable to sending additional messages +without buffering (as determined by [`ServerCall.isReady`](https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerCall.html#isReady])), sending messages from the queue associated with server response `Stream` will stop. The default size of this queue is `16`, and can be configured by setting the system property `zio_grpc.backpressure_queue_size` or the environment variable `ZIO_GRPC_BACKPRESSURE_QUEUE_SIZE`. diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala index 04587263d..2fc9a8743 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala @@ -11,6 +11,9 @@ import io.grpc.Attributes import io.grpc.ServerCall object BackpressureSpec extends ZIOSpecDefault { + def mockConfigProvider(value: String): ZLayer[Any, Nothing, Unit] = + Runtime.setConfigProvider(ConfigProvider.fromMap(Map(ZServerCallHandler.queueSizeProp -> value))) + val spec = suite("Backpressure")( test("Die is propagated") { @@ -30,18 +33,14 @@ object BackpressureSpec extends ZIOSpecDefault { }, test("Gets queue size from config") { assertZIO(for { - _ <- ZIO.attempt(sys.props += ZServerCallHandler.queueSizeProp -> "32") size <- ZServerCallHandler.backpressureQueueSize - _ <- ZIO.attempt(sys.props -= ZServerCallHandler.queueSizeProp) } yield size)(equalTo(32)) - }, + }.provideLayer(mockConfigProvider("32")), test("Fails when queue size is malformatted") { assertZIO(for { - _ <- ZIO.attempt(sys.props += ZServerCallHandler.queueSizeProp -> " 32 ") size <- ZServerCallHandler.backpressureQueueSize.exit - _ <- ZIO.attempt(sys.props -= ZServerCallHandler.queueSizeProp) } yield size)(fails(anything)) - }, + }.provideLayer(mockConfigProvider(" 32 ")), test("Interruption is propagated") { assertZIO(for { sem <- TSemaphore.make(1).commit diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala index cd2f0341c..aedcae25a 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala @@ -2,6 +2,7 @@ package scalapb.zio_grpc import zio.test.{test, _} import zio.test.Assertion._ +import zio.test.TestAspect.nonFlaky import zio.stream.ZStream import io.grpc.Metadata import io.grpc.Status From 8fe895316285a637c49ec23a17f6e7ab7119b3c7 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 4 Apr 2023 08:51:32 -0700 Subject: [PATCH 146/245] Fix backpressure queue size property name --- .../scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index dc310847b..2b70299a5 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -38,11 +38,11 @@ class ZServerCallHandler[Req, Res]( } object ZServerCallHandler { - private[zio_grpc] val queueSizeProp = "backpressure_queue_size" + private[zio_grpc] val queueSizeProp = "zio_grpc.backpressure_queue_size" val backpressureQueueSize: IO[StatusException, Int] = ZIO - .config(zio.Config.int(queueSizeProp).nested("zio_grpc").withDefault(16)) + .config(zio.Config.int("backpressure_queue_size").nested("zio_grpc").withDefault(16)) .mapError { (e: zio.Config.Error) => Status.INTERNAL.withDescription(s"$queueSizeProp: ${e.getMessage}").asException() } From 415dc134274657a149b473b9c13d91e2a41b69a4 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 4 Apr 2023 09:41:43 -0700 Subject: [PATCH 147/245] Attempt to fix flaky test --- .../scala/scalapb/zio_grpc/TestServiceSpec.scala | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala index f7c3e1bd7..df0465bdc 100644 --- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala +++ b/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala @@ -9,7 +9,7 @@ import scalapb.zio_grpc.testservice._ import zio.{durationInt, Fiber, Queue, URIO, ZIO, ZLayer} import zio.stream.{Stream, ZStream} import zio.test.Assertion._ -import zio.test.TestAspect.{nonFlaky, timeout} +import zio.test.TestAspect.{flaky, timeout, withLiveClock} import zio.test._ object TestServiceSpec extends ZIOSpecDefault { @@ -66,11 +66,16 @@ object TestServiceSpec extends ZIOSpecDefault { ) }, test("setting deadline interrupts the servers") { + // If the timeout is too short, gRPC may not make the call or send messages. While the + // timeout below is set to 1s, it can still get missed on CI. + // On the other hand, if we set it for too long it slows down the test. As a compromise, + // we mark it a flaky. for { r <- TestServiceClient.withTimeoutMillis(1000).unary(Request(Request.Scenario.DELAY, in = 12)).exit - exit <- TestServiceImpl.awaitExit - } yield assert(r)(fails(hasStatusCode(Status.DEADLINE_EXCEEDED))) && assert(exit.isInterrupted)(isTrue) - } + // The timeout below protects the test from getting hang if the call is discarded by grpc. + exit <- TestServiceImpl.awaitExit.timeout(3.seconds) + } yield assert(r)(fails(hasStatusCode(Status.DEADLINE_EXCEEDED))) && assert(exit.get.isInterrupted)(isTrue) + } @@ flaky(100) @@ withLiveClock ) def collectWithError[R, E, A]( @@ -200,7 +205,7 @@ object TestServiceSpec extends ZIOSpecDefault { _ <- fiber.interrupt exit <- TestServiceImpl.awaitExit } yield exit)(isInterrupted) - } @@ nonFlaky, + }, test("returns response on failures") { assertZIO( TestServiceClient From ea7ceaf64c8267965ef62f4e681ecee388ddcc2f Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 4 Apr 2023 09:53:11 -0700 Subject: [PATCH 148/245] Update fullapp to support metadata ith 0.6.0-rc5 For #492 --- examples/fullapp/README.md | 2 +- examples/fullapp/envoy/envoy.yaml | 2 +- examples/fullapp/project/plugins.sbt | 2 +- .../server/src/main/scala/ExampleServer.scala | 83 ++++++++++++++----- .../webapp/src/main/scala/WebappMain.scala | 26 +++++- 5 files changed, 87 insertions(+), 28 deletions(-) diff --git a/examples/fullapp/README.md b/examples/fullapp/README.md index bd3f336f8..382519b4e 100644 --- a/examples/fullapp/README.md +++ b/examples/fullapp/README.md @@ -23,7 +23,7 @@ To get this project running: 3. On a different tab, start envoyproxy in a docker container: ``` - $ docker-compose up` + $ docker-compose up ``` 4. In a browser open `index.html` in this directory. In Google Chrome, you can open a file by pressing diff --git a/examples/fullapp/envoy/envoy.yaml b/examples/fullapp/envoy/envoy.yaml index 5b01a4c02..c9d741a33 100644 --- a/examples/fullapp/envoy/envoy.yaml +++ b/examples/fullapp/envoy/envoy.yaml @@ -31,7 +31,7 @@ static_resources: allow_origin_string_match: - prefix: "*" allow_methods: GET, PUT, DELETE, POST, OPTIONS - allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout + allow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeout,serve-error max_age: "1728000" expose_headers: custom-header-1,grpc-status,grpc-message http_filters: diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt index 91c7ad9cc..7fa2e53a1 100644 --- a/examples/fullapp/project/plugins.sbt +++ b/examples/fullapp/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-rc4" +val zioGrpcVersion = "0.6.0-rc5" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/fullapp/server/src/main/scala/ExampleServer.scala b/examples/fullapp/server/src/main/scala/ExampleServer.scala index 233e813a6..7c056a9ff 100644 --- a/examples/fullapp/server/src/main/scala/ExampleServer.scala +++ b/examples/fullapp/server/src/main/scala/ExampleServer.scala @@ -1,6 +1,6 @@ package examples -import examples.greeter.ZioGreeter.Greeter +import examples.greeter.ZioGreeter.ZGreeter import examples.greeter._ import zio.Duration._ import zio.stream.{Stream, ZStream} @@ -9,35 +9,72 @@ import io.grpc.{Status, StatusException} import zio._ import scalapb.zio_grpc.{ServerMain, ServiceList} import zio.Console.{print, printLine} +import io.grpc.Metadata +import scalapb.zio_grpc.SafeMetadata -object GreeterService { - object LiveService extends Greeter { - def greet(req: Request): IO[StatusException, Response] = +// The metadata of each request will tell us if we want to serve an error +// back to the user. +case class RequestContext(serveError: Boolean) + +object RequestContext { + val ServeErrorKey = + Metadata.Key.of("serve-error", Metadata.ASCII_STRING_MARSHALLER) + + def fromMetadata(md: SafeMetadata): UIO[RequestContext] = for { + maybeValue <- md.get(ServeErrorKey) + value = maybeValue.getOrElse("") match { + case "1" | "true" => true + case _ => false + } + } yield RequestContext(value) +} + +object GreeterService extends ZGreeter[RequestContext] { + def greet( + req: Request, + context: RequestContext + ): IO[StatusException, Response] = + if (context.serveError) + ZIO.fail( + Status.UNKNOWN + .withDescription( + "Error requested by setting serve-error to true (expected error)" + ) + .asException + ) + else Clock.sleep(300.millis).as(Response(resp = "hello " + req.name)) - def points( - request: Request - ): Stream[StatusException, Point] = - ZStream(Point(3, 4)) - .schedule(Schedule.spaced(1000.millis)) - .forever - .take(5) ++ - ZStream.fail( - Status.INTERNAL - .withDescription( - "There was an error! This error is for demonstration purposes and is expected." - ) - .withCause(new RuntimeException) - .asException + def points( + request: Request, + context: RequestContext + ): Stream[StatusException, Point] = { + val res = ZStream(Point(3, 4)) + .schedule(Schedule.spaced(1000.millis)) + .forever + .take(5) + + val fail = ZStream.fail( + Status.INTERNAL + .withDescription( + "Error requested by setting serve-error to true (expected error)" ) + .withCause(new RuntimeException) + .asException + ) - def bidi( - request: Stream[StatusException, Point] - ): Stream[StatusException, Response] = - request.grouped(3).map(r => Response(r.toString())) + if (context.serveError) res ++ fail else res } + + def bidi( + request: Stream[StatusException, Point], + context: RequestContext + ): Stream[StatusException, Response] = + request.grouped(3).map(r => Response(r.toString())) } object ExampleServer extends ServerMain { - def services = ServiceList.add(GreeterService.LiveService) + def services = ServiceList.add( + GreeterService.transformContextZIO(RequestContext.fromMetadata(_)) + ) } diff --git a/examples/fullapp/webapp/src/main/scala/WebappMain.scala b/examples/fullapp/webapp/src/main/scala/WebappMain.scala index aaa1205fd..acc62b7e1 100644 --- a/examples/fullapp/webapp/src/main/scala/WebappMain.scala +++ b/examples/fullapp/webapp/src/main/scala/WebappMain.scala @@ -7,6 +7,7 @@ import zio.Console._ import examples.greeter.Request import scalapb.zio_grpc.ZManagedChannel import io.grpc.StatusException +import scalapb.zio_grpc.SafeMetadata object WebappMain extends ZIOAppDefault { val clientLayer = GreeterClient.live( @@ -14,11 +15,32 @@ object WebappMain extends ZIOAppDefault { ) val appLogic = - printLine("Hello!") *> + printLine("Welcome to zio-grpc full app client!") *> + printLine("Test 1: Successful unary request") *> GreeterClient .greet(Request("Foo!")) - .foldZIO(s => printLine(s"error: $s"), s => print(s"success: $s")) *> + .foldZIO( + s => printLine(s"error: $s"), + s => printLine(s"success: $s") + ) *> + printLine("Test 2: Unary request that fails") *> + GreeterClient + .withMetadataZIO(SafeMetadata.make("serve-error" -> "true")) + .greet(Request("Foo!")) + .foldZIO( + s => printLine(s"error: $s"), + s => printLine(s"success: $s") + ) *> + printLine("Test 3: Server-streaing request") *> + (GreeterClient + .points(Request("Foo!")) + .foreach(s => printLine(s"success: $s").orDie) + .catchAll { (s: StatusException) => + printLine(s"Caught: $s") + }) *> + printLine("Test 4: Server-streaing request that fails") *> (GreeterClient + .withMetadataZIO(SafeMetadata.make("serve-error" -> "true")) .points(Request("Foo!")) .foreach(s => printLine(s"success: $s").orDie) .catchAll { (s: StatusException) => From 6f923846ed792c8c34c3f41ec81e15e91d78f12a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:59:49 -0700 Subject: [PATCH 149/245] Bump webpack from 5.75.0 to 5.76.1 in /website (#490) Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.1. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.75.0...v5.76.1) --- updated-dependencies: - dependency-name: webpack dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index dc2e6528b..26ff791d0 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -8528,9 +8528,9 @@ webpack-sources@^3.2.2, webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.75.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.75.0.tgz#1e440468647b2505860e94c9ff3e44d5b582c152" - integrity sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ== + version "5.76.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" + integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" From af20d3969fee1b9338876936992450dbc969aef3 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 4 Apr 2023 21:00:07 +0200 Subject: [PATCH 150/245] Update zio, zio-streams, zio-test, ... to 2.0.10 (#486) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index c2c0d4563..6ccd5b22c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.9" + val zio = "2.0.10" val grpc = "1.47.0" } From efbe9a1ae0858028c9f4f531e4c385fce8054d0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:09:34 -0700 Subject: [PATCH 151/245] Bump @sideway/formula from 3.0.0 to 3.0.1 in /website (#493) Bumps [@sideway/formula](https://github.com/sideway/formula) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/sideway/formula/releases) - [Commits](https://github.com/sideway/formula/compare/v3.0.0...v3.0.1) --- updated-dependencies: - dependency-name: "@sideway/formula" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index 26ff791d0..919c83d46 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2718,9 +2718,9 @@ "@hapi/hoek" "^9.0.0" "@sideway/formula@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz#fe158aee32e6bd5de85044be615bc08478a0a13c" - integrity sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== "@sideway/pinpoint@^2.0.0": version "2.0.0" From 53032d78661d9c43498a8e8029f804663f7ccbd2 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 7 Apr 2023 19:08:33 +0200 Subject: [PATCH 152/245] Update zio, zio-streams, zio-test, ... to 2.0.11 (#494) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 6ccd5b22c..3390e781c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.10" + val zio = "2.0.11" val grpc = "1.47.0" } From 03292fdfe36baa4a1ea3086e8d76c5675c6d8eb9 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:56:34 +0200 Subject: [PATCH 153/245] Update zio, zio-streams, zio-test, ... to 2.0.12 (#496) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 3390e781c..cdd436dd4 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.11" + val zio = "2.0.12" val grpc = "1.47.0" } From 59246f56c04dc6e72e1292f5def3492960912b01 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 14 Apr 2023 09:23:49 -0700 Subject: [PATCH 154/245] Update docs version --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 34b0e5c5b..3b662bace 100644 --- a/build.sbt +++ b/build.sbt @@ -162,7 +162,7 @@ lazy val docs = project mdocVariables := Map( "sbtProtocVersion" -> "1.0.6", "grpcVersion" -> "1.50.1", - "zioGrpcVersion" -> "0.6.0-M1", + "zioGrpcVersion" -> "0.6.0-rc5", "scalapbVersion" -> scalapb.compiler.Version.scalapbVersion ), libraryDependencies ++= Seq( From 00fc4680758ce66904fb0f3213a9dca4ead7e1c7 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 14 Apr 2023 09:33:46 -0700 Subject: [PATCH 155/245] Update exceptions --- examples/helloworld/project/plugins.sbt | 2 +- .../helloworld/GreeterWithDatabase.scala | 8 ++++---- .../helloworld/HelloWorldClientMetadata.scala | 4 ++-- .../examples/helloworld/HelloWorldServer.scala | 4 ++-- .../examples/helloworld/MultipleServices.scala | 4 ++-- examples/routeguide/project/plugins.sbt | 2 +- .../routeguide/RouteGuideClientApp.scala | 6 +++--- .../examples/routeguide/RouteGuideServer.scala | 16 ++++++++-------- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt index e7b733bb1..9cd98af08 100644 --- a/examples/helloworld/project/plugins.sbt +++ b/examples/helloworld/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-rc1" +val zioGrpcVersion = "0.6.0-rc5" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala index fd5a71ed7..6b19f6e2e 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/GreeterWithDatabase.scala @@ -1,6 +1,6 @@ package zio_grpc.examples.helloworld -import io.grpc.Status +import io.grpc.StatusException import scalapb.zio_grpc.Server import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList @@ -14,12 +14,12 @@ import scalapb.zio_grpc.ServerLayer package object userdatabase { trait UserDatabase { - def fetchUser(name: String): IO[Status, User] + def fetchUser(name: String): IO[StatusException, User] } object UserDatabase { val layer = ZLayer.succeed(new UserDatabase { - def fetchUser(name: String): IO[Status, User] = + def fetchUser(name: String): IO[StatusException, User] = ZIO.succeed(User(name)) }) } @@ -28,7 +28,7 @@ package object userdatabase { class GreeterWithDatabase(database: UserDatabase) extends Greeter { def sayHello( request: HelloRequest - ): ZIO[Any, Status, HelloReply] = + ): ZIO[Any, StatusException, HelloReply] = database.fetchUser(request.name).map { user => HelloReply(s"Hello ${user.name}") } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala index fe07604bc..b27bb200a 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldClientMetadata.scala @@ -7,7 +7,7 @@ import io.grpc.{ ManagedChannelBuilder, Metadata, MethodDescriptor, - Status + StatusException } import zio.Console._ import scalapb.zio_grpc.{SafeMetadata, ZClientInterceptor, ZManagedChannel} @@ -38,7 +38,7 @@ object HelloWorldClientMetadata extends zio.ZIOAppDefault { // Option 1: through layer and accessors val clientLayer = GreeterClient.live(channel) - def appLogic1: ZIO[GreeterClient, Status, Unit] = + def appLogic1: ZIO[GreeterClient, StatusException, Unit] = for { // With client accessor r1 <- diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala index b1c2c0706..5605dba52 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/HelloWorldServer.scala @@ -1,6 +1,6 @@ package zio_grpc.examples.helloworld -import io.grpc.Status +import io.grpc.StatusException import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList import zio._ @@ -12,7 +12,7 @@ import io.grpc.examples.helloworld.helloworld.{HelloReply, HelloRequest} object GreeterImpl extends Greeter { def sayHello( request: HelloRequest - ): ZIO[Any, Status, HelloReply] = + ): ZIO[Any, StatusException, HelloReply] = printLine(s"Got request: $request").orDie zipRight ZIO.succeed(HelloReply(s"Hello, ${request.name}")) } diff --git a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala index 311b4c6fd..913a07332 100644 --- a/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala +++ b/examples/helloworld/src/main/scala/zio_grpc/examples/helloworld/MultipleServices.scala @@ -1,6 +1,6 @@ package zio_grpc.examples.helloworld -import io.grpc.Status +import io.grpc.StatusException import io.grpc.protobuf.services.ProtoReflectionService; import scalapb.zio_grpc.Server import scalapb.zio_grpc.ServerMain @@ -16,7 +16,7 @@ import scalapb.zio_grpc.ServerLayer class WelcomerWithDatabase(database: UserDatabase) extends Welcomer { def welcome( request: HelloRequest - ): ZIO[Any, Status, HelloReply] = + ): ZIO[Any, StatusException, HelloReply] = database.fetchUser(request.name).map { user => HelloReply(s"Welcome ${user.name}") } diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt index e7b733bb1..9cd98af08 100644 --- a/examples/routeguide/project/plugins.sbt +++ b/examples/routeguide/project/plugins.sbt @@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3") addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6") -val zioGrpcVersion = "0.6.0-rc1" +val zioGrpcVersion = "0.6.0-rc5" libraryDependencies ++= Seq( "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion, diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala index eb61668e7..0200e94fb 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideClientApp.scala @@ -8,7 +8,7 @@ import zio.Random._ import scalapb.zio_grpc.ZManagedChannel import io.grpc.Channel import zio._ -import io.grpc.Status +import io.grpc.{Status, StatusException} import zio.stream.ZStream import scala.io.Source import zio.Duration._ @@ -25,12 +25,12 @@ object RouteGuideClientApp extends ZIOAppDefault { def getFeature( lat: Int, lng: Int - ): ZIO[RouteGuideClient, Status, Unit] = + ): ZIO[RouteGuideClient, StatusException, Unit] = (for { f <- RouteGuideClient.getFeature(Point(lat, lng)) _ <- printLine(s"""Found feature called "${f.name}".""").orDie } yield ()).catchSome { - case status if status == Status.NOT_FOUND => + case status if status.getStatus() == Status.NOT_FOUND => printLine(s"Feature not found: ${status.toString()}").orDie } // end: getFeature diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index e7fa02e30..d109c7f91 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -1,6 +1,6 @@ package zio_grpc.examples.routeguide -import io.grpc.Status +import io.grpc.{Status, StatusException} import scalapb.zio_grpc.ServerMain import scalapb.zio_grpc.ServiceList import zio.{Ref, ZIO} @@ -25,8 +25,8 @@ class RouteGuideService( * the requested location for the feature. */ // start: getFeature - def getFeature(request: Point): ZIO[Any, Status, Feature] = - ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND) + def getFeature(request: Point): ZIO[Any, StatusException, Feature] = + ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND.asException()) // end: getFeature /** Streams all features contained within the given bounding {@link @@ -36,7 +36,7 @@ class RouteGuideService( * the bounding rectangle for the requested features. */ // start: listFeatures - def listFeatures(request: Rectangle): ZStream[Any, Status, Feature] = { + def listFeatures(request: Rectangle): ZStream[Any, StatusException, Feature] = { val left = request.getLo.longitude min request.getHi.longitude val right = request.getLo.longitude max request.getHi.longitude val top = request.getLo.latitude max request.getHi.latitude @@ -61,8 +61,8 @@ class RouteGuideService( */ // start: recordRoute def recordRoute( - request: zio.stream.Stream[Status, Point] - ): ZIO[Any, Status, RouteSummary] = + request: zio.stream.Stream[StatusException, Point] + ): ZIO[Any, StatusException, RouteSummary] = // Zips each element with the previous element, initially accompanied by None. request.zipWithPrevious .runFold(RouteSummary()) { @@ -86,8 +86,8 @@ class RouteGuideService( // start: routeChat def routeChat( - request: zio.stream.Stream[Status, RouteNote] - ): ZStream[Any, Status, RouteNote] = + request: zio.stream.Stream[StatusException, RouteNote] + ): ZStream[Any, StatusException, RouteNote] = request.flatMap { note => // By using flatMap, we can map each RouteNote we receive to a stream with // the existing RouteNotes for that location, and those sub-streams are going From 374025524f91ec51eca1ceec7310cba0c431a280 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 14 Apr 2023 11:08:36 -0700 Subject: [PATCH 156/245] scalafmt on routeguide example --- .../zio_grpc/examples/routeguide/RouteGuideServer.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala index d109c7f91..2e73c6a55 100644 --- a/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala +++ b/examples/routeguide/src/main/scala/zio_grpc/examples/routeguide/RouteGuideServer.scala @@ -26,7 +26,9 @@ class RouteGuideService( */ // start: getFeature def getFeature(request: Point): ZIO[Any, StatusException, Feature] = - ZIO.fromOption(findFeature(request)).orElseFail(Status.NOT_FOUND.asException()) + ZIO + .fromOption(findFeature(request)) + .orElseFail(Status.NOT_FOUND.asException()) // end: getFeature /** Streams all features contained within the given bounding {@link @@ -36,7 +38,9 @@ class RouteGuideService( * the bounding rectangle for the requested features. */ // start: listFeatures - def listFeatures(request: Rectangle): ZStream[Any, StatusException, Feature] = { + def listFeatures( + request: Rectangle + ): ZStream[Any, StatusException, Feature] = { val left = request.getLo.longitude min request.getHi.longitude val right = request.getLo.longitude max request.getHi.longitude val top = request.getLo.latitude max request.getHi.latitude From b2fa8baac3641cb72e579c2ad5a09c87c933d3ea Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Mon, 17 Apr 2023 22:14:21 +0200 Subject: [PATCH 157/245] Update zio, zio-streams, zio-test, ... to 2.0.13 (#498) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index cdd436dd4..ac7c9c1d0 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.12" + val zio = "2.0.13" val grpc = "1.47.0" } From 31384c8978aa5d2230a3485800aa095b6a3b4bd5 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 25 May 2023 10:52:03 +0200 Subject: [PATCH 158/245] Update sbt to 1.8.3 (#504) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 46e43a97e..72413de15 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.2 +sbt.version=1.8.3 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 46e43a97e..72413de15 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.2 +sbt.version=1.8.3 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 46e43a97e..72413de15 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.2 +sbt.version=1.8.3 diff --git a/project/build.properties b/project/build.properties index 46e43a97e..72413de15 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.2 +sbt.version=1.8.3 From 8b6832fb24b9900e0ac83c944d02b2b9d060efc4 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 25 May 2023 11:01:43 +0200 Subject: [PATCH 159/245] Update sbt-ci-release to 1.5.12 (#503) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index cdec42c79..ebb7a99aa 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -6,7 +6,7 @@ libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.13" addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0") -addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") +addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0") From 77950d598fcec714046716c3c8575a0fa70900b1 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 1 Jun 2023 03:13:59 +0200 Subject: [PATCH 160/245] Update zio, zio-streams, zio-test, ... to 2.0.14 (#505) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index ac7c9c1d0..65b422a8c 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.13" + val zio = "2.0.14" val grpc = "1.47.0" } From 3a986211ed0887caf08192652eb1c6b317021459 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Thu, 1 Jun 2023 03:21:55 +0200 Subject: [PATCH 161/245] Update scala3-library, ... to 3.3.0 (#506) Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 3b662bace..d25f3397c 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ import Settings.stdSettings -val Scala3 = "3.2.2" +val Scala3 = "3.3.0" val Scala213 = "2.13.10" From a941a2b0c4c32a539e5f07979c86ebda801d1144 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 3 Jun 2023 05:12:38 +0200 Subject: [PATCH 162/245] Update sbt to 1.9.0 (#508) --- examples/fullapp/project/build.properties | 2 +- examples/helloworld/project/build.properties | 2 +- examples/routeguide/project/build.properties | 2 +- project/build.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/fullapp/project/build.properties b/examples/fullapp/project/build.properties index 72413de15..40b3b8e7b 100644 --- a/examples/fullapp/project/build.properties +++ b/examples/fullapp/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.3 +sbt.version=1.9.0 diff --git a/examples/helloworld/project/build.properties b/examples/helloworld/project/build.properties index 72413de15..40b3b8e7b 100644 --- a/examples/helloworld/project/build.properties +++ b/examples/helloworld/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.3 +sbt.version=1.9.0 diff --git a/examples/routeguide/project/build.properties b/examples/routeguide/project/build.properties index 72413de15..40b3b8e7b 100644 --- a/examples/routeguide/project/build.properties +++ b/examples/routeguide/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.3 +sbt.version=1.9.0 diff --git a/project/build.properties b/project/build.properties index 72413de15..40b3b8e7b 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.8.3 +sbt.version=1.9.0 From 66a0f0a79d7c99c6c50812d000b55c2e1f8b7ebd Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Wed, 7 Jun 2023 00:20:26 +0200 Subject: [PATCH 163/245] Update zio, zio-streams, zio-test, ... to 2.0.15 (#509) --- project/Versions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Versions.scala b/project/Versions.scala index 65b422a8c..b8d06c8c3 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,4 +1,4 @@ object Version { - val zio = "2.0.14" + val zio = "2.0.15" val grpc = "1.47.0" } From 4c20b9b9fcd7b68201cdbb7654c7b60dddd25d3e Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Fri, 9 Jun 2023 05:54:37 +0200 Subject: [PATCH 164/245] Update scala-library to 2.12.18 (#510) --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index d25f3397c..b9847bf5d 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ val Scala3 = "3.3.0" val Scala213 = "2.13.10" -val Scala212 = "2.12.17" +val Scala212 = "2.12.18" val ScalaVersions = Seq(Scala212, Scala213, Scala3) From 7eb76a133ec7cc9c1860065209f5ff6aeb889f4b Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz Date: Mon, 19 Jun 2023 05:34:11 +0100 Subject: [PATCH 165/245] refactor: channel-based backpressure (#514) refactor: channel-based backpressure Co-authored-by: Regis Kuckaertz --- .../zio_grpc/server/ZServerCallHandler.scala | 61 +++++-------------- 1 file changed, 15 insertions(+), 46 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index 2b70299a5..d11a656ca 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -14,6 +14,9 @@ import zio.stm.TSemaphore import zio.Exit.Failure import zio.Exit.Success import scala.annotation.tailrec +import zio.stream.ZSink +import zio.stream.ZChannel +import scalapb.zio_grpc.GIO class ZServerCallHandler[Req, Res]( runtime: Runtime[Any], @@ -107,56 +110,22 @@ object ZServerCallHandler { call: ZServerCall[Res], stream: ZStream[Any, StatusException, Res] ): ZIO[Any, StatusException, Unit] = { - def takeFromQueue( - queue: Dequeue[Exit[Option[StatusException], Res]] - ): ZIO[Any, StatusException, Unit] = - queue.takeAll.flatMap(takeFromCache(_, queue)) + val backpressureSink = { + def go: ZChannel[Any, ZNothing, Chunk[Res], Any, StatusException, Chunk[Res], Unit] = + ZChannel.readWithCause( + xs => + ZChannel.fromZIO(GIO.attempt(xs.foreach(call.call.sendMessage))) *> + ZChannel.suspend(if (call.call.isReady()) go else ZChannel.fromZIO(call.awaitReady) *> go), + c => ZChannel.failCause(c), + _ => ZChannel.unit + ) - def takeFromCache( - xs: Chunk[Exit[Option[StatusException], Res]], - queue: Dequeue[Exit[Option[StatusException], Res]] - ): ZIO[Any, StatusException, Unit] = - ZIO.suspendSucceed { - @tailrec def innerLoop(loop: Boolean, i: Int): IO[StatusException, Unit] = - if (i < xs.length && loop) { - xs(i) match { - case Failure(cause) => - cause.failureOrCause match { - case Left(Some(status)) => - ZIO.fail(status) - case Left(None) => - ZIO.unit - case Right(cause) => - ZIO.failCause(cause) - } - case Success(value) => - call.call.sendMessage(value) - // the loop iteration may only continue if the call can - // still accept elements and we have more elements to send - innerLoop(call.call.isReady, i + 1) - } - } else if (loop) - // ^ if we reached the end of the chunk but the call can still - // proceed, we pull from the queue and continue - takeFromQueue(queue) - else - // ^ otherwise, we wait for the call to be ready and then start again - call.awaitReady *> takeFromCache(xs.drop(i), queue) - - if (xs.isEmpty) - takeFromQueue(queue) - else - innerLoop(true, 0) - } + ZSink.fromChannel(go) + } for { queueSize <- backpressureQueueSize - _ <- ZIO - .scoped[Any]( - stream - .toQueueOfElements(queueSize) - .flatMap(queue => call.awaitReady *> takeFromQueue(queue)) - ) + _ <- stream.buffer(queueSize).run(backpressureSink) } yield () } } From 64b7ded54892e933f101b742c078f2c840919fc3 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz Date: Mon, 19 Jun 2023 05:34:23 +0100 Subject: [PATCH 166/245] fix: cleanup call fiber on exit (#515) Co-authored-by: Regis Kuckaertz --- .../scalapb/zio_grpc/server/ListenerDriver.scala | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala index 09555a96d..34285df00 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala @@ -18,6 +18,7 @@ object ListenerDriver { def unaryInputListener[Req]( runtime: Runtime[Any], + scope: Scope.Closeable, call: ZServerCall[_], completed: Promise[StatusException, Unit], request: Promise[Nothing, Req], @@ -29,13 +30,10 @@ object ListenerDriver { completed.await *> call.sendHeaders(new Metadata) *> request.await flatMap writeResponse - ).onExit(ex => call.close(ListenerDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore) - .ignore - // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener - // back to grpc-java. If it was just fork, the call to unsafeRun would not return control, so grpc-java - // won't have a listener to call on. The driver awaits on the calls to the listener to pass to the user's - // service. - .forkDaemon + ).onExit(ex => + call.close(ListenerDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore *> scope.close(ex) + ).ignore + .forkIn(scope) .map(fiber => new Listener[Req] { override def onCancel(): Unit = @@ -91,8 +89,10 @@ object ListenerDriver { for { completed <- Promise.make[StatusException, Unit] request <- Promise.make[Nothing, Req] + scope <- Scope.make listener <- unaryInputListener( runtime, + scope, zioCall, completed, request, From 767d1ba95faff20ae85c9c5f51d38eb504cd09c0 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 19 Jun 2023 09:28:57 -0700 Subject: [PATCH 167/245] Remove unused imports --- .../scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala index d11a656ca..ebb3f8a8a 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala @@ -11,9 +11,6 @@ import scalapb.zio_grpc.RequestContext import io.grpc.Metadata import scalapb.zio_grpc.SafeMetadata import zio.stm.TSemaphore -import zio.Exit.Failure -import zio.Exit.Success -import scala.annotation.tailrec import zio.stream.ZSink import zio.stream.ZChannel import scalapb.zio_grpc.GIO From e05fd1ef93901ef2328028b1d25800feb285d685 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 19 Jun 2023 09:40:31 -0700 Subject: [PATCH 168/245] Set versionSchema in build.sbt --- build.sbt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.sbt b/build.sbt index b9847bf5d..aea62e17b 100644 --- a/build.sbt +++ b/build.sbt @@ -10,6 +10,8 @@ val ScalaVersions = Seq(Scala212, Scala213, Scala3) ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots") +ThisBuild / versionScheme := Some("early-semver") + publish / skip := true sonatypeProfileName := "com.thesamet" From 44b1fb1a01a45ac815c222e9381973d0da570b98 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 19 Jun 2023 10:18:09 -0700 Subject: [PATCH 169/245] Update workflows --- .github/workflows/ci.yml | 2 +- .github/workflows/release.yml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 427f1491d..8023195b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: with: java-version: 8 distribution: temurin - + cache: sbt - name: Mount caches uses: actions/cache@v3 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f201c84af..8dbba11c2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + with: + fetch-depth: 0 - uses: actions/setup-node@v3 with: node-version: '16.x' @@ -16,6 +18,7 @@ jobs: with: java-version: 8 distribution: temurin + cache: sbt - name: Update docs run: | git config --global user.name "ZIO-gRPC Docs" From 7e7ea1bf69f346e8e183363db37696c9d54572ed Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 19 Jun 2023 10:41:34 -0700 Subject: [PATCH 170/245] Fix Java 8 compatibility --- .../scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala b/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala index 4478904ab..a7222ce20 100644 --- a/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala +++ b/benchmarks/src/main/scala/scalapb/zio_grpc/ServerStreamingBenchmarkApp.scala @@ -44,7 +44,7 @@ object ServerStreamingBenchmarkApp extends ZIOAppDefault { for { now <- Clock.instant started <- start.get - _ <- ZIO.when(time.Duration.between(started, now).toSeconds() >= 10)( + _ <- ZIO.when(time.Duration.between(started, now).getSeconds() >= 10)( start.set(now) *> cpt.get.flatMap(cpt => Console.printLine(s"Received $cpt messages")) ) } yield () From 482445e5ac3dc24eaa2286dc61f9cf2acf248e58 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 19 Jun 2023 10:56:31 -0700 Subject: [PATCH 171/245] Downgrade sbt to 1.8.3 --- project/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/build.properties b/project/build.properties index 40b3b8e7b..72413de15 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.9.0 +sbt.version=1.8.3 From 20f618a9671a3a1b8499e8fe36f3de19bd871fa8 Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Mon, 19 Jun 2023 14:40:52 -0700 Subject: [PATCH 172/245] Bump scalapb-grpcweb to 0.6.7. Fixes #516 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index aea62e17b..ef337beba 100644 --- a/build.sbt +++ b/build.sbt @@ -62,7 +62,7 @@ lazy val core = projectMatrix _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( libraryDependencies ++= Seq( - "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.6", + "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.7", "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" % "test" ), Compile / npmDependencies += "grpc-web" -> "1.2.1" From 19d28893d3016abfa2216de830ea55d50c46cccb Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Tue, 20 Jun 2023 19:17:14 -0700 Subject: [PATCH 173/245] Bump up grpc-web --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index ef337beba..712394450 100644 --- a/build.sbt +++ b/build.sbt @@ -65,7 +65,7 @@ lazy val core = projectMatrix "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.7", "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" % "test" ), - Compile / npmDependencies += "grpc-web" -> "1.2.1" + Compile / npmDependencies += "grpc-web" -> "1.4.2" ) ) From f932ee9c39ddca40e7675831ff3ace4de18e45c8 Mon Sep 17 00:00:00 2001 From: Scala Steward <43047562+scala-steward@users.noreply.github.com> Date: Sat, 24 Jun 2023 20:37:37 +0200 Subject: [PATCH 174/245] Update sbt-projectmatrix to 0.9.1 (#519) --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index ebb7a99aa..e5e56e751 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -20,4 +20,4 @@ addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.7") -addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.0") +addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1") From 6bbdcccb7838d0fb5c9b41685a6b55e652144bd3 Mon Sep 17 00:00:00 2001 From: Regis Kuckaertz Date: Sun, 25 Jun 2023 14:27:29 +0100 Subject: [PATCH 175/245] fix: wait for termination on shutdown (#522) Co-authored-by: Regis Kuckaertz --- core/src/main/scalajvm/scalapb/zio_grpc/Server.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala index 5bedb859c..8c0fc7a2b 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/Server.scala @@ -34,7 +34,7 @@ private[zio_grpc] class ServerImpl(underlying: io.grpc.Server) extends Server { def shutdownNow: Task[Unit] = ZIO.attempt(underlying.shutdownNow()).unit def toManaged: ZIO[Scope, Throwable, Server] = - start.as(this).withFinalizer(_ => this.shutdown.ignore) + start.as(this).withFinalizer(_ => (this.shutdown *> this.awaitTermination).ignore) } object Server { From a5aaa11f322226cca72cfe57fb0004ed32beb5dc Mon Sep 17 00:00:00 2001 From: Nadav Samet Date: Fri, 23 Jun 2023 18:28:43 -0700 Subject: [PATCH 176/245] Add Scala.js end-to-end tests --- .github/workflows/ci.yml | 19 +++- .gitignore | 1 + build.sbt | 106 ++++++++++++++++-- .../scalapb/zio_grpc/client/ClientCalls.scala | 4 +- .../scalapb/zio_grpc/ServerMain.scala | 2 +- e2e-web/index.html | 25 +++++ .../scalapb/zio-grpc/TestSuiteApp.scala | 22 ++++ .../scalapb/zio_grpc/BrowserSpec.scala | 36 ++++++ .../src/main/protobuf/testservice.proto | 14 ++- .../scalapb/zio_grpc/WrappedString.scala | 13 +++ .../scalapb/zio_grpc/BackpressureSpec.scala | 9 +- .../scalapb/zio_grpc/TestServiceImpl.scala | 8 +- .../scalapb/zio_grpc/TestServiceMain.scala | 6 + .../scalapb/zio_grpc/CommonServiceSpec.scala | 106 ++++++++++++++++++ .../scala/scalapb/zio_grpc/TestUtils.scala | 25 ++++- .../scalapb/zio_grpc/BackpressureSpec.scala | 0 .../zio_grpc/BindableServiceSpec.scala | 4 + .../scalapb/zio_grpc/ClientCallsSpec.scala | 0 .../scalapb/zio_grpc/EnvSpec.scala | 5 + .../scalapb/zio_grpc/ListenerDriverSpec.scala | 0 .../scalapb/zio_grpc/MetadataTests.scala | 6 +- .../scalapb/zio_grpc/ServerSpec.scala | 0 .../scalapb/zio_grpc/TestServiceSpec.scala | 101 ++--------------- playwright.nix | 24 ++++ 24 files changed, 414 insertions(+), 122 deletions(-) create mode 100644 e2e-web/index.html create mode 100644 e2e-web/src/main/scalajs/scalapb/zio-grpc/TestSuiteApp.scala create mode 100644 e2e-web/src/test/scalajvm/scalapb/zio_grpc/BrowserSpec.scala rename e2e/{ => protos}/src/main/protobuf/testservice.proto (68%) create mode 100644 e2e/protos/src/main/scala/scalapb/zio_grpc/WrappedString.scala rename e2e/src/{test/scala => main/scalajvm}/scalapb/zio_grpc/TestServiceImpl.scala (94%) create mode 100644 e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceMain.scala create mode 100644 e2e/src/test/scala/scalapb/zio_grpc/CommonServiceSpec.scala rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/BackpressureSpec.scala (100%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/BindableServiceSpec.scala (90%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/ClientCallsSpec.scala (100%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/EnvSpec.scala (94%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/ListenerDriverSpec.scala (100%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/MetadataTests.scala (96%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/ServerSpec.scala (100%) rename e2e/src/test/{scala => scalajvm}/scalapb/zio_grpc/TestServiceSpec.scala (74%) create mode 100644 playwright.nix diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8023195b3..0e0dbb2f1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ jobs: matrix: scala: [2_12, 2_13, 3] runs-on: ubuntu-latest - + steps: - uses: actions/checkout@v3 @@ -18,6 +18,11 @@ jobs: java-version: 8 distribution: temurin cache: sbt + - name: Set up node.js + uses: actions/setup-node@v3 + with: + node-version: "18.16.1" + - name: Mount caches uses: actions/cache@v3 with: @@ -25,6 +30,7 @@ jobs: ~/.sbt ~/.ivy2/cache ~/.cache/coursier + ~/.cache/ms-playwright key: ${{ runner.os }}-sbt-${{matrix.scala}}-${{ hashFiles('**/*.sbt') }} - name: Formatting @@ -33,13 +39,20 @@ jobs: - name: Compile and test (JVM) run: | - sbt coreJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/it:test + sbt coreJVM${{matrix.scala}}/test e2eJVM${{matrix.scala}}/test + # e2eJVM${{matrix.scala}}/it:test - name: Compile and test (JS) - if: ${{ matrix.scala != 3 }} run: | sbt coreJS${{matrix.scala}}/test + - name: Run grpc-web e2e test + if: ${{ matrix.scala != 3 }} + run: | + docker-compose -f ./examples/fullapp/docker-compose.yaml up -d + sbt e2eWebJS${{matrix.scala}}/fastOptJS/webpack e2eWebJVM${{matrix.scala}}/test + docker-compose -f ./examples/fullapp/docker-compose.yaml down + - name: Examples run: | .github/workflows/test_examples.sh diff --git a/.gitignore b/.gitignore index a8d40b278..885829b50 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.log target .bsp +.sbt .idea .metals .bloop diff --git a/build.sbt b/build.sbt index 712394450..f85d36ae1 100644 --- a/build.sbt +++ b/build.sbt @@ -1,4 +1,5 @@ import Settings.stdSettings +import org.scalajs.linker.interface.ModuleInitializer val Scala3 = "3.3.0" @@ -62,7 +63,7 @@ lazy val core = projectMatrix _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) .settings( libraryDependencies ++= Seq( - "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.6.7", + "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.7.0", "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" % "test" ), Compile / npmDependencies += "grpc-web" -> "1.4.2" @@ -98,18 +99,67 @@ lazy val protocGenZio = protocGenProject("protoc-gen-zio", codeGenJVM212) } ) -lazy val e2e = +lazy val e2eProtos = projectMatrix - .in(file("e2e")) + .in(file("e2e") / "protos") .dependsOn(core) .defaultAxes() .enablePlugins(LocalCodeGenPlugin) + .jvmPlatform( + ScalaVersions, + settings = Seq( + libraryDependencies ++= Seq( + "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion + ) + ) + ) + .jsPlatform( + ScalaVersions, + settings = Seq( + libraryDependencies ++= Seq( + "com.thesamet.scalapb.grpcweb" %%% "scalapb-grpcweb" % "0.7.0", + "io.github.cquiroz" %%% "scala-java-time" % "2.5.0" + ) + ) + ) + .settings(stdSettings) + .settings( + Defaults.itSettings, + crossScalaVersions := Seq(Scala212, Scala213), + publish / skip := true, + Compile / PB.targets := Seq( + scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, + genModule( + "scalapb.zio_grpc.ZioCodeGenerator$" + ) -> (Compile / sourceManaged).value + ), + libraryDependencies ++= Seq( + "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" + ), + codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value + ) + +lazy val e2e = + projectMatrix + .in(file("e2e")) + .dependsOn(core, e2eProtos) + .defaultAxes() .jvmPlatform(ScalaVersions) + .customRow( + true, + ScalaVersions, + Seq(VirtualAxis.js), + _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) + .settings( + scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.CommonJSModule) }, + Compile / npmDependencies += "grpc-web" -> "1.4.2", + scalaJSUseMainModuleInitializer := true + ) + ) .configs(IntegrationTest) .settings(stdSettings) .settings( Defaults.itSettings, - crossScalaVersions := Seq(Scala212, Scala213), publish / skip := true, libraryDependencies ++= Seq( "dev.zio" %% "zio-test" % Version.zio % "test,it", @@ -117,16 +167,50 @@ lazy val e2e = "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion, "io.grpc" % "grpc-netty" % Version.grpc ), - Compile / PB.targets := Seq( - scalapb.gen(grpc = true) -> (Compile / sourceManaged).value, - genModule( - "scalapb.zio_grpc.ZioCodeGenerator$" - ) -> (Compile / sourceManaged).value - ), - codeGenClasspath := (codeGenJVM212 / Compile / fullClasspath).value, + Compile / run / fork := true, testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") ) +lazy val e2eWeb = + projectMatrix + .in(file("e2e-web")) + .dependsOn(e2eProtos, e2e % "compile->test") + .defaultAxes() + .enablePlugins(BuildInfoPlugin) + .jvmPlatform( + scalaVersions = ScalaVersions, + settings = Seq( + libraryDependencies ++= Seq( + "com.microsoft.playwright" % "playwright" % "1.31.0" % Test, + "dev.zio" %%% "zio-test" % Version.zio % Test, + "dev.zio" %% "zio-test-sbt" % Version.zio % Test + ), + buildInfoKeys := Seq( + scalaBinaryVersion + ) + ) + ) + .customRow( + true, + ScalaVersions, + Seq(VirtualAxis.js), + _.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin) + .settings( + scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.CommonJSModule) }, + Compile / npmDependencies += "grpc-web" -> "1.4.2", + scalaJSUseMainModuleInitializer := true, + libraryDependencies ++= Seq( + "dev.zio" %%% "zio-test" % Version.zio + ), + webpack / version := "5.88.0", + startWebpackDevServer / version := "4.15.1" + ) + ) + .settings(stdSettings) + .settings( + publish / skip := true + ) + lazy val benchmarks = projectMatrix .in(file("benchmarks")) diff --git a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala index 1e13998b1..9fd42dd6f 100644 --- a/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala +++ b/core/src/main/scalajs/scalapb/zio_grpc/client/ClientCalls.scala @@ -24,7 +24,7 @@ object ClientCalls { channel.channel.baseUrl + "/" + method.fullName, req, headers.metadata, - method.methodInfo, + method.toGrpcWeb, (errorInfo: ErrorInfo, resp: Res) => if (errorInfo != null) callback(ZIO.fail(new StatusException(Status.fromErrorInfo(errorInfo)))) @@ -45,7 +45,7 @@ object ClientCalls { channel.channel.baseUrl + "/" + method.fullName, req, headers.metadata, - method.methodInfo + method.toGrpcWeb ) .on( "data", diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala index d913ab952..654988b14 100644 --- a/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala +++ b/core/src/main/scalajvm/scalapb/zio_grpc/ServerMain.scala @@ -9,7 +9,7 @@ trait ServerMain extends zio.ZIOAppDefault { def port: Int = 9000 def welcome: ZIO[Any, Throwable, Unit] = - printLine("Server is running. Press Ctrl-C to stop.") + printLine(s"Server is running on port ${port}. Press Ctrl-C to stop.") // Override this to add services. For example // def serviceList = diff --git a/e2e-web/index.html b/e2e-web/index.html new file mode 100644 index 000000000..a50cc5d4d --- /dev/null +++ b/e2e-web/index.html @@ -0,0 +1,25 @@ + + + + ZIO gRPC e2e test suite + + +

+    
+    
+  
+
diff --git a/e2e-web/src/main/scalajs/scalapb/zio-grpc/TestSuiteApp.scala b/e2e-web/src/main/scalajs/scalapb/zio-grpc/TestSuiteApp.scala
new file mode 100644
index 000000000..131025a13
--- /dev/null
+++ b/e2e-web/src/main/scalajs/scalapb/zio-grpc/TestSuiteApp.scala
@@ -0,0 +1,22 @@
+package scalapb.zio_grpc
+
+import scalapb.zio_grpc.testservice.ZioTestservice.TestServiceClient
+import scalapb.zio_grpc.ZManagedChannel
+import scalapb.grpc.Channels
+import zio.test._
+import org.scalajs.dom
+
+object TestSuiteApp extends ZIOSpecDefault with CommonTestServiceSpec {
+  val port = new dom.URL(dom.window.location.href).searchParams.get("port").toInt
+
+  dom.console.log(s"Port is $port")
+
+  def clientLayer =
+    TestServiceClient.live(ZManagedChannel(Channels.grpcwebChannel(s"http://localhost:$port")))
+
+  def spec =
+    suite("TestServiceSpec")(
+      unarySuite,
+      serverStreamingSuite
+    ).provideLayer(clientLayer.orDie)
+}
diff --git a/e2e-web/src/test/scalajvm/scalapb/zio_grpc/BrowserSpec.scala b/e2e-web/src/test/scalajvm/scalapb/zio_grpc/BrowserSpec.scala
new file mode 100644
index 000000000..6bd4e3625
--- /dev/null
+++ b/e2e-web/src/test/scalajvm/scalapb/zio_grpc/BrowserSpec.scala
@@ -0,0 +1,36 @@
+package scalapb.zio_grpc
+
+import io.grpc.ServerBuilder
+import zio.test._
+import com.microsoft.playwright._
+import zio.ZIO
+import zio.ZLayer
+import com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat
+import com.microsoft.playwright.assertions.LocatorAssertions.ContainsTextOptions
+
+object BrowserSpec extends ZIOSpecDefault {
+  val serverLayer: ZLayer[Any, Throwable, Server] =
+    ServerLayer.fromServiceLayer(ServerBuilder.forPort(9000))(server.TestServiceImpl.live)
+
+  val playwright: ZLayer[Any, Throwable, Playwright] =
+    ZLayer.scoped(ZIO.fromAutoCloseable(ZIO.attemptBlocking(Playwright.create())))
+
+  def spec =
+    suite("BrowserSpec")(
+      test("all tests should pass")(
+        for {
+          pw <- ZIO.service[Playwright]
+          _  <- ZIO.attemptBlocking {
+                  val browser  = pw.chromium().launch(new BrowserType.LaunchOptions().setHeadless(true))
+                  val page     = browser.newPage()
+                  val htmlFile = java.nio.file.Paths.get("").toAbsolutePath().toString
+                  page.navigate(
+                    s"file:///${htmlFile}/e2e-web/index.html?port=8080&scalaVersion=${buildinfo.BuildInfo.scalaBinaryVersion}"
+                  )
+                  assertThat(page.getByTestId("log"))
+                    .containsText(". 0 tests failed", new ContainsTextOptions().setTimeout(5000))
+                }
+        } yield assertTrue(true)
+      )
+    ).provideLayer(serverLayer ++ playwright)
+}
diff --git a/e2e/src/main/protobuf/testservice.proto b/e2e/protos/src/main/protobuf/testservice.proto
similarity index 68%
rename from e2e/src/main/protobuf/testservice.proto
rename to e2e/protos/src/main/protobuf/testservice.proto
index 20c023c91..691aeee23 100644
--- a/e2e/src/main/protobuf/testservice.proto
+++ b/e2e/protos/src/main/protobuf/testservice.proto
@@ -2,6 +2,8 @@ syntax = "proto3";
 
 package scalapb.zio_grpc;
 
+import "scalapb/scalapb.proto";
+
 message Request {
     enum Scenario {
         OK = 0;
@@ -18,12 +20,22 @@ message Response {
     string out = 1;
 }
 
+message ResponseTypeMapped {
+    option (scalapb.message).type = "scalapb.zio_grpc.WrappedString";
+
+    string out = 1;
+}
+
 service TestService {
     rpc Unary(Request) returns (Response);
 
+    rpc UnaryTypeMapped(Request) returns (ResponseTypeMapped);
+
     rpc ServerStreaming(Request) returns (stream Response);
 
+    rpc ServerStreamingTypeMapped(Request) returns (stream ResponseTypeMapped);
+
     rpc ClientStreaming(stream Request) returns (Response);
 
     rpc BidiStreaming(stream Request) returns (stream Response);
-}
\ No newline at end of file
+}
diff --git a/e2e/protos/src/main/scala/scalapb/zio_grpc/WrappedString.scala b/e2e/protos/src/main/scala/scalapb/zio_grpc/WrappedString.scala
new file mode 100644
index 000000000..dd38ef167
--- /dev/null
+++ b/e2e/protos/src/main/scala/scalapb/zio_grpc/WrappedString.scala
@@ -0,0 +1,13 @@
+package scalapb.zio_grpc
+
+import scalapb.TypeMapper
+import scalapb.zio_grpc.testservice.ResponseTypeMapped
+
+case class WrappedString(value: String)
+
+object WrappedString {
+  implicit val tm: TypeMapper[scalapb.zio_grpc.testservice.ResponseTypeMapped, WrappedString] =
+    TypeMapper[scalapb.zio_grpc.testservice.ResponseTypeMapped, WrappedString](v => WrappedString(v.out))(v =>
+      ResponseTypeMapped(v.value)
+    )
+}
diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala
index 0d745ac7b..ab46909ef 100644
--- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala
+++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala
@@ -34,12 +34,15 @@ object BackpressureSpec extends ZIOSpecDefault {
         def bidiStreaming(request: zio.stream.Stream[StatusException, Request]): ZStream[Any with Any, StatusException, Response] =
           request.drain ++ responses
 
-        def serverStreaming(request: Request): ZStream[Any with Any, StatusException, Response] =
-          responses
+        def serverStreaming(request: Request): ZStream[Any with Any, StatusException, Response] = responses
+
+        def serverStreamingTypeMapped(request: Request): ZStream[Any with Any, StatusException, WrappedString] = ???
 
         def clientStreaming(request: zio.stream.Stream[StatusException, Request]): ZIO[Any with Any, StatusException, Response] = ???
 
-        def unary(request: Request): ZIO[Any with Any, StatusException, Response] = ???
+        def unary(request: Request): ZIO[Any, StatusException, Response] = ???
+
+        def unaryTypeMapped(request: Request): ZIO[Any, StatusException, WrappedString] = ???
       }
     }
 
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala b/e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceImpl.scala
similarity index 94%
rename from e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala
rename to e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceImpl.scala
index 80b66b996..3f6e85fc0 100644
--- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceImpl.scala
+++ b/e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceImpl.scala
@@ -35,6 +35,9 @@ package object server {
           case _                  => ZIO.fail(Status.UNKNOWN.asException())
         })).onExit(exit.succeed(_))
 
+      def unaryTypeMapped(request: Request): ZIO[Any, StatusException, WrappedString] =
+        unary(request).map(r => WrappedString(r.out))
+
       def serverStreaming(
           request: Request
       ): ZStream[Any, StatusException, Response] =
@@ -69,6 +72,9 @@ package object server {
             }
           }
 
+      def serverStreamingTypeMapped(request: Request): ZStream[Any, StatusException, WrappedString] =
+        serverStreaming(request).map(r => WrappedString(r.out))
+
       def clientStreaming(
           request: Stream[StatusException, Request]
       ): ZIO[Any, StatusException, Response] =
@@ -134,7 +140,7 @@ package object server {
       } yield service
 
     val live: ZLayer[Any, Nothing, TestServiceImpl] =
-      ZLayer(makeFromEnv)
+      ZLayer.scoped(makeFromEnv)
 
     val any: ZLayer[TestServiceImpl, Nothing, TestServiceImpl] = ZLayer.environment
 
diff --git a/e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceMain.scala b/e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceMain.scala
new file mode 100644
index 000000000..2df28647d
--- /dev/null
+++ b/e2e/src/main/scalajvm/scalapb/zio_grpc/TestServiceMain.scala
@@ -0,0 +1,6 @@
+package scalapb.zio_grpc
+
+object TestServiceMain extends scalapb.zio_grpc.ServerMain {
+  def services: ServiceList[Any] =
+    ServiceList.addZIO(server.TestServiceImpl.makeFromEnv)
+}
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/CommonServiceSpec.scala b/e2e/src/test/scala/scalapb/zio_grpc/CommonServiceSpec.scala
new file mode 100644
index 000000000..4aceaccd8
--- /dev/null
+++ b/e2e/src/test/scala/scalapb/zio_grpc/CommonServiceSpec.scala
@@ -0,0 +1,106 @@
+package scalapb.zio_grpc
+
+import zio.test._
+import zio.test.Assertion._
+import TestUtils._
+import scalapb.zio_grpc.testservice.ZioTestservice.TestServiceClient
+import scalapb.zio_grpc.testservice._
+import io.grpc.Status
+
+trait CommonTestServiceSpec {
+  this: ZIOSpecDefault =>
+
+  def unarySuite =
+    suite("unary request (common)")(
+      test("returns successful response") {
+        assertZIO(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)))(
+          equalTo(Response("Res12"))
+        )
+      },
+      test("returns successful response when the program is used repeatedly") {
+        // Must not capture an instance of ZClientCall, so call.start() should not be invoked twice
+        assertZIO(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)).repeatN(1))(
+          equalTo(Response("Res12"))
+        )
+      },
+      test("returns correct error response") {
+        assertZIO(
+          TestServiceClient
+            .unary(Request(Request.Scenario.ERROR_NOW, in = 12))
+            .exit
+        )(
+          fails(hasStatusCode(Status.INTERNAL))
+        )
+      },
+      test("returns response on failures") {
+        assertZIO(
+          TestServiceClient.unary(Request(Request.Scenario.DIE, in = 12)).exit
+        )(
+          fails(hasStatusCode(Status.INTERNAL))
+        )
+      },
+      test("successful type mapped response") {
+        assertZIO(TestServiceClient.unaryTypeMapped(Request(Request.Scenario.OK, in = 15)))(
+          equalTo(WrappedString("Res15"))
+        )
+      }
+    )
+
+  def serverStreamingSuite =
+    suite("server streaming request (common)")(
+      test("returns successful response") {
+        assertZIO(
+          collectWithError(
+            TestServiceClient.serverStreaming(
+              Request(Request.Scenario.OK, in = 12)
+            )
+          )
+        )(equalTo((List(Response("X1"), Response("X2")), None)))
+      },
+      test("returns successful typemapped response") {
+        assertZIO(
+          collectWithError(
+            TestServiceClient.serverStreamingTypeMapped(
+              Request(Request.Scenario.OK, in = 12)
+            )
+          )
+        )(equalTo((List(WrappedString("X1"), WrappedString("X2")), None)))
+      },
+      test("returns correct error response") {
+        assertZIO(
+          collectWithError(
+            TestServiceClient.serverStreaming(
+              Request(Request.Scenario.ERROR_NOW, in = 12)
+            )
+          )
+        )(
+          tuple(isEmpty, isSome(hasStatusCode(Status.INTERNAL)))
+        )
+      },
+      test("returns correct error after two response") {
+        assertZIO(
+          collectWithError(
+            TestServiceClient.serverStreaming(
+              Request(Request.Scenario.ERROR_AFTER, in = 12)
+            )
+          )
+        )(
+          tuple(
+            hasSize(equalTo(2)),
+            isSome(hasStatusCode(Status.INTERNAL))
+          )
+        )
+      },
+      test("returns failure when failure") {
+        assertZIO(
+          collectWithError(
+            TestServiceClient.serverStreaming(
+              Request(Request.Scenario.DIE, in = 12)
+            )
+          )
+        )(
+          tuple(isEmpty, isSome(hasStatusCode(Status.INTERNAL)))
+        )
+      }
+    )
+}
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala b/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala
index b69cdbd86..92a6a429f 100644
--- a/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala
+++ b/e2e/src/test/scala/scalapb/zio_grpc/TestUtils.scala
@@ -1,12 +1,15 @@
 package scalapb.zio_grpc
 
 import zio.test.Assertion._
-import io.grpc.{Metadata, Status, StatusException}
+import io.grpc.{Status, StatusException}
 import io.grpc.Status.Code
+import zio.URIO
+import zio.stream.ZStream
+import zio.test.Assertion
 
 object TestUtils {
   def hasStatusCode(c: Status) =
-    hasField[StatusException, Code]("code", _.getStatus().getCode, equalTo(c.getCode))
+    hasField[StatusException, Code]("code", _.getStatus().getCode(), equalTo(c.getCode()))
 
   def hasDescription(d: String) =
     hasField[StatusException, String](
@@ -15,6 +18,20 @@ object TestUtils {
       equalTo(d)
     )
 
-  def hasTrailerValue[T](key: Metadata.Key[T], value: T) =
-    hasField[StatusException, T]("trailers", e => Status.trailersFromThrowable(e).get(key), equalTo(value))
+  def collectWithError[R, E, A](
+      zs: ZStream[R, E, A]
+  ): URIO[R, (List[A], Option[E])] =
+    zs.either
+      .runFold((List.empty[A], Option.empty[E])) {
+        case ((l, _), Left(e))  => (l, Some(e))
+        case ((l, e), Right(a)) => (a :: l, e)
+      }
+      .map { case (la, oe) => (la.reverse, oe) }
+
+  def tuple[A, B](
+      assertionA: Assertion[A],
+      assertionB: Assertion[B]
+  ): Assertion[(A, B)] =
+    hasField[(A, B), A]("", _._1, assertionA) &&
+      hasField[(A, B), B]("", _._2, assertionB)
 }
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/BackpressureSpec.scala
similarity index 100%
rename from e2e/src/test/scala/scalapb/zio_grpc/BackpressureSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/BackpressureSpec.scala
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/BindableServiceSpec.scala
similarity index 90%
rename from e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/BindableServiceSpec.scala
index 5c4fe2ac7..0fdc3a894 100644
--- a/e2e/src/test/scala/scalapb/zio_grpc/BindableServiceSpec.scala
+++ b/e2e/src/test/scalajvm/scalapb/zio_grpc/BindableServiceSpec.scala
@@ -20,8 +20,12 @@ object BindableServiceSpec extends ZIOSpecDefault {
 
     override def unary(request: Request, context: C): IO[StatusException, Response] = ???
 
+    override def unaryTypeMapped(request: Request, context: C): IO[StatusException, WrappedString] = ???
+
     override def serverStreaming(request: Request, context: C): Stream[StatusException, Response] = ???
 
+    override def serverStreamingTypeMapped(request: Request, context: C): Stream[StatusException, WrappedString] = ???
+
     override def clientStreaming(
         request: Stream[StatusException, Request],
         context: C
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/ClientCallsSpec.scala
similarity index 100%
rename from e2e/src/test/scala/scalapb/zio_grpc/ClientCallsSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/ClientCallsSpec.scala
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/EnvSpec.scala
similarity index 94%
rename from e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/EnvSpec.scala
index 4a92c88d9..6bd33338c 100644
--- a/e2e/src/test/scala/scalapb/zio_grpc/EnvSpec.scala
+++ b/e2e/src/test/scalajvm/scalapb/zio_grpc/EnvSpec.scala
@@ -23,6 +23,8 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests {
         _ <- ZIO.fail(Status.FAILED_PRECONDITION.asException()).when(context.user.name == "Eve")
       } yield Response(context.user.name)
 
+    def unaryTypeMapped(request: Request, context: Context): IO[StatusException, WrappedString] = ???
+
     def serverStreaming(
         request: Request,
         context: Context
@@ -40,6 +42,9 @@ object EnvSpec extends ZIOSpecDefault with MetadataTests {
           Response(context.user.name)
         )
 
+    def serverStreamingTypeMapped(request: Request, context: Context): ZStream[Any, StatusException, WrappedString] =
+      ???
+
     def clientStreaming(
         request: ZStream[Any, StatusException, Request],
         context: Context
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/ListenerDriverSpec.scala
similarity index 100%
rename from e2e/src/test/scala/scalapb/zio_grpc/ListenerDriverSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/ListenerDriverSpec.scala
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/MetadataTests.scala
similarity index 96%
rename from e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/MetadataTests.scala
index aedcae25a..b50591cb1 100644
--- a/e2e/src/test/scala/scalapb/zio_grpc/MetadataTests.scala
+++ b/e2e/src/test/scalajvm/scalapb/zio_grpc/MetadataTests.scala
@@ -2,10 +2,9 @@ package scalapb.zio_grpc
 
 import zio.test.{test, _}
 import zio.test.Assertion._
-import zio.test.TestAspect.nonFlaky
 import zio.stream.ZStream
 import io.grpc.Metadata
-import io.grpc.Status
+import io.grpc.{Status, StatusException}
 import TestUtils._
 import scalapb.zio_grpc.testservice._
 import scalapb.zio_grpc.testservice.ZioTestservice._
@@ -18,6 +17,9 @@ trait MetadataTests {
 
   def clientMetadataLayer: ZLayer[Server, Nothing, TestServiceClientWithResponseMetadata]
 
+  def hasTrailerValue[T](key: Metadata.Key[T], value: T) =
+    hasField[StatusException, T]("trailers", e => Status.trailersFromThrowable(e).get(key), equalTo(value))
+
   val RequestIdKey =
     Metadata.Key.of("request-id", io.grpc.Metadata.ASCII_STRING_MARSHALLER)
 
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/ServerSpec.scala
similarity index 100%
rename from e2e/src/test/scala/scalapb/zio_grpc/ServerSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/ServerSpec.scala
diff --git a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/TestServiceSpec.scala
similarity index 74%
rename from e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala
rename to e2e/src/test/scalajvm/scalapb/zio_grpc/TestServiceSpec.scala
index df0465bdc..b504796e0 100644
--- a/e2e/src/test/scala/scalapb/zio_grpc/TestServiceSpec.scala
+++ b/e2e/src/test/scalajvm/scalapb/zio_grpc/TestServiceSpec.scala
@@ -1,18 +1,18 @@
 package scalapb.zio_grpc
 
 import io.grpc.{ManagedChannelBuilder, ServerBuilder, Status, StatusException}
-import scalapb.zio_grpc.TestUtils._
 import scalapb.zio_grpc.server.TestServiceImpl
 import scalapb.zio_grpc.testservice.Request.Scenario
 import scalapb.zio_grpc.testservice.ZioTestservice.TestServiceClient
 import scalapb.zio_grpc.testservice._
-import zio.{durationInt, Fiber, Queue, URIO, ZIO, ZLayer}
+import zio.{durationInt, Fiber, Queue, ZIO, ZLayer}
 import zio.stream.{Stream, ZStream}
 import zio.test.Assertion._
 import zio.test.TestAspect.{flaky, timeout, withLiveClock}
 import zio.test._
+import TestUtils._
 
-object TestServiceSpec extends ZIOSpecDefault {
+object TestServiceSpec extends ZIOSpecDefault with CommonTestServiceSpec {
   val serverLayer: ZLayer[TestServiceImpl, Throwable, Server] =
     ServerLayer.fromEnvironment[TestServiceImpl.Service](ServerBuilder.forPort(0))
 
@@ -26,28 +26,8 @@ object TestServiceSpec extends ZIOSpecDefault {
       } yield client
     }
 
-  def unarySuite =
+  def unarySuiteJVM =
     suite("unary request")(
-      test("returns successful response") {
-        assertZIO(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)))(
-          equalTo(Response("Res12"))
-        )
-      },
-      test("returns successful response when the program is used repeatedly") {
-        // Must not capture an instance of ZClientCall, so call.start() should not be invoked twice
-        assertZIO(TestServiceClient.unary(Request(Request.Scenario.OK, in = 12)).repeatN(1))(
-          equalTo(Response("Res12"))
-        )
-      },
-      test("returns correct error response") {
-        assertZIO(
-          TestServiceClient
-            .unary(Request(Request.Scenario.ERROR_NOW, in = 12))
-            .exit
-        )(
-          fails(hasStatusCode(Status.INTERNAL))
-        )
-      },
       test("catches client interrupts") {
         for {
           fiber <- TestServiceClient
@@ -58,13 +38,6 @@ object TestServiceSpec extends ZIOSpecDefault {
           exit  <- TestServiceImpl.awaitExit
         } yield assert(exit.isInterrupted)(isTrue)
       },
-      test("returns response on failures") {
-        assertZIO(
-          TestServiceClient.unary(Request(Request.Scenario.DIE, in = 12)).exit
-        )(
-          fails(hasStatusCode(Status.INTERNAL))
-        )
-      },
       test("setting deadline interrupts the servers") {
         // If the timeout is too short, gRPC may not make the call or send messages. While the
         // timeout below is set to 1s, it can still get missed on CI.
@@ -78,59 +51,8 @@ object TestServiceSpec extends ZIOSpecDefault {
       } @@ flaky(100) @@ withLiveClock
     )
 
-  def collectWithError[R, E, A](
-      zs: ZStream[R, E, A]
-  ): URIO[R, (List[A], Option[E])] =
-    zs.either
-      .runFold((List.empty[A], Option.empty[E])) {
-        case ((l, _), Left(e))  => (l, Some(e))
-        case ((l, e), Right(a)) => (a :: l, e)
-      }
-      .map { case (la, oe) => (la.reverse, oe) }
-
-  def tuple[A, B](
-      assertionA: Assertion[A],
-      assertionB: Assertion[B]
-  ): Assertion[(A, B)] =
-    hasField[(A, B), A]("", _._1, assertionA) &&
-      hasField[(A, B), B]("", _._2, assertionB)
-
-  def serverStreamingSuite =
+  def serverStreamingSuiteJVM =
     suite("server streaming request")(
-      test("returns successful response") {
-        assertZIO(
-          collectWithError(
-            TestServiceClient.serverStreaming(
-              Request(Request.Scenario.OK, in = 12)
-            )
-          )
-        )(equalTo((List(Response("X1"), Response("X2")), None)))
-      },
-      test("returns correct error response") {
-        assertZIO(
-          collectWithError(
-            TestServiceClient.serverStreaming(
-              Request(Request.Scenario.ERROR_NOW, in = 12)
-            )
-          )
-        )(
-          tuple(isEmpty, isSome(hasStatusCode(Status.INTERNAL)))
-        )
-      },
-      test("returns correct error after two response") {
-        assertZIO(
-          collectWithError(
-            TestServiceClient.serverStreaming(
-              Request(Request.Scenario.ERROR_AFTER, in = 12)
-            )
-          )
-        )(
-          tuple(
-            hasSize(equalTo(2)),
-            isSome(hasStatusCode(Status.INTERNAL))
-          )
-        )
-      },
       test("catches client cancellations") {
         assertZIO(for {
           fb   <- TestServiceClient
@@ -143,17 +65,6 @@ object TestServiceSpec extends ZIOSpecDefault {
           _    <- fb.interrupt
           exit <- TestServiceImpl.awaitExit
         } yield exit)(fails(hasStatusCode(Status.CANCELLED)))
-      },
-      test("returns failure when failure") {
-        assertZIO(
-          collectWithError(
-            TestServiceClient.serverStreaming(
-              Request(Request.Scenario.DIE, in = 12)
-            )
-          )
-        )(
-          tuple(isEmpty, isSome(hasStatusCode(Status.INTERNAL)))
-        )
       }
     )
 
@@ -334,7 +245,9 @@ object TestServiceSpec extends ZIOSpecDefault {
   def spec =
     suite("TestServiceSpec")(
       unarySuite,
+      unarySuiteJVM,
       serverStreamingSuite,
+      serverStreamingSuiteJVM,
       clientStreamingSuite,
       bidiStreamingSuite
     ).provideLayer(layers.orDie)
diff --git a/playwright.nix b/playwright.nix
new file mode 100644
index 000000000..87612f71c
--- /dev/null
+++ b/playwright.nix
@@ -0,0 +1,24 @@
+{pkgs ? import  {
+  config = {
+    packageOverrides = pkgs: {
+      sbt = pkgs.sbt.override { jre = pkgs.openjdk11; };
+    };
+  };
+}} :
+(pkgs.buildFHSUserEnv {
+  name = "zio-grpc";
+  targetPkgs = pkgs: [
+    pkgs.sbt
+    pkgs.openjdk11
+    pkgs.nodejs
+    pkgs.yarn
+    pkgs.playwright
+
+    # keep this line if you use bash
+    pkgs.bashInteractive
+  ];
+
+  runScript = "bash";
+
+  profile = "export PLAYWRIGHT_BROWSERS_PATH=${pkgs.playwright-driver.browsers}";
+}).env

From e2c5fbd69a95505de1b42549c3a4c01a2b52907e Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Fri, 30 Jun 2023 02:48:14 +0200
Subject: [PATCH 177/245] Update playwright to 1.35.1 (#523)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index f85d36ae1..f3b722af0 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.31.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.35.1"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From d11d4c3b70e912ff23a5b8d2dfb7f3f900bbedda Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Fri, 30 Jun 2023 03:00:20 +0200
Subject: [PATCH 178/245] Update sbt to 1.9.1 (#524)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/build.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/build.properties b/project/build.properties
index 72413de15..3c0b78a7c 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=1.8.3
+sbt.version=1.9.1

From dbe4dfcd96dacd24163810656f6b1ae3ae818278 Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Sun, 9 Jul 2023 18:49:22 -0700
Subject: [PATCH 179/245] Add tests and docs for mapping error type (#527)

Add ability to map errors

Fixes #500
---
 CHANGELOG.md                                  |  10 +-
 .../scalapb/zio_grpc/ZioCodeGenerator.scala   | 110 +++++++++--------
 .../main/scala/scalapb/zio_grpc/CanBind.scala |   4 +-
 .../zio_grpc/GenericGeneratedService.scala    |  41 +++++++
 .../scalapb/zio_grpc/ZBindableService.scala   |  17 +--
 .../scalapb/zio_grpc/ZGeneratedService.scala  |  33 ------
 .../main/scala/scalapb/zio_grpc/package.scala |   2 +
 .../scala/scalapb/zio_grpc/transforms.scala   | 112 +++++++++++-------
 docs/generated-code.md                        |  10 +-
 .../scalapb/zio_grpc/BackpressureSpec.scala   |   8 +-
 .../scalapb/zio_grpc/MapErrorSpec.scala       |  80 +++++++++++++
 shell.nix                                     |   1 -
 12 files changed, 285 insertions(+), 143 deletions(-)
 create mode 100644 core/src/main/scala/scalapb/zio_grpc/GenericGeneratedService.scala
 delete mode 100644 core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala
 create mode 100644 e2e/src/test/scalajvm/scalapb/zio_grpc/MapErrorSpec.scala

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d9822d732..289e36a3f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,14 +8,16 @@
   `ZIO_GRPC_BACKPRESSURE_QUEUE_SIZE` environment variable or
   `zio_grpc.backpressure_queue_size` system property (previously the names
   were hyphenated). Change was made for compatibility with ZIO Config.
-* Removed the `R` type parameter for generated services. Generated services now have a single
-  type parameter for context. This simplifies the previous APIs and encourages the ZIO 2
+* GeneratedServices no longer have a `R` type parameter for generated services. This simplifies the previous APIs and encourages the ZIO 2
   style that service dependencies are passed via constructors (see [service pattern](https://zio.dev/reference/service-pattern/))
+* Added `E` type parameter that represents the error type.
 * Context is now received as a second parameter for each handler. For
   convenience, there is a trait that only takes one parameter (the request
   type).
-* Simplified ZTransform. Introduce Transform for effectful transformations for
-  services that do not have context.
+* Introduce Transform for effectful transformations for services that do not have context.
+* Introduce GTransform for effectful transformations over both context and error type.
+* `ZTransform[ContextIn, ContextOut]` is now a type alias to GTransform that
+  fixes the error channel to StatusException.
 * Classes and methods with suffix ClientWithMetadata have been renamed to ClientWithResponseMetadata.
 * Removed the `R` type parameter in most APIs.
 * ManagedServer renamed to ScopedServer.
diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
index f9f8b156a..1b240d57e 100644
--- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
+++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
@@ -68,7 +68,7 @@ class ZioFilePrinter(
   val ZClientCall         = "scalapb.zio_grpc.client.ZClientCall"
   val ZManagedChannel     = "scalapb.zio_grpc.ZManagedChannel"
   val ZChannel            = "scalapb.zio_grpc.ZChannel"
-  val ZTransform          = "scalapb.zio_grpc.ZTransform"
+  val GTransform          = "scalapb.zio_grpc.GTransform"
   val Transform           = "scalapb.zio_grpc.Transform"
   val Nanos               = "java.util.concurrent.TimeUnit.NANOSECONDS"
   val serverServiceDef    = "_root_.io.grpc.ServerServiceDefinition"
@@ -101,45 +101,47 @@ class ZioFilePrinter(
   class ServicePrinter(service: ServiceDescriptor) {
 
     private val traitName  = OuterObject / service.name
-    private val ztraitName = OuterObject / ("Z" + service.name)
+    private val gtraitName = OuterObject / ("G" + service.name)
 
     private val clientServiceName                      = OuterObject / (service.name + "Client")
     private val clientWithResponseMetadataServiceName  = OuterObject / (service.name + "ClientWithResponseMetadata")
     private val accessorsClassName                     = OuterObject / (service.name + "Accessors")
     private val accessorsWithResponseMetadataClassName = OuterObject / (service.name + "WithResponseMetadataAccessors")
 
-    def methodInType(method: MethodDescriptor): String = {
+    def methodInType(method: MethodDescriptor, errorType: String): String = {
       val scalaInType = method.inputType.scalaType
 
       method.streamType match {
         case StreamType.Unary           =>
           scalaInType
         case StreamType.ClientStreaming =>
-          stream(scalaInType, "Any")
+          stream(scalaInType, errorType, "Any")
         case StreamType.ServerStreaming =>
           scalaInType
         case StreamType.Bidirectional   =>
-          stream(scalaInType, "Any")
+          stream(scalaInType, errorType, "Any")
       }
     }
 
     def methodSignature(
         method: MethodDescriptor,
-        contextType: Option[String]
+        contextType: Option[String],
+        errorType: Option[String]
     ): String = {
-      val reqType      = methodInType(method)
       val scalaOutType = method.outputType.scalaType
       val contextParam = contextType.fold("")(ctx => s""", context: $ctx""")
+      val errorParam   = errorType.getOrElse("Error")
+      val reqType      = methodInType(method, StatusException)
 
       s"def ${method.name}" + (method.streamType match {
         case StreamType.Unary           =>
-          s"(request: $reqType$contextParam): ${io(scalaOutType, "Any")}"
+          s"(request: $reqType$contextParam): ${io(scalaOutType, errorParam, "Any")}"
         case StreamType.ClientStreaming =>
-          s"(request: $reqType$contextParam): ${io(scalaOutType, "Any")}"
+          s"(request: $reqType$contextParam): ${io(scalaOutType, errorParam, "Any")}"
         case StreamType.ServerStreaming =>
-          s"(request: $reqType$contextParam): ${stream(scalaOutType, "Any")}"
+          s"(request: $reqType$contextParam): ${stream(scalaOutType, errorParam, "Any")}"
         case StreamType.Bidirectional   =>
-          s"(request: $reqType$contextParam): ${stream(scalaOutType, "Any")}"
+          s"(request: $reqType$contextParam): ${stream(scalaOutType, errorParam, "Any")}"
       })
     }
 
@@ -160,18 +162,18 @@ class ZioFilePrinter(
         method: MethodDescriptor,
         contextType: String
     ): String = {
-      val reqType      = methodInType(method)
+      val reqType      = methodInType(method, StatusException)
       val scalaOutType = method.outputType.scalaType
 
       s"def ${method.name}" + (method.streamType match {
         case StreamType.Unary           =>
-          s"(request: $reqType): ${io(scalaOutType, contextType)}"
+          s"(request: $reqType): ${io(scalaOutType, StatusException, contextType)}"
         case StreamType.ClientStreaming =>
-          s"(request: $reqType): ${io(scalaOutType, contextType)}"
+          s"(request: $reqType): ${io(scalaOutType, StatusException, contextType)}"
         case StreamType.ServerStreaming =>
-          s"(request: $reqType): ${stream(scalaOutType, contextType)}"
+          s"(request: $reqType): ${stream(scalaOutType, StatusException, contextType)}"
         case StreamType.Bidirectional   =>
-          s"(request: $reqType): ${stream(scalaOutType, contextType)}"
+          s"(request: $reqType): ${stream(scalaOutType, StatusException, contextType)}"
       })
     }
 
@@ -179,25 +181,26 @@ class ZioFilePrinter(
         method: MethodDescriptor,
         envOutType: String
     ): String = {
-      val reqType       = methodInType(method)
+      val reqType       = methodInType(method, StatusException)
       val scalaOutType  = method.outputType.scalaType
       val ioOutType     = s"scalapb.zio_grpc.ResponseContext[$scalaOutType]"
       val streamOutType = s"scalapb.zio_grpc.ResponseFrame[$scalaOutType]"
 
       s"def ${method.name}" + (method.streamType match {
         case StreamType.Unary           =>
-          s"(request: $reqType): ${io(ioOutType, envOutType)}"
+          s"(request: $reqType): ${io(ioOutType, StatusException, envOutType)}"
         case StreamType.ClientStreaming =>
-          s"(request: $reqType): ${io(ioOutType, envOutType)}"
+          s"(request: $reqType): ${io(ioOutType, StatusException, envOutType)}"
         case StreamType.ServerStreaming =>
-          s"(request: $reqType): ${stream(streamOutType, envOutType)}"
+          s"(request: $reqType): ${stream(streamOutType, StatusException, envOutType)}"
         case StreamType.Bidirectional   =>
-          s"(request: $reqType): ${stream(streamOutType, envOutType)}"
+          s"(request: $reqType): ${stream(streamOutType, StatusException, envOutType)}"
       })
     }
 
     def printMethodSignature(
-        contextType: Option[String]
+        contextType: Option[String],
+        errorType: Option[String]
     )(
         fp: FunctionalPrinter,
         method: MethodDescriptor
@@ -205,7 +208,8 @@ class ZioFilePrinter(
       fp.add(
         methodSignature(
           method,
-          contextType
+          contextType,
+          errorType
         )
       )
 
@@ -234,7 +238,8 @@ class ZioFilePrinter(
       fp.add(
         methodSignature(
           method,
-          contextType = Some("Context1")
+          contextType = Some("Context1"),
+          errorType = Some("Error1")
         ) + " = " + newImpl
       )
     }
@@ -285,9 +290,9 @@ class ZioFilePrinter(
       )
     }
 
-    def printZTransformMethod(fp: FunctionalPrinter): FunctionalPrinter =
+    def printGTransformMethod(fp: FunctionalPrinter): FunctionalPrinter =
       fp.add(
-        s"def transform[Context1](f: $ZTransform[Context, Context1]): ${ztraitName.fullName}[Context1] = new ${ztraitName.fullName}[Context1] {"
+        s"def transform[Context1, Error1](f: $GTransform[Context, Error, Context1, Error1]): ${gtraitName.fullName}[Context1, Error1] = new ${gtraitName.fullName}[Context1, Error1] {"
       ).indented(
         _.print(service.getMethods().asScala.toVector)(
           printServerTransform
@@ -330,39 +335,51 @@ class ZioFilePrinter(
 
     def print(fp: FunctionalPrinter): FunctionalPrinter =
       fp.add(
-        s"trait ${ztraitName.name}[-Context] extends scalapb.zio_grpc.ZGeneratedService[Context, ${ztraitName.name}] {"
+        s"trait ${gtraitName.name}[-Context, +Error] extends scalapb.zio_grpc.GenericGeneratedService[Context, Error, ${gtraitName.name}] {"
       ).indented(
         _.add("self =>")
           .print(service.getMethods().asScala.toVector)(
             printMethodSignature(
-              contextType = Some("Context")
+              contextType = Some("Context"),
+              errorType = Some("Error")
             )
           )
           .add("")
-          .call(printZTransformMethod)
+          .call(printGTransformMethod)
       ).add("}")
+        .add("")
+        .add(
+          s"type Z${traitName.name}[Context] = ${gtraitName.name}[Context, $StatusException]",
+          s"type RC${traitName.name} = ${gtraitName.name}[$RequestContext, $StatusException]"
+        )
         .add("")
         .add(
           s"trait ${traitName.name} extends scalapb.zio_grpc.GeneratedService {"
         )
         .indented(
           _.add("self =>")
-            .add(s"type WithContext[-C] = ${ztraitName.name}[C]")
+            .add(s"type Generic[-C, +E] = ${gtraitName.name}[C, E]")
             .print(service.getMethods().asScala.toVector)(
-              printMethodSignature(contextType = None)
+              printMethodSignature(contextType = None, errorType = Some(StatusException))
             )
             .add("")
-            .add(s"override def withContext: ${ztraitName.name}[Any] = new ${ztraitName.name}[Any] {")
+            .add(
+              s"override def asGeneric: ${gtraitName.name}[Any, $StatusException] = new ${gtraitName.name}[Any, $StatusException] {"
+            )
             .indented(
               _.print(service.getMethods().asScala.toVector) { (fp, method) =>
                 (
-                  fp.add(s"${methodSignature(method, contextType = Some("Any"))} = self.${method.name}(request)")
+                  fp.add(
+                    s"${methodSignature(method, contextType = Some("Any"), errorType = Some(StatusException))} = self.${method.name}(request)"
+                  )
                 )
               }
             )
             .add("}")
-            .add(s"def transform(z: $Transform): ${ztraitName.name}[Any] = withContext.transform(z)")
-            .add(s"def transform[C](z: $ZTransform[Any, C]): ${ztraitName.name}[C] = withContext.transform(z)")
+            .add(s"def transform(z: $Transform): ${gtraitName.name}[Any, $StatusException] = asGeneric.transform(z)")
+            .add(
+              s"def transform[C, E](z: $GTransform[Any, $StatusException, C, E]): ${gtraitName.name}[C, E] = asGeneric.transform(z)"
+            )
         )
         .add("}")
         .add("")
@@ -373,24 +390,21 @@ class ZioFilePrinter(
           )
             .indented(
               _.add(
-                s"""def bind(serviceImpl: ${traitName.fullName}): zio.UIO[$serverServiceDef] = ${ztraitName.fullName}.genericBindable.bind(serviceImpl.withContext)"""
+                s"""def bind(serviceImpl: ${traitName.fullName}): zio.UIO[$serverServiceDef] = ${gtraitName.fullName}.genericBindable.bind(serviceImpl.asGeneric)"""
               )
             )
             .add("}")
         )
         .add("}")
-        .add(
-          s"type RC${traitName.name} = ${ztraitName.name}[$RequestContext]"
-        )
         .add("")
-        .add(s"object ${ztraitName.name} {")
+        .add(s"object ${gtraitName.name} {")
         .indented(
           _.add(
-            s"implicit val genericBindable: scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}[$RequestContext]] = new scalapb.zio_grpc.GenericBindable[${ztraitName.fullName}[$RequestContext]] {"
+            s"implicit val genericBindable: scalapb.zio_grpc.GenericBindable[${gtraitName.fullName}[$RequestContext, $StatusException]] = new scalapb.zio_grpc.GenericBindable[${gtraitName.fullName}[$RequestContext, $StatusException]] {"
           )
             .indented(
               _.add(
-                s"""def bind(serviceImpl: ${ztraitName.fullName}[$RequestContext]): zio.UIO[$serverServiceDef] ="""
+                s"""def bind(serviceImpl: ${gtraitName.fullName}[$RequestContext, $StatusException]): zio.UIO[$serverServiceDef] ="""
               ).indent
                 .add("zio.ZIO.runtime[Any].map {")
                 .indent
@@ -671,15 +685,15 @@ class ZioFilePrinter(
     }
   }
 
-  def stream(res: String, envType: String) =
+  def stream(res: String, errType: String, envType: String) =
     envType match {
-      case "Any" => s"_root_.zio.stream.Stream[$StatusException, $res]"
-      case r     => s"_root_.zio.stream.ZStream[$r, $StatusException, $res]"
+      case "Any" => s"_root_.zio.stream.Stream[$errType, $res]"
+      case r     => s"_root_.zio.stream.ZStream[$r, $errType, $res]"
     }
 
-  def io(res: String, envType: String) =
+  def io(res: String, errType: String, envType: String) =
     envType match {
-      case "Any" => s"_root_.zio.IO[$StatusException, $res]"
-      case r     => s"_root_.zio.ZIO[$r, $StatusException, $res]"
+      case "Any" => s"_root_.zio.IO[$errType, $res]"
+      case r     => s"_root_.zio.ZIO[$r, $errType, $res]"
     }
 }
diff --git a/core/src/main/scala/scalapb/zio_grpc/CanBind.scala b/core/src/main/scala/scalapb/zio_grpc/CanBind.scala
index 53453eaf0..df742a390 100644
--- a/core/src/main/scala/scalapb/zio_grpc/CanBind.scala
+++ b/core/src/main/scala/scalapb/zio_grpc/CanBind.scala
@@ -8,10 +8,10 @@ trait CanBind[C] {
 }
 
 trait CanBindLowPriority {
-  implicit val canBindRC: CanBind[RequestContext] = identity
+  implicit val canBindRC: CanBind[RequestContext] = identity(_)
   implicit val canBindMD: CanBind[SafeMetadata]   = t => t.metadata
 }
 
 object CanBind extends CanBindLowPriority {
-  implicit val canBindAny: CanBind[Any] = identity
+  implicit val canBindAny: CanBind[Any] = identity(_)
 }
diff --git a/core/src/main/scala/scalapb/zio_grpc/GenericGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/GenericGeneratedService.scala
new file mode 100644
index 000000000..e9b9d0a62
--- /dev/null
+++ b/core/src/main/scala/scalapb/zio_grpc/GenericGeneratedService.scala
@@ -0,0 +1,41 @@
+package scalapb.zio_grpc
+
+import zio.UIO
+import zio.IO
+import io.grpc.{ServerServiceDefinition, StatusException}
+
+trait GenericGeneratedService[-C, +E, S[-_, +_]] {
+  this: S[C, E] =>
+
+  def transform[COut, ErrOut](zt: GTransform[C, E, COut, ErrOut]): S[COut, ErrOut]
+
+  def transform(t: Transform)(implicit ev: E <:< StatusException): S[C, StatusException] =
+    transform[C, StatusException](GTransform.mapError(ev(_)).andThen(t.toGTransform[C]))
+
+  def transformContextZIO[ContextOut, E2 >: E](f: ContextOut => IO[E2, C]): S[ContextOut, E2] = transform(
+    GTransform(f)
+  )
+
+  def transformContext[ContextOut](f: ContextOut => C): S[ContextOut, E] =
+    transformContextZIO(c => zio.ZIO.succeed(f(c)))
+
+  // Transform the error type of the service by applying the given function.
+  def mapError[E1](f: E => E1): S[C, E1] = transform(GTransform.mapError[C, E, E1](f))
+
+  // Effectfully transforms the error type of the service by applying the given function.
+  def mapErrorZIO[E1](f: E => UIO[E1]): S[C, E1] = transform(GTransform.mapErrorZIO[C, E, E1](f))
+}
+
+trait GeneratedService {
+  type Generic[-_, +_]
+
+  def asGeneric: Generic[Any, StatusException]
+
+  def transform(t: Transform): Generic[Any, StatusException]
+
+  def transform[C, E](zt: GTransform[Any, StatusException, C, E]): Generic[C, E]
+}
+
+trait GenericBindable[-S] {
+  def bind(s: S): UIO[ServerServiceDefinition]
+}
diff --git a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala
index c0bcc9f1e..be9a6642c 100644
--- a/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala
+++ b/core/src/main/scala/scalapb/zio_grpc/ZBindableService.scala
@@ -1,6 +1,7 @@
 package scalapb.zio_grpc
 
 import io.grpc.ServerServiceDefinition
+import io.grpc.StatusException
 import zio.UIO
 import zio.Tag
 import scala.annotation.implicitNotFound
@@ -8,12 +9,12 @@ import scala.annotation.implicitNotFound
 /** Provides a way to bind a ZIO gRPC service implementations to a server. */
 @implicitNotFound("""Could not find an implicit ZBindableService[${S}].
 
-Typically, ${S} should extend ZGeneratedService[C] for some type C which
-represents the context provided for each request.
+Typically, ${S} should extend GenericGeneratedService[C, E] for some type C which
+represents the context provided for each request, and type E which represents an error.
 
 When a ZBindableService could not be found, it is most likely that the context type
- is not Any, SafeMetadata, or RequestContext, or some other type T which has an implicit
-  instance of CanBind[T] available.
+ is not Any, SafeMetadata, or RequestContext, or some other type C which has an implicit
+  instance of CanBind[C] available.
 """)
 trait ZBindableService[S] {
 
@@ -30,10 +31,10 @@ object ZBindableService {
   )(implicit bs: ZBindableService[S]): UIO[ServerServiceDefinition] =
     bs.bindService(serviceImpl)
 
-  implicit def fromZGeneratedService[C, S[-_], T](implicit
-      ev1: T <:< ZGeneratedService[C, S],
-      ev2: T <:< S[C],
-      ev3: GenericBindable[S[RequestContext]],
+  implicit def fromGenericGeneratedService[C, S[-_, +_], T](implicit
+      ev1: T <:< GenericGeneratedService[C, StatusException, S],
+      ev2: T <:< S[C, StatusException],
+      ev3: GenericBindable[S[RequestContext, StatusException]],
       ev4: CanBind[C],
       ev6: Tag[C]
   ): ZBindableService[T] =
diff --git a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala b/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala
deleted file mode 100644
index 59d543295..000000000
--- a/core/src/main/scala/scalapb/zio_grpc/ZGeneratedService.scala
+++ /dev/null
@@ -1,33 +0,0 @@
-package scalapb.zio_grpc
-
-import zio.UIO
-import zio.IO
-import io.grpc.{ServerServiceDefinition, StatusException}
-
-trait ZGeneratedService[-C, S[-_]] {
-  this: S[C] =>
-
-  def transform[COut](zt: ZTransform[C, COut]): S[COut]
-
-  def transform(t: Transform): S[C] = transform[C](t.toZTransform[C])
-
-  def transformContextZIO[ContextOut](f: ContextOut => IO[StatusException, C]): S[ContextOut] = transform(
-    ZTransform(f)
-  )
-
-  def transformContext[ContextOut](f: ContextOut => C): S[ContextOut] = transformContextZIO(c => zio.ZIO.succeed(f(c)))
-}
-
-trait GeneratedService {
-  type WithContext[-_]
-
-  def withContext: WithContext[Any]
-
-  def transform(t: Transform): WithContext[Any]
-
-  def transform[C](zt: ZTransform[Any, C]): WithContext[C]
-}
-
-trait GenericBindable[-S] {
-  def bind(s: S): UIO[ServerServiceDefinition]
-}
diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala
index ba7fc1820..d413c2e21 100644
--- a/core/src/main/scala/scalapb/zio_grpc/package.scala
+++ b/core/src/main/scala/scalapb/zio_grpc/package.scala
@@ -13,4 +13,6 @@ package object zio_grpc {
 
   @deprecated("Use ScopedServer instead of ManagedServer", "0.6.0")
   val ManagedServer = scalapb.zio_grpc.ScopedServer
+
+  type ZTransform[ContextIn, ContextOut] = GTransform[ContextIn, StatusException, ContextOut, StatusException]
 }
diff --git a/core/src/main/scala/scalapb/zio_grpc/transforms.scala b/core/src/main/scala/scalapb/zio_grpc/transforms.scala
index 4371720a3..1285dcbbc 100644
--- a/core/src/main/scala/scalapb/zio_grpc/transforms.scala
+++ b/core/src/main/scala/scalapb/zio_grpc/transforms.scala
@@ -14,21 +14,22 @@ trait Transform {
   def effect[A](io: ZIO[Any, StatusException, A]): ZIO[Any, StatusException, A]
   def stream[A](io: ZStream[Any, StatusException, A]): ZStream[Any, StatusException, A]
 
-  // Converts this Transform to ZTransform that transforms the effects like this, but
+  // Converts this Transform to GTransform that transforms the effects like this, but
   // leaves the Context unchanged.
-  def toZTransform[Context]: ZTransform[Context, Context] = new ZTransform[Context, Context] {
-    def effect[A](
-        io: Context => ZIO[Any, StatusException, A]
-    ): Context => ZIO[Any, StatusException, A] = { c =>
-      self.effect(io(c))
-    }
+  def toGTransform[Context]: GTransform[Context, StatusException, Context, StatusException] =
+    new GTransform[Context, StatusException, Context, StatusException] {
+      def effect[A](
+          io: Context => ZIO[Any, StatusException, A]
+      ): Context => ZIO[Any, StatusException, A] = { c =>
+        self.effect(io(c))
+      }
 
-    def stream[A](
-        io: Context => ZStream[Any, StatusException, A]
-    ): Context => ZStream[Any, StatusException, A] = { c =>
-      self.stream(io(c))
+      def stream[A](
+          io: Context => ZStream[Any, StatusException, A]
+      ): Context => ZStream[Any, StatusException, A] = { c =>
+        self.stream(io(c))
+      }
     }
-  }
 
   def andThen(other: Transform): Transform = new Transform {
     def effect[A](io: ZIO[Any, StatusException, A]): ZIO[Any, StatusException, A] =
@@ -40,7 +41,7 @@ trait Transform {
 }
 
 object Transform {
-  def fromZTransform(ct: ZTransform[Any, Any]) = new Transform {
+  def fromGTransform(ct: GTransform[Any, StatusException, Any, StatusException]) = new Transform {
     def effect[A](io: ZIO[Any, StatusException, A]): ZIO[Any, StatusException, A] = ct.effect(_ => io)(())
 
     def stream[A](io: ZStream[Any, StatusException, A]): ZStream[Any, StatusException, A] =
@@ -48,51 +49,78 @@ object Transform {
   }
 }
 
-/** Describes a transformation for all effects and streams of a service that has context.
+/** Describes a transformation for all effects and streams of a generic service.
   *
   * Instances of this class can be used to apply a transformation to all methods of a service to generate a new
   * "decorated" service. This can be used for pre- or post-processing of requests/response or to transform the context.
   */
-trait ZTransform[+ContextIn, -ContextOut] {
+trait GTransform[+ContextIn, -ErrorIn, -ContextOut, +ErrorOut] {
   self =>
   def effect[A](
-      io: ContextIn => ZIO[Any, StatusException, A]
-  ): (ContextOut => ZIO[Any, StatusException, A])
+      io: ContextIn => ZIO[Any, ErrorIn, A]
+  ): (ContextOut => ZIO[Any, ErrorOut, A])
   def stream[A](
-      io: ContextIn => ZStream[Any, StatusException, A]
-  ): (ContextOut => ZStream[Any, StatusException, A])
-
-  def andThen[ContextIn2 <: ContextOut, ContextOut2](
-      other: ZTransform[ContextIn2, ContextOut2]
-  ): ZTransform[ContextIn, ContextOut2] = new ZTransform[ContextIn, ContextOut2] {
-    def effect[A](
-        io: ContextIn => ZIO[Any, StatusException, A]
-    ): ContextOut2 => ZIO[Any, StatusException, A] =
-      other.effect(self.effect(io))
+      io: ContextIn => ZStream[Any, ErrorIn, A]
+  ): (ContextOut => ZStream[Any, ErrorOut, A])
 
-    def stream[A](
-        io: ContextIn => ZStream[Any, StatusException, A]
-    ): ContextOut2 => ZStream[Any, StatusException, A] =
-      other.stream(self.stream(io))
-  }
+  def andThen[ContextIn2 <: ContextOut, ErrorIn2 >: ErrorOut, ContextOut2, ErrorOut2](
+      other: GTransform[ContextIn2, ErrorIn2, ContextOut2, ErrorOut2]
+  ): GTransform[ContextIn, ErrorIn, ContextOut2, ErrorOut2] =
+    new GTransform[ContextIn, ErrorIn, ContextOut2, ErrorOut2] {
+      def effect[A](
+          io: ContextIn => ZIO[Any, ErrorIn, A]
+      ): ContextOut2 => ZIO[Any, ErrorOut2, A] =
+        other.effect(self.effect(io))
+
+      def stream[A](
+          io: ContextIn => ZStream[Any, ErrorIn, A]
+      ): ContextOut2 => ZStream[Any, ErrorOut2, A] =
+        other.stream(self.stream(io))
+    }
 }
 
-object ZTransform {
-  // Returns a ZTransform that effectfully transforms the context parameter
-  def apply[ContextIn, ContextOut](
-      f: ContextOut => ZIO[Any, StatusException, ContextIn]
-  ): ZTransform[ContextIn, ContextOut] =
-    new ZTransform[ContextIn, ContextOut] {
+object GTransform {
+  // Returns a GTransform that effectfully transforms the context parameter
+  def apply[ContextIn, Error, ContextOut](
+      f: ContextOut => ZIO[Any, Error, ContextIn]
+  ): GTransform[ContextIn, Error, ContextOut, Error] =
+    new GTransform[ContextIn, Error, ContextOut, Error] {
       def effect[A](
-          io: ContextIn => ZIO[Any, StatusException, A]
-      ): ContextOut => ZIO[Any, StatusException, A] = { (context: ContextOut) =>
+          io: ContextIn => ZIO[Any, Error, A]
+      ): ContextOut => ZIO[Any, Error, A] = { (context: ContextOut) =>
         f(context).flatMap(io)
       }
 
       def stream[A](
-          io: ContextIn => ZStream[Any, StatusException, A]
-      ): ContextOut => ZStream[Any, StatusException, A] = { (context: ContextOut) =>
+          io: ContextIn => ZStream[Any, Error, A]
+      ): ContextOut => ZStream[Any, Error, A] = { (context: ContextOut) =>
         ZStream.fromZIO(f(context)).flatMap(io)
       }
     }
+
+  // Returns a GTransform that maps the error parameter.
+  def mapError[C, E1, E2](f: E1 => E2): GTransform[C, E1, C, E2] = new GTransform[C, E1, C, E2] {
+    def effect[A](io: C => zio.ZIO[Any, E1, A]): C => zio.ZIO[Any, E2, A]                       = { (context: C) =>
+      io(context).mapError(f)
+    }
+    def stream[A](io: C => zio.stream.ZStream[Any, E1, A]): C => zio.stream.ZStream[Any, E2, A] = { (context: C) =>
+      io(context).mapError(f)
+    }
+  }
+
+  // Returns a GTransform that effectfully maps the error parameter.
+  def mapErrorZIO[C, E1, E2](f: E1 => zio.UIO[E2]): GTransform[C, E1, C, E2] = new GTransform[C, E1, C, E2] {
+    def effect[A](io: C => zio.ZIO[Any, E1, A]): C => zio.ZIO[Any, E2, A]                       = { (context: C) =>
+      io(context).flatMapError(f)
+    }
+    def stream[A](io: C => zio.stream.ZStream[Any, E1, A]): C => zio.stream.ZStream[Any, E2, A] = { (context: C) =>
+      io(context).catchAll(e => ZStream.fromZIO(f(e).flatMap(ZIO.fail(_))))
+    }
+  }
+}
+
+object ZTransform {
+  def apply[ContextIn, ContextOut](
+      f: ContextOut => ZIO[Any, StatusException, ContextIn]
+  ): ZTransform[ContextIn, ContextOut] = GTransform(f)
 }
diff --git a/docs/generated-code.md b/docs/generated-code.md
index dd4b8ff20..30d2961c5 100644
--- a/docs/generated-code.md
+++ b/docs/generated-code.md
@@ -26,15 +26,19 @@ trait MyService {
 
 The trait `MyService` is to be extended when implementing a server for this service.
 
-It is common that services need to extract information from the request context, for example the caller's identity. To accomplish that, there is another trait `ZMyService` which takes one
-type parameter `Context`. The `Context` type parameter represents any domain object that you would like your RPC methods to receive.  Later on, we will see how to convert between a `RequestContext` which represents the underlying context of the requset with your domain model.
-
 ```scala
 object MyServiceImpl extends MyService {
   def sayHello(request: HelloRequest): ZIO[Any, StatusException, HelloReply] = ???
 }
 ```
 
+It is common that services need to extract information from the request context, for example the caller's identity. To accomplish that, there is another trait `ZMyService` which takes one
+type parameter `Context`. The `Context` type parameter represents any domain object that you would like your RPC methods to receive.  Later on, we will see how to convert between a `RequestContext` which represents the underlying context of the request with your domain model.
+
+The most generic type is called `GMyService`. It takes two type parameters: `Context` and `Error`. The context is the same as before, and the error could be any type you would like your server implementatino to use
+an error. Before you use this service with the rest of zio-grpc API, you would need to convert the error type
+to `StatusException` by using either `mapError` or `mapErrorZIO`.
+
 Learn more about using [context and dependencies](context.md) in the next section.
 
 ### Running the server
diff --git a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala
index ab46909ef..83094cac7 100644
--- a/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala
+++ b/e2e/src/it/scala/scalapb/zio_grpc/BackpressureSpec.scala
@@ -31,14 +31,18 @@ object BackpressureSpec extends ZIOSpecDefault {
       new ZioTestservice.TestService {
         val responses = ZStream.iterate(0)(_ + 1).map(i => Response(i.toString)).take(100)
 
-        def bidiStreaming(request: zio.stream.Stream[StatusException, Request]): ZStream[Any with Any, StatusException, Response] =
+        def bidiStreaming(
+            request: zio.stream.Stream[StatusException, Request]
+        ): ZStream[Any with Any, StatusException, Response] =
           request.drain ++ responses
 
         def serverStreaming(request: Request): ZStream[Any with Any, StatusException, Response] = responses
 
         def serverStreamingTypeMapped(request: Request): ZStream[Any with Any, StatusException, WrappedString] = ???
 
-        def clientStreaming(request: zio.stream.Stream[StatusException, Request]): ZIO[Any with Any, StatusException, Response] = ???
+        def clientStreaming(
+            request: zio.stream.Stream[StatusException, Request]
+        ): ZIO[Any with Any, StatusException, Response] = ???
 
         def unary(request: Request): ZIO[Any, StatusException, Response] = ???
 
diff --git a/e2e/src/test/scalajvm/scalapb/zio_grpc/MapErrorSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/MapErrorSpec.scala
new file mode 100644
index 000000000..a8c50fb71
--- /dev/null
+++ b/e2e/src/test/scalajvm/scalapb/zio_grpc/MapErrorSpec.scala
@@ -0,0 +1,80 @@
+package scalapb.zio_grpc
+
+import scalapb.zio_grpc.testservice.ZioTestservice
+import scalapb.zio_grpc.testservice.{Request, Response}
+import zio.{IO, ZIO}
+import zio.stream.{Stream, ZStream}
+import zio.test.ZIOSpecDefault
+import zio.test._
+import zio.test.Assertion._
+import ZioTestservice.GTestService
+import io.grpc.{Status, StatusException}
+import zio.stream.ZSink
+
+case class CustomError(code: Int)
+
+object MapErrorSpec extends ZIOSpecDefault {
+  object ServerWithCustomError extends GTestService[Any, CustomError] {
+    def unary(request: Request, context: Any): IO[CustomError, Response] = ZIO.fail(CustomError(request.in))
+
+    def unaryTypeMapped(request: Request, context: Any): IO[CustomError, WrappedString] =
+      ZIO.fail(CustomError(request.in))
+
+    def serverStreaming(request: Request, context: Any): Stream[CustomError, Response] =
+      ZStream(Response("1"), Response("2")) ++ ZStream.fail(CustomError(request.in))
+
+    def serverStreamingTypeMapped(request: Request, context: Any): zio.stream.Stream[CustomError, WrappedString] =
+      ZStream(WrappedString("1"), WrappedString("2")) ++ ZStream.fail(CustomError(request.in))
+
+    def clientStreaming(request: zio.stream.Stream[StatusException, Request], context: Any): IO[CustomError, Response] =
+      ???
+
+    def bidiStreaming(
+        request: zio.stream.Stream[StatusException, Request],
+        context: Any
+    ): zio.stream.Stream[CustomError, Response] = ???
+  }
+
+  def withServer(name: String, server: ZioTestservice.ZTestService[Any]) = suite(name)(
+    test("maps errors for unary requests")(
+      assertZIO(server.unary(Request(in = 4), 0).exit)(fails(TestUtils.hasStatusCode(Status.fromCodeValue(4))))
+    ),
+    test("maps errors for unary type mapped requests requests")(
+      assertZIO(server.unaryTypeMapped(Request(in = 5), 0).exit)(
+        fails(TestUtils.hasStatusCode(Status.fromCodeValue(5)))
+      )
+    ),
+    test("maps errors for server streaming requests")(
+      assertZIO(server.serverStreaming(Request(in = 6), 0).either.run(ZSink.collectAll))(
+        hasAt(0)(isRight(equalTo(Response("1")))) &&
+          hasAt(1)(isRight(equalTo(Response("2")))) &&
+          hasAt(2)(isLeft(TestUtils.hasStatusCode(Status.fromCodeValue(6))))
+      )
+    ),
+    test("maps errors for server streaming requests")(
+      assertZIO(server.serverStreaming(Request(in = 6), 0).either.run(ZSink.collectAll))(
+        hasAt(0)(isRight(equalTo(Response("1")))) &&
+          hasAt(1)(isRight(equalTo(Response("2")))) &&
+          hasAt(2)(isLeft(TestUtils.hasStatusCode(Status.fromCodeValue(6))))
+      )
+    ),
+    test("maps errors for type mapped streaming requests")(
+      assertZIO(server.serverStreamingTypeMapped(Request(in = 6), 0).either.run(ZSink.collectAll))(
+        hasAt(0)(isRight(equalTo(WrappedString("1")))) &&
+          hasAt(1)(isRight(equalTo(WrappedString("2")))) &&
+          hasAt(2)(isLeft(TestUtils.hasStatusCode(Status.fromCodeValue(6))))
+      )
+    )
+  )
+
+  def spec = suite("Map error spec")(
+    withServer(
+      "using mapError",
+      ServerWithCustomError.mapError(c => new StatusException(Status.fromCodeValue(c.code)))
+    ),
+    withServer(
+      "using mapErrorZIO",
+      ServerWithCustomError.mapErrorZIO(c => ZIO.succeed(new StatusException(Status.fromCodeValue(c.code))))
+    )
+  )
+}
diff --git a/shell.nix b/shell.nix
index 4a622dc2a..97f70a84b 100644
--- a/shell.nix
+++ b/shell.nix
@@ -10,7 +10,6 @@ pkgs.mkShell {
     pkgs.sbt
     pkgs.openjdk11
     pkgs.nodejs
-    pkgs.yarn
 
     # keep this line if you use bash
     pkgs.bashInteractive

From 12a5274f8e1550df232a307b253e3ea43dca2cf9 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 11 Jul 2023 01:59:26 +0200
Subject: [PATCH 180/245] Update sbt to 1.9.2 (#530)

---
 project/build.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/build.properties b/project/build.properties
index 3c0b78a7c..875b706a8 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=1.9.1
+sbt.version=1.9.2

From bbed7dcdb5d06cd7b0f83dfc29628a71a113602e Mon Sep 17 00:00:00 2001
From: Matthieu Leclercq 
Date: Fri, 14 Jul 2023 16:01:01 -0400
Subject: [PATCH 181/245] Can apply ZTransform on service client (#528)

Apply ZTransform on service client

Introduce ClientCallContext to enable transformation that have access to CallOptions, Safemetadata and MethodDescriptor.

Add GTransform.compose.

Add updates methods to SafeMetadata, and "map-like" API to add key-values in SafeMetadata
---
 .../scalapb/zio_grpc/ZioCodeGenerator.scala   | 177 +++++++++---------
 .../scalapb/zio_grpc/ClientCallContext.scala  |  50 +++++
 .../scalapb/zio_grpc/ClientMethods.scala      |  35 ----
 .../scalapb/zio_grpc/GeneratedClient.scala    |  35 ++++
 .../main/scala/scalapb/zio_grpc/package.scala |   2 +
 .../scala/scalapb/zio_grpc/transforms.scala   |  12 ++
 .../scalapb/zio_grpc/SafeMetadata.scala       |   8 +
 docs/deadlines.md                             |  24 +--
 .../zio_grpc/ClientTransformSpec.scala        |  67 +++++++
 9 files changed, 279 insertions(+), 131 deletions(-)
 create mode 100644 core/src/main/scala/scalapb/zio_grpc/ClientCallContext.scala
 delete mode 100644 core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala
 create mode 100644 core/src/main/scala/scalapb/zio_grpc/GeneratedClient.scala
 create mode 100644 e2e/src/test/scalajvm/scalapb/zio_grpc/ClientTransformSpec.scala

diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
index 1b240d57e..eb8da7997 100644
--- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
+++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
@@ -65,6 +65,8 @@ class ZioFilePrinter(
   val Deadline            = "io.grpc.Deadline"
   val methodDescriptor    = "io.grpc.MethodDescriptor"
   val RequestContext      = "scalapb.zio_grpc.RequestContext"
+  val ClientCallContext   = "scalapb.zio_grpc.ClientCallContext"
+  val ClientTransform     = "scalapb.zio_grpc.ClientTransform"
   val ZClientCall         = "scalapb.zio_grpc.client.ZClientCall"
   val ZManagedChannel     = "scalapb.zio_grpc.ZManagedChannel"
   val ZChannel            = "scalapb.zio_grpc.ZChannel"
@@ -299,40 +301,6 @@ class ZioFilePrinter(
         )
       ).add("}")
 
-    def printClientTransformMethod(fp: FunctionalPrinter): FunctionalPrinter =
-      fp.add(
-        s"def transform(f: $Transform): ${clientServiceName.name} = new ${clientServiceName.name} {"
-      ).indented(
-        _.print(service.getMethods().asScala.toVector)(
-          printClientTransform
-        )
-          .add(
-            "// Returns a client that gives access to headers and trailers from server's response",
-            s"def withResponseMetadata: ${clientWithResponseMetadataServiceName.name} = self.withResponseMetadata.transform(f)"
-          )
-          .add(
-            "// Returns a copy of the client with updated call options",
-            s"def mapCallOptions(cf: $CallOptions => $CallOptions): ${clientServiceName.name} = self.mapCallOptions(cf).transform(f)",
-            "// Returns a copy of the client with updated metadata",
-            s"def mapMetadataZIO(mdf: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientServiceName.name} = self.mapMetadataZIO(mdf).transform(f)"
-          )
-      ).add("}")
-
-    def clientWithResponseMetadataTranformMethod(fp: FunctionalPrinter): FunctionalPrinter =
-      fp.add(
-        s"def transform(f: $Transform): ${clientWithResponseMetadataServiceName.name} = new ${clientWithResponseMetadataServiceName.name} {"
-      ).indented(
-        _.print(service.getMethods().asScala.toVector)(
-          printClientWithResponseMetadataTransform
-        )
-          .add(
-            "// Returns a copy of the client with updated call options",
-            s"def mapCallOptions(cf: $CallOptions => $CallOptions): ${clientWithResponseMetadataServiceName.name} = self.mapCallOptions(cf).transform(f)",
-            "// Returns a copy of the client with updated metadata",
-            s"def mapMetadataZIO(mdf: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientWithResponseMetadataServiceName.name} = self.mapMetadataZIO(mdf).transform(f)"
-          )
-      ).add("}")
-
     def print(fp: FunctionalPrinter): FunctionalPrinter =
       fp.add(
         s"trait ${gtraitName.name}[-Context, +Error] extends scalapb.zio_grpc.GenericGeneratedService[Context, Error, ${gtraitName.name}] {"
@@ -434,29 +402,27 @@ class ZioFilePrinter(
         .add("")
         .add("// accessor with metadata methods")
         .add(
-          s"class ${accessorsWithResponseMetadataClassName.name}(callOptionsFunc: $CallOptions => $CallOptions, metadataFunc: $SafeMetadata => zio.UIO[$SafeMetadata]) extends scalapb.zio_grpc.ClientMethods[${accessorsWithResponseMetadataClassName.name}] {"
+          s"class ${accessorsWithResponseMetadataClassName.name}(transforms: $ClientTransform = $ClientTransform.identity) extends scalapb.zio_grpc.GeneratedClient[${accessorsWithResponseMetadataClassName.name}] {"
         )
         .indented(
-          _.add(s"def this() = this(identity, zio.ZIO.succeed(_))")
+          _.add(
+            s"def this(callOptionsFunc: $CallOptions => $CallOptions, metadataFunc: $SafeMetadata => zio.UIO[$SafeMetadata]) = this($ClientTransform.mapCallOptions(callOptionsFunc).andThen($ClientTransform.mapMetadataZIO(metadataFunc)))"
+          )
             .print(service.getMethods().asScala.toVector)(printAccessorWithResponseMetadata)
             .add(
-              "// Returns new instance with modified call options. See ClientMethods for more.",
-              s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${accessorsWithResponseMetadataClassName.name} = new ${accessorsWithResponseMetadataClassName.name}(co => f(callOptionsFunc(co)), metadataFunc)",
-              "// Returns new instance with modified metadata. See ClientMethods for more.",
-              s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${accessorsWithResponseMetadataClassName.name} = new ${accessorsWithResponseMetadataClassName.name}(callOptionsFunc, md => metadataFunc(md).flatMap(f))"
+              s"override def transform(t: $ClientTransform): ${accessorsWithResponseMetadataClassName.name} = new ${accessorsWithResponseMetadataClassName.name}(transforms.andThen(t))"
             )
         )
         .add("}")
         .add("")
         .add(
-          s"trait ${clientWithResponseMetadataServiceName.name} extends scalapb.zio_grpc.ClientMethods[${clientWithResponseMetadataServiceName.name}] {"
+          s"trait ${clientWithResponseMetadataServiceName.name} extends scalapb.zio_grpc.GeneratedClient[${clientWithResponseMetadataServiceName.name}] {"
         )
         .indented(
           _.add("self =>")
             .print(service.getMethods().asScala.toVector)(
               printClientWithResponseMetadataMethodSignature
             )
-            .call(clientWithResponseMetadataTranformMethod)
         )
         .add("}")
         .add("")
@@ -465,7 +431,7 @@ class ZioFilePrinter(
         )
         .indent
         .add(
-          s"private[this] class ServiceStub(channel: $ZChannel, callOptions: $CallOptions, metadata: zio.UIO[$SafeMetadata])"
+          s"private[this] class ServiceStub(channel: $ZChannel, transforms: $ClientTransform)"
         )
         .add(s"    extends ${clientWithResponseMetadataServiceName.name} {")
         .indented(
@@ -473,22 +439,34 @@ class ZioFilePrinter(
             printClientWithResponseMetadataImpl
           )
             .add(
-              "// Returns new instance with modified call options. See ClientMethods for more.",
-              s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${clientWithResponseMetadataServiceName.name} = new ServiceStub(channel, f(callOptions), metadata)",
-              "// Returns new instance with modified metadata. See ClientMethods for more.",
-              s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientWithResponseMetadataServiceName.name} = new ServiceStub(channel, callOptions, metadata.flatMap(f))"
+              s"override def transform(t: $ClientTransform): ${clientWithResponseMetadataServiceName.name} = new ServiceStub(channel, transforms.compose(t))"
             )
         )
         .add("}")
         .add("")
         .add(
-          s"def scoped(managedChannel: $ZManagedChannel, options: $CallOptions = $CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithResponseMetadataServiceName.name}] = managedChannel.map {"
+          s"def scoped(managedChannel: $ZManagedChannel, transforms: $ClientTransform): zio.ZIO[zio.Scope, Throwable, ${clientWithResponseMetadataServiceName.name}] = managedChannel.map {"
         )
-        .add("  channel => new ServiceStub(channel, options, metadata)")
+        .add("  channel => new ServiceStub(channel, transforms)")
         .add("}")
+        .add(
+          s"def scoped(managedChannel: $ZManagedChannel, options: $CallOptions = $CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientWithResponseMetadataServiceName.name}] ="
+        )
+        .add(
+          s"  scoped(managedChannel, $ClientTransform.withCallOptions(options).andThen($ClientTransform.withMetadataZIO(metadata)))"
+        )
         .add("")
         .add(
-          s"def live[Context](managedChannel: $ZManagedChannel, options: $CallOptions=$CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientWithResponseMetadataServiceName.name}] = zio.ZLayer.scoped(scoped(managedChannel, options, metadata))"
+          s"def live[Context](managedChannel: $ZManagedChannel, transforms: $ClientTransform): zio.ZLayer[Any, Throwable, ${clientWithResponseMetadataServiceName.name}] ="
+        )
+        .add(
+          "  zio.ZLayer.scoped(scoped(managedChannel, transforms))"
+        )
+        .add(
+          s"def live[Context](managedChannel: $ZManagedChannel, options: $CallOptions=$CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientWithResponseMetadataServiceName.name}] ="
+        )
+        .add(
+          "  zio.ZLayer.scoped(scoped(managedChannel, options, metadata))"
         )
         .outdent
         .add("}")
@@ -498,22 +476,21 @@ class ZioFilePrinter(
         .add("")
         .add("// accessor methods")
         .add(
-          s"class ${accessorsClassName.name}(callOptionsFunc: $CallOptions => $CallOptions, metadataFunc: $SafeMetadata => zio.UIO[$SafeMetadata]) extends scalapb.zio_grpc.ClientMethods[${accessorsClassName.name}] {"
+          s"class ${accessorsClassName.name}(transforms: $ClientTransform = $ClientTransform.identity) extends scalapb.zio_grpc.GeneratedClient[${accessorsClassName.name}] {"
         )
         .indented(
-          _.add(s"def this() = this(identity, zio.ZIO.succeed(_))")
+          _.add(
+            s"def this(callOptionsFunc: $CallOptions => $CallOptions, metadataFunc: $SafeMetadata => zio.UIO[$SafeMetadata]) = this($ClientTransform.mapCallOptions(callOptionsFunc).andThen($ClientTransform.mapMetadataZIO(metadataFunc)))"
+          )
             .print(service.getMethods().asScala.toVector)(printAccessor)
             .add(
-              "// Returns new instance with modified call options. See ClientMethods for more.",
-              s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${accessorsClassName.name} = new ${accessorsClassName.name}(co => f(callOptionsFunc(co)), metadataFunc)",
-              "// Returns new instance with modified metadata. See ClientMethods for more.",
-              s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${accessorsClassName.name} = new ${accessorsClassName.name}(callOptionsFunc, md => metadataFunc(md).flatMap(f))"
+              s"override def transform(t: $ClientTransform): ${accessorsClassName.name} = new ${accessorsClassName.name}(transforms.andThen(t))"
             )
         )
         .add("}")
         .add("")
         .add(
-          s"trait ${clientServiceName.name} extends scalapb.zio_grpc.ClientMethods[${clientServiceName.name}] with scalapb.zio_grpc.TransformableClient[${clientServiceName.name}] {"
+          s"trait ${clientServiceName.name} extends scalapb.zio_grpc.GeneratedClient[${clientServiceName.name}] {"
         )
         .indented(
           _.add("self =>")
@@ -527,7 +504,6 @@ class ZioFilePrinter(
               "// Returns a client that gives access to headers and trailers from server's response",
               s"def withResponseMetadata: ${clientWithResponseMetadataServiceName.name}"
             )
-            .call(printClientTransformMethod)
         )
         .add("}")
         .add("")
@@ -547,20 +523,35 @@ class ZioFilePrinter(
             .add(
               "// Returns a client that gives access to headers and trailers from server's response",
               s"def withResponseMetadata: ${clientWithResponseMetadataServiceName.name} = underlying",
-              "// Returns new instance with modified call options. See ClientMethods for more.",
-              s"override def mapCallOptions(f: $CallOptions => $CallOptions): ${clientServiceName.name} = new ServiceStub(underlying.mapCallOptions(f))",
-              "// Returns new instance with modified metadata. See ClientMethods for more.",
-              s"override def mapMetadataZIO(f: $SafeMetadata => zio.UIO[$SafeMetadata]): ${clientServiceName.name} = new ServiceStub(underlying.mapMetadataZIO(f))"
+              s"override def transform(t: $ClientTransform): ${clientServiceName.name} = new ServiceStub(underlying.transform(t))"
             )
         )
         .add("}")
         .add("")
         .add(
-          s"def scoped(managedChannel: $ZManagedChannel, options: $CallOptions = $CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}] = ${clientWithResponseMetadataServiceName.name}.scoped(managedChannel, options, metadata).map(client => new ServiceStub(client))"
+          s"def scoped(managedChannel: $ZManagedChannel, transforms: $ClientTransform): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}] ="
+        )
+        .add(
+          s"  ${clientWithResponseMetadataServiceName.name}.scoped(managedChannel, transforms).map(client => new ServiceStub(client))"
+        )
+        .add(
+          s"def scoped(managedChannel: $ZManagedChannel, options: $CallOptions = $CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata]=$SafeMetadata.make): zio.ZIO[zio.Scope, Throwable, ${clientServiceName.name}] ="
+        )
+        .add(
+          s"  ${clientServiceName.name}.scoped(managedChannel, $ClientTransform.withCallOptions(options).andThen($ClientTransform.withMetadataZIO(metadata)))"
         )
         .add("")
         .add(
-          s"def live(managedChannel: $ZManagedChannel, options: $CallOptions=$CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientServiceName.name}] = ${clientWithResponseMetadataServiceName.name}.live(managedChannel, options, metadata).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))"
+          s"def live(managedChannel: $ZManagedChannel, transforms: $ClientTransform): zio.ZLayer[Any, Throwable, ${clientServiceName.name}] ="
+        )
+        .add(
+          s"  ${clientWithResponseMetadataServiceName.name}.live(managedChannel, transforms).map(clientEnv => zio.ZEnvironment(new ServiceStub(clientEnv.get)))"
+        )
+        .add(
+          s"def live(managedChannel: $ZManagedChannel, options: $CallOptions=$CallOptions.DEFAULT, metadata: zio.UIO[$SafeMetadata] = $SafeMetadata.make): zio.ZLayer[Any, Throwable, ${clientServiceName.name}] ="
+        )
+        .add(
+          s"  ${clientServiceName.name}.live(managedChannel, $ClientTransform.withCallOptions(options).andThen($ClientTransform.withMetadataZIO(metadata)))"
         )
         .outdent
         .add("}")
@@ -574,7 +565,7 @@ class ZioFilePrinter(
           method,
           contextType = s"${clientServiceName.name}"
         ) + " = "
-      val innerCall         = s"_.mapCallOptions(callOptionsFunc).mapMetadataZIO(metadataFunc).${method.name}(request)"
+      val innerCall         = s"_.transform(transforms).${method.name}(request)"
       val clientCall        = method.streamType match {
         case StreamType.Unary           =>
           s"_root_.zio.ZIO.serviceWithZIO[${clientServiceName.name}]($innerCall)"
@@ -597,7 +588,7 @@ class ZioFilePrinter(
           method,
           envOutType = s"${clientWithResponseMetadataServiceName.name}"
         ) + " = "
-      val innerCall         = s"_.mapCallOptions(callOptionsFunc).mapMetadataZIO(metadataFunc).${method.name}(request)"
+      val innerCall         = s"_.transform(transforms).${method.name}(request)"
       val clientCall        = method.streamType match {
         case StreamType.Unary           =>
           s"_root_.zio.ZIO.serviceWithZIO[${clientWithResponseMetadataServiceName.name}]($innerCall)"
@@ -612,33 +603,51 @@ class ZioFilePrinter(
     }
 
     def printClientWithResponseMetadataImpl(fp: FunctionalPrinter, method: MethodDescriptor): FunctionalPrinter = {
-      val clientCall = method.streamType match {
-        case StreamType.Unary           => s"$ClientCalls.withMetadata.unaryCall"
-        case StreamType.ClientStreaming => s"$ClientCalls.withMetadata.clientStreamingCall"
-        case StreamType.ServerStreaming => s"$ClientCalls.withMetadata.serverStreamingCall"
-        case StreamType.Bidirectional   => s"$ClientCalls.withMetadata.bidiCall"
+      val Req = method.inputType.scalaType
+      val Res = method.outputType.scalaType
+
+      val clientCall      = method.streamType match {
+        case StreamType.Unary           => s"$ClientCalls.withMetadata.unaryCall[$Req, $Res]"
+        case StreamType.ClientStreaming => s"$ClientCalls.withMetadata.clientStreamingCall[$Req, $Res]"
+        case StreamType.ServerStreaming => s"$ClientCalls.withMetadata.serverStreamingCall[$Req, $Res]"
+        case StreamType.Bidirectional   => s"$ClientCalls.withMetadata.bidiCall[$Req, $Res]"
       }
-      val prefix     = method.streamType match {
-        case StreamType.Unary           => s"metadata.flatMap"
-        case StreamType.ClientStreaming => s"metadata.flatMap"
-        case StreamType.ServerStreaming =>
-          s"zio.stream.ZStream.fromZIO(metadata).flatMap"
-        case StreamType.Bidirectional   =>
-          s"zio.stream.ZStream.fromZIO(metadata).flatMap"
+      val transformMethod = method.streamType match {
+        case StreamType.Unary | StreamType.ClientStreaming         => "effect"
+        case StreamType.ServerStreaming | StreamType.Bidirectional => "stream"
+      }
+      val makeMetadata    = method.streamType match {
+        case StreamType.Unary | StreamType.ClientStreaming         =>
+          s"$SafeMetadata.make"
+        case StreamType.ServerStreaming | StreamType.Bidirectional =>
+          s"zio.stream.ZStream.fromZIO($SafeMetadata.make)"
       }
       fp.add(
         clientWithResponseMetadataSignature(
           method,
           envOutType = "Any"
-        ) + s" = $prefix { headers => $clientCall("
+        ) + s" ="
       ).indent
-        .add(
-          s"channel, ${method.grpcDescriptor.fullName}, callOptions,"
+        .add(s"$makeMetadata.flatMap { metadata =>")
+        .indented(
+          _.add(s"transforms.$transformMethod { context => ")
+            .indented(
+              _.add(
+                s"$clientCall("
+              )
+                .indented(
+                  _.add(s"channel,")
+                    .add(s"context.method.asInstanceOf[$methodDescriptor[$Req, $Res]],")
+                    .add("context.options,")
+                    .add("context.metadata,")
+                    .add("request")
+                )
+                .add(")")
+            )
+            .add(s"}($ClientCallContext(${method.grpcDescriptor.fullName}, $CallOptions.DEFAULT, metadata))")
         )
-        .add(s"headers,")
-        .add(s"request")
+        .add("}")
         .outdent
-        .add(s")}")
     }
 
     def printClientImpl(
diff --git a/core/src/main/scala/scalapb/zio_grpc/ClientCallContext.scala b/core/src/main/scala/scalapb/zio_grpc/ClientCallContext.scala
new file mode 100644
index 000000000..a5cdc12c5
--- /dev/null
+++ b/core/src/main/scala/scalapb/zio_grpc/ClientCallContext.scala
@@ -0,0 +1,50 @@
+package scalapb.zio_grpc
+
+import io.grpc.MethodDescriptor
+import io.grpc.CallOptions
+import io.grpc.Deadline
+import java.util.concurrent.TimeUnit
+import zio.Duration
+import zio.UIO
+import zio.ZIO
+
+final case class ClientCallContext(
+    method: MethodDescriptor[_, _],
+    options: CallOptions,
+    metadata: SafeMetadata
+)
+
+object ClientTransform {
+
+  val identity: ClientTransform = GTransform.identity
+
+  def mapCallOptions(f: CallOptions => CallOptions): ClientTransform =
+    ZTransform[ClientCallContext, ClientCallContext] { context =>
+      ZIO.succeed(context.copy(options = f(context.options)))
+    }
+
+  def mapMetadataZIO(f: SafeMetadata => UIO[SafeMetadata]): ClientTransform =
+    ZTransform[ClientCallContext, ClientCallContext] { context =>
+      f(context.metadata).map(metadata => context.copy(metadata = metadata))
+    }
+
+  // Returns new instance with the metadata set to the one provide
+  def withMetadataZIO(metadata: UIO[SafeMetadata]): ClientTransform =
+    mapMetadataZIO(_ => metadata)
+
+  // Returns new instance with the call options set to the one provide
+  def withCallOptions(callOptions: CallOptions): ClientTransform =
+    mapCallOptions(_ => callOptions)
+
+  // Updates the deadline on the existing call options (results in new copy of CallOptions)
+  def withDeadline(deadline: Deadline): ClientTransform =
+    mapCallOptions(_.withDeadline(deadline))
+
+  // Updates the timeout on the existing call options (results in new copy of CallOptions)
+  def withTimeout(duration: Duration): ClientTransform =
+    mapCallOptions(_.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))
+
+  // Updates the timeout on the existing call options (results in new copy of CallOptions)
+  def withTimeoutMillis(millis: Long): ClientTransform =
+    withTimeout(Duration.fromMillis(millis))
+}
diff --git a/core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala b/core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala
deleted file mode 100644
index 37cc7f339..000000000
--- a/core/src/main/scala/scalapb/zio_grpc/ClientMethods.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-package scalapb.zio_grpc
-
-import io.grpc.CallOptions
-import java.util.concurrent.TimeUnit
-import zio.Duration
-import zio.UIO
-import io.grpc.Deadline
-
-trait ClientMethods[Repr] {
-  // Returns new instance with modified call options
-  def mapCallOptions(f: CallOptions => CallOptions): Repr
-
-  // Returns new instance with modified metadata
-  def mapMetadataZIO(f: SafeMetadata => UIO[SafeMetadata]): Repr
-
-  // Returns new instance with the metadata set to the one provide
-  def withMetadataZIO(metadata: UIO[SafeMetadata]): Repr = mapMetadataZIO(_ => metadata)
-
-  // Returns new instance with the call options set to the one provide
-  def withCallOptions(callOptions: CallOptions): Repr = mapCallOptions(_ => callOptions)
-
-  // Updates the deadline on the existing call options (results in new copy of CallOptions)
-  def withDeadline(deadline: Deadline): Repr = mapCallOptions(_.withDeadline(deadline))
-
-  // Updates the timeout on the existing call options (results in new copy of CallOptions)
-  def withTimeout(duration: Duration): Repr =
-    mapCallOptions(_.withDeadlineAfter(duration.toNanos, TimeUnit.NANOSECONDS))
-
-  // Updates the timeout on the existing call options (results in new copy of CallOptions)
-  def withTimeoutMillis(millis: Long): Repr = withTimeout(Duration.fromMillis(millis))
-}
-
-trait TransformableClient[Repr] {
-  def transform(t: Transform): Repr
-}
diff --git a/core/src/main/scala/scalapb/zio_grpc/GeneratedClient.scala b/core/src/main/scala/scalapb/zio_grpc/GeneratedClient.scala
new file mode 100644
index 000000000..c280eb4fa
--- /dev/null
+++ b/core/src/main/scala/scalapb/zio_grpc/GeneratedClient.scala
@@ -0,0 +1,35 @@
+package scalapb.zio_grpc
+
+import io.grpc.CallOptions
+import io.grpc.Deadline
+import zio.Duration
+import zio.UIO
+
+trait GeneratedClient[S] {
+  this: S =>
+
+  def transform(t: ZTransform[ClientCallContext, ClientCallContext]): S
+
+  def transform(t: Transform): S = transform(t.toGTransform[ClientCallContext])
+
+  // Returns new instance with modified call options
+  def mapCallOptions(f: CallOptions => CallOptions): S = transform(ClientTransform.mapCallOptions(f))
+
+  // Returns new instance with modified metadata
+  def mapMetadataZIO(f: SafeMetadata => UIO[SafeMetadata]): S = transform(ClientTransform.mapMetadataZIO(f))
+
+  // Returns new instance with the metadata set to the one provide
+  def withMetadataZIO(metadata: UIO[SafeMetadata]): S = transform((ClientTransform.withMetadataZIO(metadata)))
+
+  // Returns new instance with the call options set to the one provide
+  def withCallOptions(callOptions: CallOptions): S = transform(ClientTransform.withCallOptions(callOptions))
+
+  // Updates the deadline on the existing call options (results in new copy of CallOptions)
+  def withDeadline(deadline: Deadline): S = transform(ClientTransform.withDeadline(deadline))
+
+  // Updates the timeout on the existing call options (results in new copy of CallOptions)
+  def withTimeout(duration: Duration): S = transform(ClientTransform.withTimeout(duration))
+
+  // Updates the timeout on the existing call options (results in new copy of CallOptions)
+  def withTimeoutMillis(millis: Long): S = transform(ClientTransform.withTimeoutMillis(millis))
+}
diff --git a/core/src/main/scala/scalapb/zio_grpc/package.scala b/core/src/main/scala/scalapb/zio_grpc/package.scala
index d413c2e21..3a6c04c2c 100644
--- a/core/src/main/scala/scalapb/zio_grpc/package.scala
+++ b/core/src/main/scala/scalapb/zio_grpc/package.scala
@@ -15,4 +15,6 @@ package object zio_grpc {
   val ManagedServer = scalapb.zio_grpc.ScopedServer
 
   type ZTransform[ContextIn, ContextOut] = GTransform[ContextIn, StatusException, ContextOut, StatusException]
+
+  type ClientTransform = ZTransform[ClientCallContext, ClientCallContext]
 }
diff --git a/core/src/main/scala/scalapb/zio_grpc/transforms.scala b/core/src/main/scala/scalapb/zio_grpc/transforms.scala
index 1285dcbbc..190f64182 100644
--- a/core/src/main/scala/scalapb/zio_grpc/transforms.scala
+++ b/core/src/main/scala/scalapb/zio_grpc/transforms.scala
@@ -38,6 +38,8 @@ trait Transform {
     def stream[A](io: ZStream[Any, StatusException, A]): ZStream[Any, StatusException, A] =
       other.stream(self.stream(io))
   }
+
+  def compose(other: Transform): Transform = other.andThen(self)
 }
 
 object Transform {
@@ -77,9 +79,19 @@ trait GTransform[+ContextIn, -ErrorIn, -ContextOut, +ErrorOut] {
       ): ContextOut2 => ZStream[Any, ErrorOut2, A] =
         other.stream(self.stream(io))
     }
+
+  def compose[ContextIn2, ErrorIn2, ContextOut2 >: ContextIn, ErrorOut2 <: ErrorIn](
+      other: GTransform[ContextIn2, ErrorIn2, ContextOut2, ErrorOut2]
+  ): GTransform[ContextIn2, ErrorIn2, ContextOut, ErrorOut] = other.andThen(self)
 }
 
 object GTransform {
+
+  def identity[C, E]: GTransform[C, E, C, E] = new GTransform[C, E, C, E] {
+    def effect[A](io: C => ZIO[Any, E, A]): C => ZIO[Any, E, A]         = io
+    def stream[A](io: C => ZStream[Any, E, A]): C => ZStream[Any, E, A] = io
+  }
+
   // Returns a GTransform that effectfully transforms the context parameter
   def apply[ContextIn, Error, ContextOut](
       f: ContextOut => ZIO[Any, Error, ContextIn]
diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala b/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala
index 3d6569e72..d2c3f089c 100644
--- a/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala
+++ b/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala
@@ -24,6 +24,14 @@ final class SafeMetadata private (
 
   def wrapZIO[R, E, A](f: Metadata => ZIO[R, E, A]): ZIO[R, E, A] =
     sem.withPermit(f(metadata))
+
+  def +=[T](keyValue: (Metadata.Key[T], T)): UIO[SafeMetadata] = updated(keyValue._1, keyValue._2)
+
+  def updated[T](key: Metadata.Key[T], value: T): UIO[SafeMetadata] =
+    put(key, value).as(this)
+
+  def updatedZIO[R, E, T](key: Metadata.Key[T], value: ZIO[R, E, T]): ZIO[R, E, SafeMetadata] =
+    value.flatMap(updated(key, _))
 }
 
 object SafeMetadata {
diff --git a/docs/deadlines.md b/docs/deadlines.md
index 580d55a1d..6fef0c95c 100644
--- a/docs/deadlines.md
+++ b/docs/deadlines.md
@@ -18,17 +18,15 @@ the time the outbound call is made.
 
 ## Setting timeout for all requests
 
-To set the same timeout for all requests, it is possible to provide an effect that produces `CallOptions`
-when constructing the client. This effect is invoked before each request, and can determine the deadline
-relative to the system clock at the time the effect is executed.
+To set the same timeout for all requests, it is possible to provide a `ClientTransform` when constructing the
+client. This transformation is invoked before each request, and can determine the deadline relative to the
+system clock at the time the effect is executed.
 
 ```scala mdoc
 import myexample.testservice.ZioTestservice.ServiceNameClient
 import myexample.testservice.{Request, Response}
-import scalapb.zio_grpc.{ZManagedChannel, SafeMetadata}
+import scalapb.zio_grpc.{ZManagedChannel, ClientTransform}
 import io.grpc.ManagedChannelBuilder
-import io.grpc.CallOptions
-import java.util.concurrent.TimeUnit
 import zio._
 import zio.Console._
 
@@ -41,8 +39,7 @@ val channel = ZManagedChannel(
 // create layer:
 val clientLayer = ServiceNameClient.live(
   channel,
-  options=CallOptions.DEFAULT.withDeadlineAfter(3000, TimeUnit.MILLISECONDS),
-  metadata=SafeMetadata.make)
+  ClientTransform.withTimeoutMillis(3000))
 
 val myAppLogicNeedsEnv = for {
   // use layer through accessor methods:
@@ -60,8 +57,8 @@ for each request like this:
 ServiceNameClient.withTimeoutMillis(3000).unary(Request())
 ```
 
-Clients provide (through the `CallOptionsMethods` trait) a number of methods that make it possible
-to specify a deadline or a timeout for each request:
+Clients provide (through the `GeneratedClient` trait) a number of methods that makes it possible to
+specify a deadline or a timeout for each request:
 
 ```scala
 // Provide a new absolute deadline
@@ -76,8 +73,11 @@ def withTimeoutMillis(millis: Long): Service
 // Replace the call options with the provided call options
 def withCallOptions(callOptions: CallOptions): Service
 
-// Effectfully update the CallOptions for this service
-def mapCallOptionsM(f: CallOptions => zio.IO[Status, CallOptions]): Service
+// update the CallOptions for this service
+def mapCallOptions(f: CallOptions => CallOptions): Service
+
+// update the request Metadata for this service
+def mapMetadataZIO(f: SafeMetadata => UIO[SafeMetadata]): Service
 ```
 
 If you are using a client instance, the above methods are available to provide you with a new
diff --git a/e2e/src/test/scalajvm/scalapb/zio_grpc/ClientTransformSpec.scala b/e2e/src/test/scalajvm/scalapb/zio_grpc/ClientTransformSpec.scala
new file mode 100644
index 000000000..245fddf74
--- /dev/null
+++ b/e2e/src/test/scalajvm/scalapb/zio_grpc/ClientTransformSpec.scala
@@ -0,0 +1,67 @@
+package scalapb.zio_grpc
+
+import zio._
+import zio.test._
+import zio.test.Assertion._
+import io.grpc.CallOptions
+import scalapb.zio_grpc.testservice.TestServiceGrpc
+import io.grpc.Deadline
+import java.util.concurrent.TimeUnit
+import io.grpc.Metadata
+import io.grpc.StatusException
+
+object ClientTransformSpec extends ZIOSpecDefault {
+
+  val deadline    = Deadline.after(1000, TimeUnit.MILLISECONDS)
+  val metadataKey = Metadata.Key.of[String]("test", Metadata.ASCII_STRING_MARSHALLER)
+
+  def run(transform: ClientTransform): ZIO[Any, StatusException, ClientCallContext] =
+    for {
+      metadata <- SafeMetadata.make
+      context  <-
+        transform.effect(ZIO.succeed(_))(ClientCallContext(TestServiceGrpc.METHOD_UNARY, CallOptions.DEFAULT, metadata))
+    } yield context
+
+  def spec = suite("ClientTransformSpec")(
+    test("withDeadline") {
+      for {
+        contextOut <- run(ClientTransform.withDeadline(deadline))
+      } yield assert(contextOut.options.getDeadline())(equalTo(deadline))
+    },
+    test("withCallOption compose withDeadline") {
+      for {
+        contextOut <- run(
+                        ClientTransform
+                          .withCallOptions(CallOptions.DEFAULT)
+                          .compose(ClientTransform.withDeadline(deadline))
+                      )
+      } yield assert(contextOut.options.getDeadline())(equalTo(deadline))
+    },
+    test("withDeadline andThen withMetadataZIO") {
+      for {
+        contextOut <- run(
+                        ClientTransform
+                          .withDeadline(deadline)
+                          .andThen(
+                            ClientTransform.mapMetadataZIO(_ += (metadataKey -> "42"))
+                          )
+                      )
+      } yield assert(contextOut.options.getDeadline())(equalTo(deadline)) &&
+        assert(contextOut.metadata.metadata.get(metadataKey))(equalTo("42"))
+    },
+    test("withDeadline compose withMetadataZIO") {
+      for {
+        contextOut <- run(
+                        ClientTransform
+                          .withDeadline(deadline)
+                          .compose(
+                            ClientTransform.withMetadataZIO(
+                              SafeMetadata.make.flatMap(_ += (metadataKey -> "42"))
+                            )
+                          )
+                      )
+      } yield assert(contextOut.options.getDeadline())(equalTo(deadline)) &&
+        assert(contextOut.metadata.metadata.get(metadataKey))(equalTo("42"))
+    }
+  )
+}

From b0adcaedec19740ddafe7840f165405d8fe8f27c Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 15 Jul 2023 01:43:03 +0200
Subject: [PATCH 182/245] Update playwright to 1.36.0 (#533)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index f3b722af0..b2c9c995f 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.35.1"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.36.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From c8581cfa88b9cc97abd6c823f8deaba7b693f0d6 Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Fri, 14 Jul 2023 20:17:36 -0700
Subject: [PATCH 183/245] Update examples and docs to rc6

---
 build.sbt                               | 2 +-
 examples/fullapp/project/plugins.sbt    | 2 +-
 examples/helloworld/project/plugins.sbt | 2 +-
 examples/routeguide/project/plugins.sbt | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/build.sbt b/build.sbt
index b2c9c995f..61c09f35c 100644
--- a/build.sbt
+++ b/build.sbt
@@ -248,7 +248,7 @@ lazy val docs = project
     mdocVariables                                      := Map(
       "sbtProtocVersion" -> "1.0.6",
       "grpcVersion"      -> "1.50.1",
-      "zioGrpcVersion"   -> "0.6.0-rc5",
+      "zioGrpcVersion"   -> "0.6.0-rc6",
       "scalapbVersion"   -> scalapb.compiler.Version.scalapbVersion
     ),
     libraryDependencies ++= Seq(
diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt
index 7fa2e53a1..77d8bd039 100644
--- a/examples/fullapp/project/plugins.sbt
+++ b/examples/fullapp/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-val zioGrpcVersion = "0.6.0-rc5"
+val zioGrpcVersion = "0.6.0-rc6"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt
index 9cd98af08..51e34ccab 100644
--- a/examples/helloworld/project/plugins.sbt
+++ b/examples/helloworld/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-val zioGrpcVersion = "0.6.0-rc5"
+val zioGrpcVersion = "0.6.0-rc6"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt
index 9cd98af08..51e34ccab 100644
--- a/examples/routeguide/project/plugins.sbt
+++ b/examples/routeguide/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-val zioGrpcVersion = "0.6.0-rc5"
+val zioGrpcVersion = "0.6.0-rc6"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,

From d3a21bdb44f8078e4453936847a52668c17a8948 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 26 Jul 2023 22:36:32 +0200
Subject: [PATCH 184/245] Update sbt to 1.9.3 (#536)

---
 project/build.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/build.properties b/project/build.properties
index 875b706a8..52413ab79 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=1.9.2
+sbt.version=1.9.3

From 44a827bc46da71d848972e99f65fa9e760eec83d Mon Sep 17 00:00:00 2001
From: Regis Kuckaertz 
Date: Sat, 5 Aug 2023 05:09:27 +0100
Subject: [PATCH 185/245] Revert "fix: cleanup call fiber on exit (#515)"
 (#539)

This reverts commit 64b7ded54892e933f101b742c078f2c840919fc3.
---
 .../scalapb/zio_grpc/server/ListenerDriver.scala   | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala
index 34285df00..09555a96d 100644
--- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala
+++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala
@@ -18,7 +18,6 @@ object ListenerDriver {
 
   def unaryInputListener[Req](
       runtime: Runtime[Any],
-      scope: Scope.Closeable,
       call: ZServerCall[_],
       completed: Promise[StatusException, Unit],
       request: Promise[Nothing, Req],
@@ -30,10 +29,13 @@ object ListenerDriver {
         completed.await *>
         call.sendHeaders(new Metadata) *>
         request.await flatMap writeResponse
-    ).onExit(ex =>
-      call.close(ListenerDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore *> scope.close(ex)
-    ).ignore
-      .forkIn(scope)
+    ).onExit(ex => call.close(ListenerDriver.exitToStatus(ex), requestContext.responseMetadata.metadata).ignore)
+      .ignore
+      // Why forkDaemon? we need the driver to keep runnning in the background after we return a listener
+      // back to grpc-java. If it was just fork, the call to unsafeRun would not return control, so grpc-java
+      // won't have a listener to call on.  The driver awaits on the calls to the listener to pass to the user's
+      // service.
+      .forkDaemon
       .map(fiber =>
         new Listener[Req] {
           override def onCancel(): Unit =
@@ -89,10 +91,8 @@ object ListenerDriver {
     for {
       completed <- Promise.make[StatusException, Unit]
       request   <- Promise.make[Nothing, Req]
-      scope     <- Scope.make
       listener  <- unaryInputListener(
                      runtime,
-                     scope,
                      zioCall,
                      completed,
                      request,

From 5c3b4b8b0e186138609da4eb5fb9cb97120db16a Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 15 Aug 2023 21:59:33 +0200
Subject: [PATCH 186/245] Update playwright to 1.37.0 (#542)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index 61c09f35c..1b5e5506d 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.36.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.37.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From f2ba3252176ccc6678a5ec96e1b052faab125b3f Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Sun, 20 Aug 2023 10:28:41 -0700
Subject: [PATCH 187/245] docs: change '0.6.x (WIP)' to '0.6.x'

---
 website/docusaurus.config.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index 434c3a347..a696f1dc0 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -99,7 +99,7 @@ module.exports = {
 
           versions: {
               current: {
-                  label: '0.6.x (WIP)'
+                  label: '0.6.x'
               },
               '0.5.x': {
                   label: '0.5.x'

From 7acc1f387d3ea358dd682edbdf6f16dda3cb58b9 Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Sun, 20 Aug 2023 11:07:53 -0700
Subject: [PATCH 188/245] set version 0.6.x as current

---
 website/docusaurus.config.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index a696f1dc0..20e9fbc64 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -96,10 +96,12 @@ module.exports = {
           // Please change this to your repo.
           // editUrl: 'https://github.com/scalapb/zio-grpc/edit/master/foo/docs/',
           path: '../zio-grpc-docs/target/mdoc',
+          lastVersion: 'current',
 
           versions: {
               current: {
-                  label: '0.6.x'
+                  label: '0.6.x',
+                  path: '0.6.x'
               },
               '0.5.x': {
                   label: '0.5.x'

From bcb647c755facd1e11374ca56a3302321ef1962c Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Sun, 20 Aug 2023 11:29:37 -0700
Subject: [PATCH 189/245] Update version configuration

---
 website/docusaurus.config.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js
index 20e9fbc64..580f4d749 100644
--- a/website/docusaurus.config.js
+++ b/website/docusaurus.config.js
@@ -100,11 +100,11 @@ module.exports = {
 
           versions: {
               current: {
-                  label: '0.6.x',
-                  path: '0.6.x'
+                  label: '0.6.x'
               },
               '0.5.x': {
-                  label: '0.5.x'
+                  label: '0.5.x',
+                  path: '0.5.x'
               }
           }
         },

From 252fd5e214d33fd5ea42b0f638931c99caf1e7dc Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Mon, 21 Aug 2023 20:03:47 +0200
Subject: [PATCH 190/245] Update zio, zio-streams, zio-test, ... to 2.0.16
 (#545)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index b8d06c8c3..6714508d5 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
-  val zio  = "2.0.15"
+  val zio  = "2.0.16"
   val grpc = "1.47.0"
 }

From 0f609d711ba4cfea0f453c87a2fff63c22b318c4 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 26 Aug 2023 07:02:56 +0200
Subject: [PATCH 191/245] Update sbt to 1.9.4 (#549)

---
 project/build.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/build.properties b/project/build.properties
index 52413ab79..304098715 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=1.9.3
+sbt.version=1.9.4

From fc435e4e92c124b71dc4aeb2338053d1f4796c60 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 9 Sep 2023 05:53:44 +0200
Subject: [PATCH 192/245] Update scala3-library, ... to 3.3.1 (#550)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index 1b5e5506d..79ce5a718 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,7 +1,7 @@
 import Settings.stdSettings
 import org.scalajs.linker.interface.ModuleInitializer
 
-val Scala3 = "3.3.0"
+val Scala3 = "3.3.1"
 
 val Scala213 = "2.13.10"
 

From 9a804c88304175639d21c8ab931a43b4597f994c Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 9 Sep 2023 06:15:45 +0200
Subject: [PATCH 193/245] Update sbt-scalafmt to 2.5.2 (#551)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index e5e56e751..f018aa46c 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
 libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.13"
 
-addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.0")
+addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
 
 addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12")
 

From 5c218c507f46b4de69b2343bd13c5be7aad3b124 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sun, 17 Sep 2023 03:06:02 +0200
Subject: [PATCH 194/245] Update zio, zio-streams, zio-test, ... to 2.0.17
 (#553)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 6714508d5..3c1ab543d 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
-  val zio  = "2.0.16"
+  val zio  = "2.0.17"
   val grpc = "1.47.0"
 }

From 8a01e3cde9e891a9bac5ddb37ebb6344f05ac044 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 20 Sep 2023 22:03:13 +0200
Subject: [PATCH 195/245] Update playwright to 1.38.0 (#556)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index 79ce5a718..394371477 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.37.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.38.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From db1007746cb376ebeaca189bd13f6d7a3ad301eb Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 26 Sep 2023 20:54:57 +0200
Subject: [PATCH 196/245] Update zio, zio-streams, zio-test, ... to 2.0.18
 (#557)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 3c1ab543d..c511082bd 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
-  val zio  = "2.0.17"
+  val zio  = "2.0.18"
   val grpc = "1.47.0"
 }

From 388ab4d9ad2e27412148b396e88d64cb28a8916f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 6 Oct 2023 13:30:15 -0700
Subject: [PATCH 197/245] Bump postcss from 8.4.14 to 8.4.31 in /website (#558)

Bumps [postcss](https://github.com/postcss/postcss) from 8.4.14 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.14...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 website/yarn.lock | 27 +++++++++------------------
 1 file changed, 9 insertions(+), 18 deletions(-)

diff --git a/website/yarn.lock b/website/yarn.lock
index 919c83d46..ba7ecb76f 100644
--- a/website/yarn.lock
+++ b/website/yarn.lock
@@ -6199,10 +6199,10 @@ multicast-dns@^7.2.4:
     dns-packet "^5.2.2"
     thunky "^1.0.2"
 
-nanoid@^3.3.4:
-  version "3.3.4"
-  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
-  integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+nanoid@^3.3.6:
+  version "3.3.6"
+  resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
+  integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
 
 negotiator@0.6.3:
   version "0.6.3"
@@ -6862,21 +6862,12 @@ postcss-zindex@^5.1.0:
   resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff"
   integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==
 
-postcss@^8.3.11, postcss@^8.4.7:
-  version "8.4.14"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf"
-  integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
+postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.7:
+  version "8.4.31"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
+  integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
   dependencies:
-    nanoid "^3.3.4"
-    picocolors "^1.0.0"
-    source-map-js "^1.0.2"
-
-postcss@^8.4.14, postcss@^8.4.17:
-  version "8.4.19"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc"
-  integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==
-  dependencies:
-    nanoid "^3.3.4"
+    nanoid "^3.3.6"
     picocolors "^1.0.0"
     source-map-js "^1.0.2"
 

From faf923df520b71ad342c7c136de8942d2a085634 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 17 Oct 2023 04:46:09 +0200
Subject: [PATCH 198/245] Update playwright to 1.39.0 (#559)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index 394371477..6e63b33f9 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.38.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.39.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From 3346d63a786f86301bfd68468aadd151b796656c Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 17 Oct 2023 04:54:33 +0200
Subject: [PATCH 199/245] Update mdoc, sbt-mdoc to 2.3.8 (#560)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index f018aa46c..969ce1ffd 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
-addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.7")
+addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.8")
 
 addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1")

From 5b7cc3ce408945d563db1673ce9513f4d1ccd184 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Thu, 19 Oct 2023 02:45:03 +0200
Subject: [PATCH 200/245] Update mdoc, sbt-mdoc to 2.4.0 (#563)

---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index 969ce1ffd..d6ad9535c 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
-addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.8")
+addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.4.0")
 
 addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1")

From 24c6a96c68cac5fb7c78bcd038959aa031e8d712 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Thu, 19 Oct 2023 02:55:36 +0200
Subject: [PATCH 201/245] Update compilerplugin, scalapb-runtime, ... to
 0.11.14 (#562)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index d6ad9535c..5425ffcb1 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -2,7 +2,7 @@ ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.13"
+libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.11.14"
 
 addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
 

From e17e1bad41bcf0a5eeb60eb0cb7c581d991cba0c Mon Sep 17 00:00:00 2001
From: kenji yoshida <6b656e6a69@gmail.com>
Date: Thu, 19 Oct 2023 23:26:08 +0900
Subject: [PATCH 202/245] add dependabot.yml (#564)

---
 .github/dependabot.yml | 6 ++++++
 1 file changed, 6 insertions(+)
 create mode 100644 .github/dependabot.yml

diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000..5ace4600a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,6 @@
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "weekly"

From b80b3ee7eda8c0ca486067295351725b51681813 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 25 Oct 2023 06:51:16 +0200
Subject: [PATCH 203/245] Update sbt to 1.9.7 (#566)

---
 project/build.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/build.properties b/project/build.properties
index 304098715..e8a1e246e 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=1.9.4
+sbt.version=1.9.7

From b5d675fa5b522006985f2d075389563902ecddd4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 29 Oct 2023 18:59:16 -0700
Subject: [PATCH 204/245] Bump actions/setup-node from 3 to 4 (#568)

Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 4.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/ci.yml      | 2 +-
 .github/workflows/release.yml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 0e0dbb2f1..f0eedb907 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -19,7 +19,7 @@ jobs:
           distribution: temurin
           cache: sbt
     - name: Set up node.js
-      uses: actions/setup-node@v3
+      uses: actions/setup-node@v4
       with:
           node-version: "18.16.1"
 
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8dbba11c2..629050043 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -10,7 +10,7 @@ jobs:
     - uses: actions/checkout@v3
       with:
         fetch-depth: 0
-    - uses: actions/setup-node@v3
+    - uses: actions/setup-node@v4
       with:
         node-version: '16.x'
     - name: Set up JDK 8

From 3d928a018a201420bcf114cbcb375e59142fcb3b Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Mon, 6 Nov 2023 21:30:32 +0100
Subject: [PATCH 205/245] Update zio, zio-streams, zio-test-sbt to 2.0.19
 (#569)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index c511082bd..4f11f445d 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
-  val zio  = "2.0.18"
+  val zio  = "2.0.19"
   val grpc = "1.47.0"
 }

From b87082a98b950eab319d96e561da966efbef1a86 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 8 Nov 2023 06:06:40 +0100
Subject: [PATCH 206/245] Update mdoc, sbt-mdoc to 2.5.0 (#570)

---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index 5425ffcb1..4dd5c7f0a 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
-addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.4.0")
+addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.0")
 
 addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1")

From 940f8939471292ac8f1802e12e87b141f79ed6f5 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 11 Nov 2023 23:08:27 +0100
Subject: [PATCH 207/245] Update mdoc, sbt-mdoc to 2.5.1 (#571)

---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index 4dd5c7f0a..d033bee28 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
-addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.0")
+addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.1")
 
 addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1")

From 0e431ca445988036fd6ba041e3b25c96af80bd1b Mon Sep 17 00:00:00 2001
From: Adriani Furtado <36544115+Adriani277@users.noreply.github.com>
Date: Thu, 16 Nov 2023 16:39:36 +0000
Subject: [PATCH 208/245] bumped grpc version (#573)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 4f11f445d..7eea2270c 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.19"
-  val grpc = "1.47.0"
+  val grpc = "1.54.2"
 }

From 41af25e68aca0ac1c963168f0a3dbe224873e3cb Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 18 Nov 2023 02:41:09 +0100
Subject: [PATCH 209/245] Update grpc-netty, grpc-services to 1.59.0 (#575)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 7eea2270c..3754f28f8 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.19"
-  val grpc = "1.54.2"
+  val grpc = "1.59.0"
 }

From e26113ae5f188e5c554b61b815d93b9893dd33ba Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Fri, 17 Nov 2023 19:14:11 -0800
Subject: [PATCH 210/245] Update Java version to 11

---
 .github/workflows/release.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 629050043..180e4bbde 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -13,10 +13,10 @@ jobs:
     - uses: actions/setup-node@v4
       with:
         node-version: '16.x'
-    - name: Set up JDK 8
+    - name: Set up JDK 11
       uses: actions/setup-java@v3
       with:
-          java-version: 8
+          java-version: 11
           distribution: temurin
           cache: sbt
     - name: Update docs

From da050c1e47fb07f0fb9773d39ce8a346f5045c79 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 21 Nov 2023 21:17:51 +0100
Subject: [PATCH 211/245] Update playwright to 1.40.0 (#579)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index 6e63b33f9..032707c83 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.39.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.40.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From d1931d8bd4bbbd2369ae9db2c74bba843e265fd2 Mon Sep 17 00:00:00 2001
From: Pierre Ricadat 
Date: Wed, 22 Nov 2023 08:05:42 +0900
Subject: [PATCH 212/245] Only buffer stream if queue size is positive (#578)

---
 .../scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala
index ebb3f8a8a..67417bb19 100644
--- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala
+++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ZServerCallHandler.scala
@@ -122,7 +122,7 @@ object ZServerCallHandler {
 
     for {
       queueSize <- backpressureQueueSize
-      _         <- stream.buffer(queueSize).run(backpressureSink)
+      _         <- (if (queueSize > 0) stream.buffer(queueSize) else stream).run(backpressureSink)
     } yield ()
   }
 }

From 9e4f16c951b18406e74df42081172bc8b81f4143 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 21 Nov 2023 15:30:59 -0800
Subject: [PATCH 213/245] Bump actions/checkout from 3 to 4 (#565)

Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 .github/workflows/ci.yml      | 2 +-
 .github/workflows/release.yml | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f0eedb907..08bef604b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -10,7 +10,7 @@ jobs:
     runs-on: ubuntu-latest
 
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
 
     - name: Set up JDK 8
       uses: actions/setup-java@v3
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 180e4bbde..9892e312b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,7 @@ jobs:
   publish:
     runs-on: ubuntu-latest
     steps:
-    - uses: actions/checkout@v3
+    - uses: actions/checkout@v4
       with:
         fetch-depth: 0
     - uses: actions/setup-node@v4

From 65605a8005f85f5772c357b5aa7592d37096e6e8 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 21 Nov 2023 15:31:14 -0800
Subject: [PATCH 214/245] Bump @babel/traverse from 7.18.0 to 7.23.2 in
 /website (#561)

Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.18.0 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] 
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 website/yarn.lock | 153 ++++++++++++++++++++++++++++++++++++----------
 1 file changed, 121 insertions(+), 32 deletions(-)

diff --git a/website/yarn.lock b/website/yarn.lock
index ba7ecb76f..87b537f34 100644
--- a/website/yarn.lock
+++ b/website/yarn.lock
@@ -256,6 +256,14 @@
   dependencies:
     "@babel/highlight" "^7.18.6"
 
+"@babel/code-frame@^7.22.13":
+  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/compat-data@^7.13.11", "@babel/compat-data@^7.17.10":
   version "7.17.10"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab"
@@ -339,7 +347,7 @@
     "@jridgewell/gen-mapping" "^0.3.0"
     jsesc "^2.5.1"
 
-"@babel/generator@^7.18.7", "@babel/generator@^7.20.1", "@babel/generator@^7.20.2":
+"@babel/generator@^7.18.7", "@babel/generator@^7.20.2":
   version "7.20.4"
   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8"
   integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==
@@ -348,6 +356,16 @@
     "@jridgewell/gen-mapping" "^0.3.2"
     jsesc "^2.5.1"
 
+"@babel/generator@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
+  integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
+  dependencies:
+    "@babel/types" "^7.23.0"
+    "@jridgewell/gen-mapping" "^0.3.2"
+    "@jridgewell/trace-mapping" "^0.3.17"
+    jsesc "^2.5.1"
+
 "@babel/helper-annotate-as-pure@^7.16.7":
   version "7.16.7"
   resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862"
@@ -478,6 +496,11 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
   integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
 
+"@babel/helper-environment-visitor@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+  integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
 "@babel/helper-explode-assignable-expression@^7.16.7":
   version "7.16.7"
   resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a"
@@ -508,6 +531,14 @@
     "@babel/template" "^7.18.10"
     "@babel/types" "^7.19.0"
 
+"@babel/helper-function-name@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+  integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+  dependencies:
+    "@babel/template" "^7.22.15"
+    "@babel/types" "^7.23.0"
+
 "@babel/helper-hoist-variables@^7.16.7":
   version "7.16.7"
   resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
@@ -522,6 +553,13 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
+"@babel/helper-hoist-variables@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+  integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
 "@babel/helper-member-expression-to-functions@^7.16.7", "@babel/helper-member-expression-to-functions@^7.17.7":
   version "7.17.7"
   resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4"
@@ -690,11 +728,23 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
+"@babel/helper-split-export-declaration@^7.22.6":
+  version "7.22.6"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+  integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
 "@babel/helper-string-parser@^7.19.4":
   version "7.19.4"
   resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
   integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
 
+"@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.16.7":
   version "7.16.7"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
@@ -705,6 +755,11 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
   integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
 
+"@babel/helper-validator-identifier@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+  integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
 "@babel/helper-validator-option@^7.16.7":
   version "7.16.7"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
@@ -771,16 +826,30 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
+"@babel/highlight@^7.22.13":
+  version "7.22.20"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
+  integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.22.20"
+    chalk "^2.4.2"
+    js-tokens "^4.0.0"
+
 "@babel/parser@^7.12.7", "@babel/parser@^7.16.7", "@babel/parser@^7.18.0":
   version "7.18.0"
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.0.tgz#10a8d4e656bc01128d299a787aa006ce1a91e112"
   integrity sha512-AqDccGC+m5O/iUStSJy3DGRIUFu7WbY/CppZYwrEUB4N0tZlnI8CSTsgL7v5fHVFmUbRv2sd+yy27o8Ydt4MGg==
 
-"@babel/parser@^7.18.10", "@babel/parser@^7.18.8", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2":
+"@babel/parser@^7.18.10", "@babel/parser@^7.18.8", "@babel/parser@^7.20.2":
   version "7.20.3"
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2"
   integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==
 
+"@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
+  integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
+
 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
   version "7.17.12"
   resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e"
@@ -2086,35 +2155,28 @@
     "@babel/parser" "^7.18.10"
     "@babel/types" "^7.18.10"
 
-"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0":
-  version "7.18.0"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.0.tgz#0e5ec6db098660b2372dd63d096bf484e32d27ba"
-  integrity sha512-oNOO4vaoIQoGjDQ84LgtF/IAlxlyqL4TUuoQ7xLkQETFaHkY1F7yazhB4Kt3VcZGL0ZF/jhrEpnXqUb0M7V3sw==
-  dependencies:
-    "@babel/code-frame" "^7.16.7"
-    "@babel/generator" "^7.18.0"
-    "@babel/helper-environment-visitor" "^7.16.7"
-    "@babel/helper-function-name" "^7.17.9"
-    "@babel/helper-hoist-variables" "^7.16.7"
-    "@babel/helper-split-export-declaration" "^7.16.7"
-    "@babel/parser" "^7.18.0"
-    "@babel/types" "^7.18.0"
-    debug "^4.1.0"
-    globals "^11.1.0"
-
-"@babel/traverse@^7.18.8", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1":
-  version "7.20.1"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8"
-  integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==
-  dependencies:
-    "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.20.1"
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-function-name" "^7.19.0"
-    "@babel/helper-hoist-variables" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/parser" "^7.20.1"
-    "@babel/types" "^7.20.0"
+"@babel/template@^7.22.15":
+  version "7.22.15"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
+  integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
+  dependencies:
+    "@babel/code-frame" "^7.22.13"
+    "@babel/parser" "^7.22.15"
+    "@babel/types" "^7.22.15"
+
+"@babel/traverse@^7.12.9", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.8", "@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1":
+  version "7.23.2"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
+  integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
+  dependencies:
+    "@babel/code-frame" "^7.22.13"
+    "@babel/generator" "^7.23.0"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-hoist-variables" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/parser" "^7.23.0"
+    "@babel/types" "^7.23.0"
     debug "^4.1.0"
     globals "^11.1.0"
 
@@ -2135,6 +2197,15 @@
     "@babel/helper-validator-identifier" "^7.19.1"
     to-fast-properties "^2.0.0"
 
+"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
+  integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
+  dependencies:
+    "@babel/helper-string-parser" "^7.22.5"
+    "@babel/helper-validator-identifier" "^7.22.20"
+    to-fast-properties "^2.0.0"
+
 "@colors/colors@1.5.0":
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
@@ -2605,6 +2676,11 @@
   resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
   integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
 
+"@jridgewell/resolve-uri@^3.1.0":
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
+  integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+
 "@jridgewell/set-array@^1.0.0":
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea"
@@ -2628,6 +2704,11 @@
   resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
   integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
 
+"@jridgewell/sourcemap-codec@^1.4.14":
+  version "1.4.15"
+  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+  integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
 "@jridgewell/trace-mapping@^0.3.14":
   version "0.3.17"
   resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985"
@@ -2636,6 +2717,14 @@
     "@jridgewell/resolve-uri" "3.1.0"
     "@jridgewell/sourcemap-codec" "1.4.14"
 
+"@jridgewell/trace-mapping@^0.3.17":
+  version "0.3.20"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
+  integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.1.0"
+    "@jridgewell/sourcemap-codec" "^1.4.14"
+
 "@jridgewell/trace-mapping@^0.3.9":
   version "0.3.14"
   resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
@@ -3792,7 +3881,7 @@ ccount@^1.0.0:
   resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043"
   integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==
 
-chalk@^2.0.0:
+chalk@^2.0.0, 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==

From 82ad91a63f93dd0232bf4eff7889b58cc5f5d300 Mon Sep 17 00:00:00 2001
From: Pierre Ricadat 
Date: Wed, 22 Nov 2023 11:38:53 +0900
Subject: [PATCH 215/245] Update backpressure docs (#580)

---
 docs/backpressure.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/backpressure.md b/docs/backpressure.md
index 63b66a070..1afc90e8b 100644
--- a/docs/backpressure.md
+++ b/docs/backpressure.md
@@ -6,4 +6,4 @@ custom_edit_url: https://github.com/scalapb/zio-grpc/edit/master/docs/backpressu
 
 From version 0.5.3 onwards, zio-grpc provides backpressure support for server
 streaming RPCs. In case the call is not capable to sending additional messages
-without buffering (as determined by [`ServerCall.isReady`](https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerCall.html#isReady])), sending messages from the queue associated with server response `Stream` will stop. The default size of this queue is `16`,  and can be configured by setting the system property `zio_grpc.backpressure_queue_size` or the environment variable `ZIO_GRPC_BACKPRESSURE_QUEUE_SIZE`.
+without buffering (as determined by [`ServerCall.isReady`](https://grpc.github.io/grpc-java/javadoc/io/grpc/ServerCall.html#isReady])), sending messages from the queue associated with server response `Stream` will stop. The default size of this queue is `16`,  and can be configured by setting the system property `zio_grpc.backpressure_queue_size` or the environment variable `ZIO_GRPC_BACKPRESSURE_QUEUE_SIZE`. Setting the value to `0` or a negative number will disable buffering but keep the back pressure at the chunk level (`isReady` will be checked after processing each chunk instead of each message).

From a3af452f6a0dfa52cc9ffb69e52fb403365676b7 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 29 Nov 2023 21:50:46 +0100
Subject: [PATCH 216/245] Update grpc-netty, grpc-services to 1.59.1 (#582)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 3754f28f8..2f96da68c 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.19"
-  val grpc = "1.59.0"
+  val grpc = "1.59.1"
 }

From 3119973511aa95bd7a4218287ce5f7f921ea0853 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 5 Dec 2023 21:30:51 +0100
Subject: [PATCH 217/245] Update grpc-netty, grpc-services to 1.60.0 (#584)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 2f96da68c..8597f62ff 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.19"
-  val grpc = "1.59.1"
+  val grpc = "1.60.0"
 }

From 9bbe90caba6acc6181d4c62fd95105ddf7f70b11 Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Tue, 9 Jan 2024 20:06:19 -0800
Subject: [PATCH 218/245] changelog updates

---
 CHANGELOG.md | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 289e36a3f..af94ccec5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,9 @@
 # Changelog
 
-## [Unreleased - 0.6.0](https://github.com/ScalaPB/zio-grpc/tree/HEAD)
+## 0.6.1
+* Only buffer stream if queue size is positive (#578, #580)
+
+## 0.6.0
 
 ### What changed?
 

From c65a30503186cd6ee014b84091e11f35a01dd668 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 13 Jan 2024 10:19:54 +0100
Subject: [PATCH 219/245] Update zio, zio-streams, zio-test, ... to 2.0.21
 (#587)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 8597f62ff..5cc133ae2 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
-  val zio  = "2.0.19"
+  val zio  = "2.0.21"
   val grpc = "1.60.0"
 }

From 317f0d222162946e94202fe123b3d9e0c2679040 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 13 Jan 2024 10:35:27 +0100
Subject: [PATCH 220/245] Update sbt-projectmatrix to 0.9.2 (#586)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index d033bee28..8fef356a7 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -20,4 +20,4 @@ addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
 addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.1")
 
-addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1")
+addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.2")

From f124486fb0d63690f77be503bf2153d38018b0a0 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 13 Jan 2024 10:44:20 +0100
Subject: [PATCH 221/245] Update sbt to 1.9.8 (#589)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/build.properties | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/build.properties b/project/build.properties
index e8a1e246e..abbbce5da 100644
--- a/project/build.properties
+++ b/project/build.properties
@@ -1 +1 @@
-sbt.version=1.9.7
+sbt.version=1.9.8

From 5485feaa2be541218dbc2eb2e0af9af50e24e913 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 13 Jan 2024 10:50:32 +0100
Subject: [PATCH 222/245] Update mdoc, sbt-mdoc to 2.5.2 (#590)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index 8fef356a7..4637101da 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -18,6 +18,6 @@ addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
-addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.1")
+addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.2")
 
 addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.2")

From 091e87cd8e76c5504d7ccb16ebf5be8d9e349855 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Mon, 15 Jan 2024 00:21:43 +0100
Subject: [PATCH 223/245] Update grpc-netty, grpc-services to 1.60.1 (#588)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 5cc133ae2..7878a1448 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.21"
-  val grpc = "1.60.0"
+  val grpc = "1.60.1"
 }

From 285cfdda895f0a7b27affe513687d702a450d401 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Mon, 15 Jan 2024 17:12:58 +0100
Subject: [PATCH 224/245] Update grpc-netty, grpc-services to 1.61.0 (#591)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 7878a1448..3c34298fc 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.21"
-  val grpc = "1.60.1"
+  val grpc = "1.61.0"
 }

From a14ee1888616a3b197ab4b2c356282dee2162812 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Thu, 18 Jan 2024 21:03:40 +0100
Subject: [PATCH 225/245] Update playwright to 1.41.0 (#593)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index 032707c83..faa5596d0 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.40.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.41.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From 002aae22513940fa604719c3d305f35eef4db222 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Fri, 26 Jan 2024 20:07:32 +0100
Subject: [PATCH 226/245] Update playwright to 1.41.1 (#597)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index faa5596d0..ed7c6fc4f 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.41.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.41.1"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From 2f008317348a6ad5493636148881af070e7f180f Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 20 Feb 2024 07:25:09 +0100
Subject: [PATCH 227/245] Update playwright to 1.41.2 (#600)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index ed7c6fc4f..f13d40fbc 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.41.1"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.41.2"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From e5d92a6bf98cf04156034a5e7cacf748b0e73d8e Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 20 Feb 2024 07:37:11 +0100
Subject: [PATCH 228/245] Update grpc-netty, grpc-services to 1.61.1 (#601)

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 3c34298fc..b41871683 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.21"
-  val grpc = "1.61.0"
+  val grpc = "1.61.1"
 }

From 08d80769ccdb007b234b866345c1743dace6f3a7 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 28 Feb 2024 05:42:03 +0100
Subject: [PATCH 229/245] Update grpc-netty, grpc-services to 1.62.2 (#603)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index b41871683..5348652c8 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.21"
-  val grpc = "1.61.1"
+  val grpc = "1.62.2"
 }

From 72b7d983ee5b86b1173243ae073503bf679de8b3 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sun, 3 Mar 2024 01:00:58 +0100
Subject: [PATCH 230/245] Update sbt-projectmatrix to 0.10.0 (#606)

---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index 4637101da..a1b8217d3 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -20,4 +20,4 @@ addSbtPlugin("com.thesamet" % "sbt-protoc-gen-project" % "0.1.8")
 
 addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.5.2")
 
-addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.2")
+addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.10.0")

From dc293929f8fb5a2b6eda0924658d9e4d6a925428 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Tue, 12 Mar 2024 21:14:14 +0100
Subject: [PATCH 231/245] Update playwright to 1.42.0 (#609)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index f13d40fbc..bab867792 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.41.2"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.42.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From f4725c431969afe7b0ce99d9a12acda858397e68 Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Sun, 17 Mar 2024 17:49:50 -0700
Subject: [PATCH 232/245] Update zio-grpc in examples

---
 examples/fullapp/project/plugins.sbt    | 2 +-
 examples/helloworld/project/plugins.sbt | 2 +-
 examples/routeguide/project/plugins.sbt | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt
index 77d8bd039..aca59b2e5 100644
--- a/examples/fullapp/project/plugins.sbt
+++ b/examples/fullapp/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-val zioGrpcVersion = "0.6.0-rc6"
+val zioGrpcVersion = "0.6.1"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt
index 51e34ccab..c49988742 100644
--- a/examples/helloworld/project/plugins.sbt
+++ b/examples/helloworld/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-val zioGrpcVersion = "0.6.0-rc6"
+val zioGrpcVersion = "0.6.1"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt
index 51e34ccab..c49988742 100644
--- a/examples/routeguide/project/plugins.sbt
+++ b/examples/routeguide/project/plugins.sbt
@@ -4,7 +4,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
 addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
 
-val zioGrpcVersion = "0.6.0-rc6"
+val zioGrpcVersion = "0.6.1"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,

From a001c4823939e6344ee1edcef3d8c869396b39d0 Mon Sep 17 00:00:00 2001
From: Pierre Ricadat 
Date: Wed, 20 Mar 2024 13:09:25 +0900
Subject: [PATCH 233/245] Don't block threads when interrupting fibers (#612)

---
 .../scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala
index 09555a96d..5a775698b 100644
--- a/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala
+++ b/core/src/main/scalajvm/scalapb/zio_grpc/server/ListenerDriver.scala
@@ -40,7 +40,7 @@ object ListenerDriver {
         new Listener[Req] {
           override def onCancel(): Unit =
             Unsafe.unsafe { implicit u =>
-              runtime.unsafe.run(fiber.interrupt.unit).getOrThrowFiberFailure()
+              runtime.unsafe.run(fiber.interruptFork.unit).getOrThrowFiberFailure()
             }
 
           override def onHalfClose(): Unit =
@@ -122,7 +122,7 @@ object ListenerDriver {
         new Listener[Req] {
           override def onCancel(): Unit =
             Unsafe.unsafe { implicit u =>
-              runtime.unsafe.run(fiber.interrupt.unit).getOrThrowFiberFailure()
+              runtime.unsafe.run(fiber.interruptFork.unit).getOrThrowFiberFailure()
             }
 
           override def onHalfClose(): Unit =

From eb0d9ff2895fae62e9203e63bfdbda36b49e625c Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 20 Mar 2024 20:37:55 +0100
Subject: [PATCH 234/245] Update sbt-buildinfo to 0.12.0 (#613)

---
 project/plugins.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index a1b8217d3..f0078b0e7 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -8,7 +8,7 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2")
 
 addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12")
 
-addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.11.0")
+addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0")
 
 addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0")
 

From 4cc9ce5a5ae5d642d2ea7abd4da9e7c46d4c287c Mon Sep 17 00:00:00 2001
From: Pierre Ricadat 
Date: Sun, 24 Mar 2024 12:05:16 +0900
Subject: [PATCH 235/245] Suspend the creation of Metadata in make with pairs
 (#614)

---
 .../scalajvm/scalapb/zio_grpc/SafeMetadata.scala    | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala b/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala
index d2c3f089c..6a769cffd 100644
--- a/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala
+++ b/core/src/main/scalajvm/scalapb/zio_grpc/SafeMetadata.scala
@@ -37,13 +37,14 @@ final class SafeMetadata private (
 object SafeMetadata {
   def make: UIO[SafeMetadata] = fromMetadata(new Metadata)
 
-  def make(pairs: (String, String)*): UIO[SafeMetadata] = {
-    val md = new Metadata
-    pairs.foreach { case (key, value) =>
-      md.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value)
+  def make(pairs: (String, String)*): UIO[SafeMetadata] =
+    ZIO.suspendSucceed {
+      val md = new Metadata
+      pairs.foreach { case (key, value) =>
+        md.put(Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER), value)
+      }
+      SafeMetadata.fromMetadata(md)
     }
-    SafeMetadata.fromMetadata(md)
-  }
 
   /** Creates a new SafeMetadata by taking ownership of the given metadata. The provided metadata should not be used
     * after calling this method.

From 72d8159d0fa62619bce1b8780e532735ade67c32 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Mon, 8 Apr 2024 21:36:28 +0200
Subject: [PATCH 236/245] Update grpc-netty, grpc-services to 1.63.0 (#616)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 5348652c8..37a7ffe85 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.21"
-  val grpc = "1.62.2"
+  val grpc = "1.63.0"
 }

From c09b79e21ff4424236c2c59b26d92850649fa9d6 Mon Sep 17 00:00:00 2001
From: Pierre Ricadat 
Date: Tue, 9 Apr 2024 10:38:58 +0900
Subject: [PATCH 237/245] Don't use private[this] in generated code (#615)

---
 .../src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
index eb8da7997..6947b2cfb 100644
--- a/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
+++ b/code-gen/src/main/scala/scalapb/zio_grpc/ZioCodeGenerator.scala
@@ -431,7 +431,7 @@ class ZioFilePrinter(
         )
         .indent
         .add(
-          s"private[this] class ServiceStub(channel: $ZChannel, transforms: $ClientTransform)"
+          s"private class ServiceStub(channel: $ZChannel, transforms: $ClientTransform)"
         )
         .add(s"    extends ${clientWithResponseMetadataServiceName.name} {")
         .indented(
@@ -513,7 +513,7 @@ class ZioFilePrinter(
         .indent
         .add("")
         .add(
-          s"private[this] class ServiceStub(underlying: ${clientWithResponseMetadataServiceName.name})"
+          s"private class ServiceStub(underlying: ${clientWithResponseMetadataServiceName.name})"
         )
         .add(s"    extends ${clientServiceName.name} {")
         .indented(

From 9d8bdc0feff81dea09585f23d0f2307d4d664890 Mon Sep 17 00:00:00 2001
From: Pierre Ricadat 
Date: Thu, 11 Apr 2024 21:54:20 +0900
Subject: [PATCH 238/245] Optimize client calls (#618)

* Optimize client calls

* Fix

* Use ZStream.execute
---
 .../scalapb/zio_grpc/client/ClientCalls.scala | 62 ++++++++-----------
 1 file changed, 25 insertions(+), 37 deletions(-)

diff --git a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala
index d785a9d80..cbdd1fde9 100644
--- a/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala
+++ b/core/src/main/scalajvm/scalapb/zio_grpc/client/ClientCalls.scala
@@ -42,14 +42,12 @@ object ClientCalls {
           StreamingClientCallListener.make[Res](call)
         )(anyExitHandler[Req, Res](call))
         .flatMap { (listener: StreamingClientCallListener[Res]) =>
-          ZStream
-            .fromZIO(
-              call.start(listener, headers) *>
-                call.request(1) *>
-                call.sendMessage(req) *>
-                call.halfClose()
-            )
-            .drain ++ listener.stream
+          ZStream.unwrap(
+            (call.start(listener, headers) *>
+              call.request(1) *>
+              call.sendMessage(req) *>
+              call.halfClose()).as(listener.stream)
+          )
         }
 
     def serverStreamingCall[Req, Res](
@@ -59,9 +57,11 @@ object ClientCalls {
         headers: SafeMetadata,
         req: Req
     ): ZStream[Any, StatusException, ResponseFrame[Res]] =
-      ZStream
-        .fromZIO(channel.newCall(method, options))
-        .flatMap(serverStreamingCall(_, headers, req))
+      ZStream.unwrap(
+        channel
+          .newCall(method, options)
+          .map(serverStreamingCall(_, headers, req))
+      )
 
     private def clientStreamingCall[Req, Res](
         call: ZClientCall[Req, Res],
@@ -69,15 +69,13 @@ object ClientCalls {
         req: ZStream[Any, StatusException, Req]
     ): IO[StatusException, ResponseContext[Res]] =
       ZIO.acquireReleaseExitWith(UnaryClientCallListener.make[Res])(exitHandler(call)) { listener =>
-        val callStream   = req.tap(call.sendMessage).drain ++ ZStream.fromZIO(call.halfClose()).drain
-        val resultStream = ZStream.fromZIO(listener.getValue)
+        val processRequestStream = req.runForeach(call.sendMessage) *> call.halfClose()
+        val getResult            = listener.getValue
 
         call.start(listener, headers) *>
           call.request(1) *>
-          callStream
-            .merge(resultStream)
-            .runCollect
-            .map(res => res.last)
+          processRequestStream &>
+          getResult
       }
 
     def clientStreamingCall[Req, Res](
@@ -89,13 +87,7 @@ object ClientCalls {
     ): IO[StatusException, ResponseContext[Res]] =
       channel
         .newCall(method, options)
-        .flatMap(
-          clientStreamingCall(
-            _,
-            headers,
-            req
-          )
-        )
+        .flatMap(clientStreamingCall(_, headers, req))
 
     private def bidiCall[Req, Res](
         call: ZClientCall[Req, Res],
@@ -107,14 +99,10 @@ object ClientCalls {
           StreamingClientCallListener.make[Res](call)
         )(anyExitHandler(call))
         .flatMap { (listener: StreamingClientCallListener[Res]) =>
-          val init              =
-            ZStream
-              .fromZIO(
-                call.start(listener, headers) *>
-                  call.request(1)
-              )
-          val finish            = ZStream.fromZIO(call.halfClose())
-          val sendRequestStream = (init ++ req.tap(call.sendMessage) ++ finish).drain
+          val init              = call.start(listener, headers) *> call.request(1)
+          val process           = req.runForeach(call.sendMessage)
+          val finish            = call.halfClose()
+          val sendRequestStream = ZStream.execute(init *> process *> finish)
           sendRequestStream.merge(listener.stream, ZStream.HaltStrategy.Right)
         }
 
@@ -125,11 +113,11 @@ object ClientCalls {
         headers: SafeMetadata,
         req: ZStream[Any, StatusException, Req]
     ): ZStream[Any, StatusException, ResponseFrame[Res]] =
-      ZStream
-        .fromZIO(
-          channel.newCall(method, options)
-        )
-        .flatMap(bidiCall(_, headers, req))
+      ZStream.unwrap(
+        channel
+          .newCall(method, options)
+          .map(bidiCall(_, headers, req))
+      )
   }
 
   def exitHandler[Req, Res](

From b7f79d97f5b08a9bd02df51426dd78dd806a485d Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Sat, 13 Apr 2024 19:30:09 +0200
Subject: [PATCH 239/245] Update zio, zio-streams, zio-test, ... to 2.0.22
 (#621)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index 37a7ffe85..c2c305263 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
-  val zio  = "2.0.21"
+  val zio  = "2.0.22"
   val grpc = "1.63.0"
 }

From 6608744394e182d9b3cc84cb62b942b185a6531e Mon Sep 17 00:00:00 2001
From: Nadav Samet 
Date: Tue, 7 May 2024 08:39:27 -0700
Subject: [PATCH 240/245] Update versions

---
 build.sbt           | 4 ++--
 project/plugins.sbt | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/build.sbt b/build.sbt
index bab867792..a27234e45 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,9 +1,9 @@
 import Settings.stdSettings
 import org.scalajs.linker.interface.ModuleInitializer
 
-val Scala3 = "3.3.1"
+val Scala3 = "3.3.3"
 
-val Scala213 = "2.13.10"
+val Scala213 = "2.13.14"
 
 val Scala212 = "2.12.18"
 
diff --git a/project/plugins.sbt b/project/plugins.sbt
index f0078b0e7..2db2c5906 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -10,7 +10,7 @@ addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12")
 
 addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.12.0")
 
-addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0")
+addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0")
 
 addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0")
 

From 25c467156110b11ee520d9925fbb7a50013c70eb Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 8 May 2024 07:41:31 +0200
Subject: [PATCH 241/245] Update scala3-library, ... to 3.4.1 (#624)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index a27234e45..bdd6b4809 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,7 +1,7 @@
 import Settings.stdSettings
 import org.scalajs.linker.interface.ModuleInitializer
 
-val Scala3 = "3.3.3"
+val Scala3 = "3.4.1"
 
 val Scala213 = "2.13.14"
 

From 1111e3a9392d9d0aee4c3557a74fada822833fe2 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Wed, 15 May 2024 22:34:58 +0200
Subject: [PATCH 242/245] Update grpc-netty, grpc-services to 1.64.0 (#627)

---
 project/Versions.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/project/Versions.scala b/project/Versions.scala
index c2c305263..ac4ae2c92 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -1,4 +1,4 @@
 object Version {
   val zio  = "2.0.22"
-  val grpc = "1.63.0"
+  val grpc = "1.64.0"
 }

From 4ed8cb761949c2b1dc23f2cf97148ab7c5b14aa2 Mon Sep 17 00:00:00 2001
From: Scala Steward <43047562+scala-steward@users.noreply.github.com>
Date: Fri, 17 May 2024 20:42:44 +0200
Subject: [PATCH 243/245] Update playwright to 1.44.0 (#628)

---
 build.sbt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index bdd6b4809..2a0ec57ba 100644
--- a/build.sbt
+++ b/build.sbt
@@ -181,7 +181,7 @@ lazy val e2eWeb =
       scalaVersions = ScalaVersions,
       settings = Seq(
         libraryDependencies ++= Seq(
-          "com.microsoft.playwright" % "playwright"   % "1.42.0"    % Test,
+          "com.microsoft.playwright" % "playwright"   % "1.44.0"    % Test,
           "dev.zio"                %%% "zio-test"     % Version.zio % Test,
           "dev.zio"                 %% "zio-test-sbt" % Version.zio % Test
         ),

From def8d5d99b51330627d7b0b4f84b887de5b03034 Mon Sep 17 00:00:00 2001
From: Alex Knight 
Date: Tue, 21 May 2024 14:58:07 +0100
Subject: [PATCH 244/245] Update examples dependencies & scala-version (#630)

* Update examples dependencies & scala-version

1. Scala Version `2.13.10` -> `2.13.14`
2. `grpc-netty` from `1.50.1` -> `1.64.0`
3. `zio-grpc-codegen` from `0.6.1` -> `0.6.2`
4. `sbt-protoc` from `1.0.6` -> `1.0.7`
5. (`scalapb`) `compilerplugin` from `0.11.10` -> `0.11.15`

* Update routeguide plugins.sbt (I forgot 'sbt-protoc' & 'zio-grpc-codegen')
---
 examples/fullapp/build.sbt              | 4 ++--
 examples/fullapp/project/plugins.sbt    | 8 ++++----
 examples/helloworld/build.sbt           | 4 ++--
 examples/helloworld/project/plugins.sbt | 6 +++---
 examples/routeguide/build.sbt           | 4 ++--
 examples/routeguide/project/plugins.sbt | 6 +++---
 6 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/examples/fullapp/build.sbt b/examples/fullapp/build.sbt
index af12cf361..99b551c8d 100644
--- a/examples/fullapp/build.sbt
+++ b/examples/fullapp/build.sbt
@@ -1,12 +1,12 @@
 ThisBuild / resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
-ThisBuild / scalaVersion := "2.13.10"
+ThisBuild / scalaVersion := "2.13.14"
 
 ThisBuild / cancelable := true
 
 ThisBuild / connectInput := true
 
-val grpcVersion = "1.50.1"
+val grpcVersion = "1.64.0"
 
 lazy val protos = crossProject(JSPlatform, JVMPlatform)
   .in(file("protos"))
diff --git a/examples/fullapp/project/plugins.sbt b/examples/fullapp/project/plugins.sbt
index aca59b2e5..2995f2c14 100644
--- a/examples/fullapp/project/plugins.sbt
+++ b/examples/fullapp/project/plugins.sbt
@@ -2,17 +2,17 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
 addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
-addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
+addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.7")
 
-val zioGrpcVersion = "0.6.1"
+val zioGrpcVersion = "0.6.2"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
-  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.7"
+  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.15"
 )
 
 // For Scala.js:
-addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0")
+addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0")
 
 addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0")
 
diff --git a/examples/helloworld/build.sbt b/examples/helloworld/build.sbt
index 37dac1276..b029b193e 100644
--- a/examples/helloworld/build.sbt
+++ b/examples/helloworld/build.sbt
@@ -1,8 +1,8 @@
-scalaVersion := "2.13.10"
+scalaVersion := "2.13.14"
 
 resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
-val grpcVersion = "1.50.1"
+val grpcVersion = "1.64.0"
 
 Compile / PB.targets := Seq(
   scalapb.gen(grpc = true) -> (Compile / sourceManaged).value,
diff --git a/examples/helloworld/project/plugins.sbt b/examples/helloworld/project/plugins.sbt
index c49988742..d6e7ee163 100644
--- a/examples/helloworld/project/plugins.sbt
+++ b/examples/helloworld/project/plugins.sbt
@@ -2,11 +2,11 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
 addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
-addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
+addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.7")
 
-val zioGrpcVersion = "0.6.1"
+val zioGrpcVersion = "0.6.2"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
-  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10"
+  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.15"
 )
diff --git a/examples/routeguide/build.sbt b/examples/routeguide/build.sbt
index 2447eaeac..9048a3e4f 100644
--- a/examples/routeguide/build.sbt
+++ b/examples/routeguide/build.sbt
@@ -1,8 +1,8 @@
-scalaVersion := "2.13.10"
+scalaVersion := "2.13.14"
 
 resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
-val grpcVersion = "1.50.1"
+val grpcVersion = "1.64.0"
 
 Compile / PB.targets := Seq(
   scalapb.gen(grpc = true) -> (Compile / sourceManaged).value,
diff --git a/examples/routeguide/project/plugins.sbt b/examples/routeguide/project/plugins.sbt
index c49988742..d6e7ee163 100644
--- a/examples/routeguide/project/plugins.sbt
+++ b/examples/routeguide/project/plugins.sbt
@@ -2,11 +2,11 @@ resolvers ++= Resolver.sonatypeOssRepos("snapshots")
 
 addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.3")
 
-addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.6")
+addSbtPlugin("com.thesamet" % "sbt-protoc" % "1.0.7")
 
-val zioGrpcVersion = "0.6.1"
+val zioGrpcVersion = "0.6.2"
 
 libraryDependencies ++= Seq(
   "com.thesamet.scalapb.zio-grpc" %% "zio-grpc-codegen" % zioGrpcVersion,
-  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.10"
+  "com.thesamet.scalapb" %% "compilerplugin" % "0.11.15"
 )

From dc2ce2af4a3222fa4a30d89d08e5fa788e3dc64a Mon Sep 17 00:00:00 2001
From: Georgi Krastev 
Date: Fri, 7 Jun 2024 10:20:47 +0300
Subject: [PATCH 245/245] Fix build to compile

---
 build.sbt | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/build.sbt b/build.sbt
index 2a0ec57ba..aee9d01e3 100644
--- a/build.sbt
+++ b/build.sbt
@@ -144,7 +144,15 @@ lazy val e2e =
     .in(file("e2e"))
     .dependsOn(core, e2eProtos)
     .defaultAxes()
-    .jvmPlatform(ScalaVersions)
+    .jvmPlatform(
+      ScalaVersions,
+      settings = Seq(
+        libraryDependencies ++= Seq(
+          "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion,
+          "io.grpc"               % "grpc-netty"           % Version.grpc
+        )
+      )
+    )
     .customRow(
       true,
       ScalaVersions,
@@ -162,10 +170,8 @@ lazy val e2e =
       Defaults.itSettings,
       publish / skip       := true,
       libraryDependencies ++= Seq(
-        "dev.zio"              %% "zio-test"             % Version.zio % "test,it",
-        "dev.zio"              %% "zio-test-sbt"         % Version.zio % "test,it",
-        "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion,
-        "io.grpc"               % "grpc-netty"           % Version.grpc
+        "dev.zio" %%% "zio-test"     % Version.zio % "test,it",
+        "dev.zio" %%% "zio-test-sbt" % Version.zio % "test,it"
       ),
       Compile / run / fork := true,
       testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework")