diff --git a/build.sc b/build.sc new file mode 100644 index 0000000..8a81445 --- /dev/null +++ b/build.sc @@ -0,0 +1,121 @@ +import mill._, scalalib._, scalajslib._ + +import $file.fiftyforms.{build => ff}, ff.support._ + +object core extends PureCrossSbtModule + +object codecs extends PureCrossSbtModule { + def ivyDeps = Agg(Deps.zioJson) + def moduleDeps = Seq(core, ff.tapir) +} + +val coreCodecs = codecs + +object endpoints extends PureCrossSbtModule { + def moduleDeps = Seq(core, codecs, ff.tapir) +} + +val coreEndpoints = endpoints + +object domain extends Module { + trait DomainModule extends Module { + object shared extends Module { + object model extends PureCrossModule { + def moduleDeps = Seq(core) + def ivyDeps = Agg(Deps.zioPrelude) + } + object codecs extends PureCrossModule { + def moduleDeps = Seq(model, coreCodecs) + def ivyDeps = Agg(Deps.zioJson) + } + } + + trait CommonProjects extends Module { + object model extends PureCrossModule { + def ivyDeps = Agg(Deps.zioPrelude) + def moduleDeps = Seq(shared.model, core) + } + object codecs extends PureCrossModule { + def moduleDeps = + Seq(coreCodecs, model, shared.model, shared.codecs, ff.tapir) + } + object endpoints extends PureCrossModule { + def ivyDeps = Agg(Deps.tapirCore, Deps.tapirZIOJson) + def moduleDeps = Seq(model, codecs, coreEndpoints) + } + object client extends CommonJSModule { + def moduleDeps = Seq(endpoints.js) + } + object components extends CommonJSModule { + def ivyDeps = Agg( + Deps.laminar, + Deps.laminextCore, + Deps.laminextUI, + Deps.laminextTailwind, + Deps.laminextValidationCore + ) + def moduleDeps = Seq(ff.ui) + } + } + + object query extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(repo, query.endpoints.jvm) + } + object repo extends CommonModule { + def ivyDeps = Agg(Deps.zio) + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.mongo) + } + object projection extends CommonModule { + def moduleDeps = Seq(repo, ff.akkaPersistence) + } + } + + object command extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(entity, command.endpoints.jvm) + } + object entity extends CommonModule { + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.akkaPersistence) + } + } + } + + object proof extends DomainModule + object parameters extends DomainModule + object users extends DomainModule +} + +object server extends CommonModule { + def moduleDeps = Seq( + core.jvm, + domain.parameters.query.api, + domain.parameters.command.api, + domain.users.query.api, + domain.users.command.api, + domain.proof.query.api, + domain.proof.command.api, + domain.proof.query.projection, + domain.proof.command.entity, + endpoints.jvm + ) + def ivyDeps = Agg( + Deps.zio, + Deps.zioConfig, + Deps.zioConfigTypesafe, + Deps.zioConfigMagnolia, + Deps.zioLoggingSlf4j, + Deps.zioInteropCats, + Deps.tapirCore, + Deps.tapirZIO, + Deps.tapirZIOJson, + Deps.tapirZIOHttp4sServer, + Deps.http4sBlazeServer, + Deps.logbackClassic, + Deps.http4sPac4J, + Deps.pac4jOIDC, + ivy"mysql:mysql-connector-java:8.0.28" + ) +} diff --git a/build.sc b/build.sc new file mode 100644 index 0000000..8a81445 --- /dev/null +++ b/build.sc @@ -0,0 +1,121 @@ +import mill._, scalalib._, scalajslib._ + +import $file.fiftyforms.{build => ff}, ff.support._ + +object core extends PureCrossSbtModule + +object codecs extends PureCrossSbtModule { + def ivyDeps = Agg(Deps.zioJson) + def moduleDeps = Seq(core, ff.tapir) +} + +val coreCodecs = codecs + +object endpoints extends PureCrossSbtModule { + def moduleDeps = Seq(core, codecs, ff.tapir) +} + +val coreEndpoints = endpoints + +object domain extends Module { + trait DomainModule extends Module { + object shared extends Module { + object model extends PureCrossModule { + def moduleDeps = Seq(core) + def ivyDeps = Agg(Deps.zioPrelude) + } + object codecs extends PureCrossModule { + def moduleDeps = Seq(model, coreCodecs) + def ivyDeps = Agg(Deps.zioJson) + } + } + + trait CommonProjects extends Module { + object model extends PureCrossModule { + def ivyDeps = Agg(Deps.zioPrelude) + def moduleDeps = Seq(shared.model, core) + } + object codecs extends PureCrossModule { + def moduleDeps = + Seq(coreCodecs, model, shared.model, shared.codecs, ff.tapir) + } + object endpoints extends PureCrossModule { + def ivyDeps = Agg(Deps.tapirCore, Deps.tapirZIOJson) + def moduleDeps = Seq(model, codecs, coreEndpoints) + } + object client extends CommonJSModule { + def moduleDeps = Seq(endpoints.js) + } + object components extends CommonJSModule { + def ivyDeps = Agg( + Deps.laminar, + Deps.laminextCore, + Deps.laminextUI, + Deps.laminextTailwind, + Deps.laminextValidationCore + ) + def moduleDeps = Seq(ff.ui) + } + } + + object query extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(repo, query.endpoints.jvm) + } + object repo extends CommonModule { + def ivyDeps = Agg(Deps.zio) + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.mongo) + } + object projection extends CommonModule { + def moduleDeps = Seq(repo, ff.akkaPersistence) + } + } + + object command extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(entity, command.endpoints.jvm) + } + object entity extends CommonModule { + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.akkaPersistence) + } + } + } + + object proof extends DomainModule + object parameters extends DomainModule + object users extends DomainModule +} + +object server extends CommonModule { + def moduleDeps = Seq( + core.jvm, + domain.parameters.query.api, + domain.parameters.command.api, + domain.users.query.api, + domain.users.command.api, + domain.proof.query.api, + domain.proof.command.api, + domain.proof.query.projection, + domain.proof.command.entity, + endpoints.jvm + ) + def ivyDeps = Agg( + Deps.zio, + Deps.zioConfig, + Deps.zioConfigTypesafe, + Deps.zioConfigMagnolia, + Deps.zioLoggingSlf4j, + Deps.zioInteropCats, + Deps.tapirCore, + Deps.tapirZIO, + Deps.tapirZIOJson, + Deps.tapirZIOHttp4sServer, + Deps.http4sBlazeServer, + Deps.logbackClassic, + Deps.http4sPac4J, + Deps.pac4jOIDC, + ivy"mysql:mysql-connector-java:8.0.28" + ) +} diff --git a/fiftyforms/bom.sc b/fiftyforms/bom.sc new file mode 100644 index 0000000..e9266b8 --- /dev/null +++ b/fiftyforms/bom.sc @@ -0,0 +1,227 @@ +import mill._, scalalib._ + +object IWMaterials { + + object Versions { + val akka = "2.6.16" + val akkaHttp = "10.2.4" + val cats = "2.7.0" + val elastic4s = "7.12.2" + val http4s = "0.23.10" + val http4sPac4J = "4.0.0" + val laminar = "0.14.2" + val laminext = laminar + val logbackClassic = "1.2.10" + val pac4j = "5.2.0" + val play = "2.8.8" + val playJson = "2.9.2" + val scalaTest = "3.2.9" + val slick = "3.3.3" + val sttpClient = "3.5.0" + val tapir = "0.20.1" + val urlDsl = "0.4.0" + val waypoint = "0.5.0" + val zio = "2.0.0-RC2" + val zioConfig = "3.0.0-RC2" + val zioInteropCats = "3.3.0-RC2" + val zioJson = "0.3.0-RC3" + val zioLogging = "2.0.0-RC5" + val zioPrelude = "1.0.0-RC10" + val zioZMX = "0.0.11" + } + + object Deps extends AkkaLibs with SlickLibs { + import IWMaterials.{Versions => V} + + val zioOrg = "dev.zio" + + def zioLib(name: String, version: String): Dep = + ivy"$zioOrg::zio-$name::$version" + + lazy val zio: Dep = ivy"$zioOrg::zio:${V.zio}" + + lazy val zioTest: Dep = zioLib("test", V.zio) + lazy val zioTestSbt: Dep = zioLib("test", V.zio) + + lazy val zioConfig: Dep = zioLib("config", V.zioConfig) + lazy val zioConfigTypesafe: Dep = + zioLib("config-typesafe", V.zioConfig) + lazy val zioConfigMagnolia: Dep = + zioLib("config-magnolia", V.zioConfig) + + lazy val zioJson: Dep = zioLib("json", V.zioJson) + lazy val zioLogging: Dep = zioLib("logging", V.zioLogging) + lazy val zioLoggingSlf4j: Dep = + zioLib("logging-slf4j", V.zioLogging) + lazy val zioPrelude: Dep = zioLib("prelude", V.zioPrelude) + lazy val zioStreams: Dep = zioLib("streams", V.zio) + lazy val zioZMX: Dep = zioLib("zmx", V.zioZMX) + lazy val zioInteropCats: Dep = + zioLib("interop-cats", V.zioInteropCats) + + /* What is the equivalent? ZIOModule with prepared test config? + def useZIO(testConf: Configuration*): Agg[Dep] = Agg( + zio, + zioTest, + zioTestSbt, + testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") + ) + */ + + /* + def useZIOAll(testConf: Configuration*): Seq[Def.Setting[_]] = + useZIO(testConf: _*) ++ Seq( + zioStreams, + zioConfig, + zioConfigTypesafe, + zioConfigMagnolia, + zioJson, + zioZMX, + zioLogging, + zioPrelude + ) + */ + + private val tapirOrg = "com.softwaremill.sttp.tapir" + def tapirLib(name: String): Dep = + ivy"${tapirOrg}::tapir-$name::${V.tapir}" + + lazy val tapirCore: Dep = tapirLib("core") + lazy val tapirZIO: Dep = tapirLib("zio") + lazy val tapirZIOJson: Dep = tapirLib("json-zio") + lazy val tapirSttpClient: Dep = tapirLib("sttp-client") + lazy val tapirCats: Dep = tapirLib("cats") + lazy val tapirZIOHttp4sServer: Dep = tapirLib("zio-http4s-server") + + private val sttpClientOrg = "com.softwaremill.sttp.client3" + def sttpClientLib(name: String): Dep = + ivy"${sttpClientOrg}::${name}:${V.sttpClient}" + + lazy val sttpClientCore: Dep = sttpClientLib("core") + + lazy val http4sBlazeServer: Dep = + ivy"org.http4s::http4s-blaze-server:${V.http4s}" + + lazy val http4sPac4J: Dep = + ivy"org.pac4j::http4s-pac4j:${V.http4sPac4J}" + lazy val pac4jOIDC: Dep = + ivy"org.pac4j:pac4j-oidc:${V.pac4j}" + + lazy val scalaTest: Dep = + ivy"org.scalatest::scalatest:${V.scalaTest}" + lazy val scalaTestPlusScalacheck: Dep = + ivy"org.scalatestplus::scalacheck-1-15:3.2.9.0" + lazy val playScalaTest: Dep = + ivy"org.scalatestplus.play::scalatestplus-play:5.1.0" + + private val playOrg = "com.typesafe.play" + lazy val playMailer: Dep = ivy"${playOrg}::play-mailer:8.0.1" + lazy val playServer: Dep = ivy"${playOrg}::play-server:${V.play}" + lazy val playAkkaServer: Dep = + ivy"${playOrg}::play-akka-http-server:${V.play}" + lazy val play: Dep = ivy"${playOrg}::play:${V.play}" + lazy val playAhcWs: Dep = ivy"${playOrg}::play-ahc-ws:${V.play}" + lazy val playJson: Dep = ivy"${playOrg}::play-json:${V.playJson}" + + private val elastic4sOrg = "com.sksamuel.elastic4s" + lazy val useElastic4S: Agg[Dep] = Agg( + ivy"${elastic4sOrg}::elastic4s-core:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-client-akka:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-http-streams:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-json-play:${V.elastic4s}" + ) + + lazy val laminar: Dep = ivy"com.raquo::laminar::${V.laminar}" + + private def laminext(name: String): Dep = + ivy"io.laminext::$name::${V.laminar}" + + lazy val laminextCore: Dep = laminext("core") + lazy val laminextTailwind: Dep = laminext("tailwind") + lazy val laminextFetch: Dep = laminext("fetch") + lazy val laminextValidationCore: Dep = laminext("validation-core") + lazy val laminextUI: Dep = laminext("ui") + + lazy val waypoint: Dep = + ivy"com.raquo::waypoint::${V.waypoint}" + + lazy val urlDsl: Dep = + ivy"be.doeraene::url-dsl::${V.urlDsl}" + + lazy val scalaJavaTime: Dep = + ivy"io.github.cquiroz::scala-java-time::2.3.0" + + lazy val scalaJavaLocales: Dep = + ivy"io.github.cquiroz::scala-java-locales::1.2.1" + + lazy val logbackClassic: Dep = + ivy"ch.qos.logback:logback-classic:${V.logbackClassic}" + } + + trait AkkaLibs { + + self: SlickLibs => + + object akka { + val V = Versions.akka + val tOrg = "com.typesafe.akka" + val lOrg = "com.lightbend.akka" + + def akkaMod(name: String): Dep = + ivy"$tOrg::akka-$name:$V" + + lazy val actor: Dep = akkaMod("actor") + lazy val actorTyped: Dep = akkaMod("actor-typed") + lazy val stream: Dep = akkaMod("stream") + lazy val persistence: Dep = akkaMod("persistence-typed") + lazy val persistenceQuery: Dep = akkaMod("persistence-query") + lazy val persistenceJdbc: Dep = + ivy"$lOrg::akka-persistence-jdbc:5.0.4" + val persistenceTestKit: Dep = ivy"$tOrg::akka-persistence-testkit:$V" + + object http { + val V = Versions.akkaHttp + + lazy val http: Dep = ivy"$tOrg::akka-http:$V" + lazy val sprayJson: Dep = ivy"$tOrg::akka-http-spray-json:$V" + + } + + object projection { + val V = "1.2.2" + + lazy val core: Dep = + ivy"$lOrg::akka-projection-core:$V" + lazy val eventsourced: Dep = + ivy"$lOrg::akka-projection-eventsourced:$V" + lazy val slick: Dep = + ivy"$lOrg::akka-projection-slick:$V" + lazy val jdbc: Dep = + ivy"$lOrg::akka-projection-jdbc:$V" + } + + object profiles { + // TODO: deal with cross-version for Scala3 (for3Use2_13) + lazy val eventsourcedJdbcProjection: Agg[Dep] = Agg( + persistenceQuery, + projection.core, + projection.eventsourced, + projection.slick, + persistenceJdbc + ) ++ slick.default + } + } + } + + trait SlickLibs { + object slick { + val V = IWMaterials.Versions.slick + val org = "com.typesafe.slick" + + lazy val slick: Dep = ivy"$org::slick:$V" + lazy val hikaricp: Dep = ivy"$org::slick-hikaricp:$V" + lazy val default: Agg[Dep] = Agg(slick, hikaricp) + } + } + +} diff --git a/build.sc b/build.sc new file mode 100644 index 0000000..8a81445 --- /dev/null +++ b/build.sc @@ -0,0 +1,121 @@ +import mill._, scalalib._, scalajslib._ + +import $file.fiftyforms.{build => ff}, ff.support._ + +object core extends PureCrossSbtModule + +object codecs extends PureCrossSbtModule { + def ivyDeps = Agg(Deps.zioJson) + def moduleDeps = Seq(core, ff.tapir) +} + +val coreCodecs = codecs + +object endpoints extends PureCrossSbtModule { + def moduleDeps = Seq(core, codecs, ff.tapir) +} + +val coreEndpoints = endpoints + +object domain extends Module { + trait DomainModule extends Module { + object shared extends Module { + object model extends PureCrossModule { + def moduleDeps = Seq(core) + def ivyDeps = Agg(Deps.zioPrelude) + } + object codecs extends PureCrossModule { + def moduleDeps = Seq(model, coreCodecs) + def ivyDeps = Agg(Deps.zioJson) + } + } + + trait CommonProjects extends Module { + object model extends PureCrossModule { + def ivyDeps = Agg(Deps.zioPrelude) + def moduleDeps = Seq(shared.model, core) + } + object codecs extends PureCrossModule { + def moduleDeps = + Seq(coreCodecs, model, shared.model, shared.codecs, ff.tapir) + } + object endpoints extends PureCrossModule { + def ivyDeps = Agg(Deps.tapirCore, Deps.tapirZIOJson) + def moduleDeps = Seq(model, codecs, coreEndpoints) + } + object client extends CommonJSModule { + def moduleDeps = Seq(endpoints.js) + } + object components extends CommonJSModule { + def ivyDeps = Agg( + Deps.laminar, + Deps.laminextCore, + Deps.laminextUI, + Deps.laminextTailwind, + Deps.laminextValidationCore + ) + def moduleDeps = Seq(ff.ui) + } + } + + object query extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(repo, query.endpoints.jvm) + } + object repo extends CommonModule { + def ivyDeps = Agg(Deps.zio) + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.mongo) + } + object projection extends CommonModule { + def moduleDeps = Seq(repo, ff.akkaPersistence) + } + } + + object command extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(entity, command.endpoints.jvm) + } + object entity extends CommonModule { + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.akkaPersistence) + } + } + } + + object proof extends DomainModule + object parameters extends DomainModule + object users extends DomainModule +} + +object server extends CommonModule { + def moduleDeps = Seq( + core.jvm, + domain.parameters.query.api, + domain.parameters.command.api, + domain.users.query.api, + domain.users.command.api, + domain.proof.query.api, + domain.proof.command.api, + domain.proof.query.projection, + domain.proof.command.entity, + endpoints.jvm + ) + def ivyDeps = Agg( + Deps.zio, + Deps.zioConfig, + Deps.zioConfigTypesafe, + Deps.zioConfigMagnolia, + Deps.zioLoggingSlf4j, + Deps.zioInteropCats, + Deps.tapirCore, + Deps.tapirZIO, + Deps.tapirZIOJson, + Deps.tapirZIOHttp4sServer, + Deps.http4sBlazeServer, + Deps.logbackClassic, + Deps.http4sPac4J, + Deps.pac4jOIDC, + ivy"mysql:mysql-connector-java:8.0.28" + ) +} diff --git a/fiftyforms/bom.sc b/fiftyforms/bom.sc new file mode 100644 index 0000000..e9266b8 --- /dev/null +++ b/fiftyforms/bom.sc @@ -0,0 +1,227 @@ +import mill._, scalalib._ + +object IWMaterials { + + object Versions { + val akka = "2.6.16" + val akkaHttp = "10.2.4" + val cats = "2.7.0" + val elastic4s = "7.12.2" + val http4s = "0.23.10" + val http4sPac4J = "4.0.0" + val laminar = "0.14.2" + val laminext = laminar + val logbackClassic = "1.2.10" + val pac4j = "5.2.0" + val play = "2.8.8" + val playJson = "2.9.2" + val scalaTest = "3.2.9" + val slick = "3.3.3" + val sttpClient = "3.5.0" + val tapir = "0.20.1" + val urlDsl = "0.4.0" + val waypoint = "0.5.0" + val zio = "2.0.0-RC2" + val zioConfig = "3.0.0-RC2" + val zioInteropCats = "3.3.0-RC2" + val zioJson = "0.3.0-RC3" + val zioLogging = "2.0.0-RC5" + val zioPrelude = "1.0.0-RC10" + val zioZMX = "0.0.11" + } + + object Deps extends AkkaLibs with SlickLibs { + import IWMaterials.{Versions => V} + + val zioOrg = "dev.zio" + + def zioLib(name: String, version: String): Dep = + ivy"$zioOrg::zio-$name::$version" + + lazy val zio: Dep = ivy"$zioOrg::zio:${V.zio}" + + lazy val zioTest: Dep = zioLib("test", V.zio) + lazy val zioTestSbt: Dep = zioLib("test", V.zio) + + lazy val zioConfig: Dep = zioLib("config", V.zioConfig) + lazy val zioConfigTypesafe: Dep = + zioLib("config-typesafe", V.zioConfig) + lazy val zioConfigMagnolia: Dep = + zioLib("config-magnolia", V.zioConfig) + + lazy val zioJson: Dep = zioLib("json", V.zioJson) + lazy val zioLogging: Dep = zioLib("logging", V.zioLogging) + lazy val zioLoggingSlf4j: Dep = + zioLib("logging-slf4j", V.zioLogging) + lazy val zioPrelude: Dep = zioLib("prelude", V.zioPrelude) + lazy val zioStreams: Dep = zioLib("streams", V.zio) + lazy val zioZMX: Dep = zioLib("zmx", V.zioZMX) + lazy val zioInteropCats: Dep = + zioLib("interop-cats", V.zioInteropCats) + + /* What is the equivalent? ZIOModule with prepared test config? + def useZIO(testConf: Configuration*): Agg[Dep] = Agg( + zio, + zioTest, + zioTestSbt, + testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") + ) + */ + + /* + def useZIOAll(testConf: Configuration*): Seq[Def.Setting[_]] = + useZIO(testConf: _*) ++ Seq( + zioStreams, + zioConfig, + zioConfigTypesafe, + zioConfigMagnolia, + zioJson, + zioZMX, + zioLogging, + zioPrelude + ) + */ + + private val tapirOrg = "com.softwaremill.sttp.tapir" + def tapirLib(name: String): Dep = + ivy"${tapirOrg}::tapir-$name::${V.tapir}" + + lazy val tapirCore: Dep = tapirLib("core") + lazy val tapirZIO: Dep = tapirLib("zio") + lazy val tapirZIOJson: Dep = tapirLib("json-zio") + lazy val tapirSttpClient: Dep = tapirLib("sttp-client") + lazy val tapirCats: Dep = tapirLib("cats") + lazy val tapirZIOHttp4sServer: Dep = tapirLib("zio-http4s-server") + + private val sttpClientOrg = "com.softwaremill.sttp.client3" + def sttpClientLib(name: String): Dep = + ivy"${sttpClientOrg}::${name}:${V.sttpClient}" + + lazy val sttpClientCore: Dep = sttpClientLib("core") + + lazy val http4sBlazeServer: Dep = + ivy"org.http4s::http4s-blaze-server:${V.http4s}" + + lazy val http4sPac4J: Dep = + ivy"org.pac4j::http4s-pac4j:${V.http4sPac4J}" + lazy val pac4jOIDC: Dep = + ivy"org.pac4j:pac4j-oidc:${V.pac4j}" + + lazy val scalaTest: Dep = + ivy"org.scalatest::scalatest:${V.scalaTest}" + lazy val scalaTestPlusScalacheck: Dep = + ivy"org.scalatestplus::scalacheck-1-15:3.2.9.0" + lazy val playScalaTest: Dep = + ivy"org.scalatestplus.play::scalatestplus-play:5.1.0" + + private val playOrg = "com.typesafe.play" + lazy val playMailer: Dep = ivy"${playOrg}::play-mailer:8.0.1" + lazy val playServer: Dep = ivy"${playOrg}::play-server:${V.play}" + lazy val playAkkaServer: Dep = + ivy"${playOrg}::play-akka-http-server:${V.play}" + lazy val play: Dep = ivy"${playOrg}::play:${V.play}" + lazy val playAhcWs: Dep = ivy"${playOrg}::play-ahc-ws:${V.play}" + lazy val playJson: Dep = ivy"${playOrg}::play-json:${V.playJson}" + + private val elastic4sOrg = "com.sksamuel.elastic4s" + lazy val useElastic4S: Agg[Dep] = Agg( + ivy"${elastic4sOrg}::elastic4s-core:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-client-akka:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-http-streams:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-json-play:${V.elastic4s}" + ) + + lazy val laminar: Dep = ivy"com.raquo::laminar::${V.laminar}" + + private def laminext(name: String): Dep = + ivy"io.laminext::$name::${V.laminar}" + + lazy val laminextCore: Dep = laminext("core") + lazy val laminextTailwind: Dep = laminext("tailwind") + lazy val laminextFetch: Dep = laminext("fetch") + lazy val laminextValidationCore: Dep = laminext("validation-core") + lazy val laminextUI: Dep = laminext("ui") + + lazy val waypoint: Dep = + ivy"com.raquo::waypoint::${V.waypoint}" + + lazy val urlDsl: Dep = + ivy"be.doeraene::url-dsl::${V.urlDsl}" + + lazy val scalaJavaTime: Dep = + ivy"io.github.cquiroz::scala-java-time::2.3.0" + + lazy val scalaJavaLocales: Dep = + ivy"io.github.cquiroz::scala-java-locales::1.2.1" + + lazy val logbackClassic: Dep = + ivy"ch.qos.logback:logback-classic:${V.logbackClassic}" + } + + trait AkkaLibs { + + self: SlickLibs => + + object akka { + val V = Versions.akka + val tOrg = "com.typesafe.akka" + val lOrg = "com.lightbend.akka" + + def akkaMod(name: String): Dep = + ivy"$tOrg::akka-$name:$V" + + lazy val actor: Dep = akkaMod("actor") + lazy val actorTyped: Dep = akkaMod("actor-typed") + lazy val stream: Dep = akkaMod("stream") + lazy val persistence: Dep = akkaMod("persistence-typed") + lazy val persistenceQuery: Dep = akkaMod("persistence-query") + lazy val persistenceJdbc: Dep = + ivy"$lOrg::akka-persistence-jdbc:5.0.4" + val persistenceTestKit: Dep = ivy"$tOrg::akka-persistence-testkit:$V" + + object http { + val V = Versions.akkaHttp + + lazy val http: Dep = ivy"$tOrg::akka-http:$V" + lazy val sprayJson: Dep = ivy"$tOrg::akka-http-spray-json:$V" + + } + + object projection { + val V = "1.2.2" + + lazy val core: Dep = + ivy"$lOrg::akka-projection-core:$V" + lazy val eventsourced: Dep = + ivy"$lOrg::akka-projection-eventsourced:$V" + lazy val slick: Dep = + ivy"$lOrg::akka-projection-slick:$V" + lazy val jdbc: Dep = + ivy"$lOrg::akka-projection-jdbc:$V" + } + + object profiles { + // TODO: deal with cross-version for Scala3 (for3Use2_13) + lazy val eventsourcedJdbcProjection: Agg[Dep] = Agg( + persistenceQuery, + projection.core, + projection.eventsourced, + projection.slick, + persistenceJdbc + ) ++ slick.default + } + } + } + + trait SlickLibs { + object slick { + val V = IWMaterials.Versions.slick + val org = "com.typesafe.slick" + + lazy val slick: Dep = ivy"$org::slick:$V" + lazy val hikaricp: Dep = ivy"$org::slick-hikaricp:$V" + lazy val default: Agg[Dep] = Agg(slick, hikaricp) + } + } + +} diff --git a/fiftyforms/build.sc b/fiftyforms/build.sc new file mode 100644 index 0000000..df64eb0 --- /dev/null +++ b/fiftyforms/build.sc @@ -0,0 +1,158 @@ +import mill._, scalalib._, scalajslib._ + +import $file.bom + +object support { + val Deps = bom.IWMaterials.Deps + val Versions = bom.IWMaterials.Versions + + trait CommonModule extends ScalaModule { + def scalaVersion = "3.1.1" + def scalacOptions = Seq( + "-encoding", + "utf8", + "-deprecation", + "-explain-types", + "-explain", + "-feature", + "-language:experimental.macros", + "-language:higherKinds", + "-language:implicitConversions", + "-unchecked", + "-Xfatal-warnings", + "-Ykind-projector" + ) + } + + trait CommonJSModule extends CommonModule with ScalaJSModule { + def scalaJSVersion = "1.8.0" + } + + trait CrossPlatformModule extends Module { outer => + def ivyDeps: T[Agg[Dep]] = Agg[Dep]() + def jsDeps: T[Agg[Dep]] = Agg[Dep]() + def jvmDeps: T[Agg[Dep]] = Agg[Dep]() + def moduleDeps: Seq[Module] = Seq[Module]() + + trait PlatformModule extends CommonModule { + def platform: String + def millSourcePath = outer.millSourcePath + def ivyDeps = outer.ivyDeps() ++ (platform match { + case "js" => jsDeps() + case _ => jvmDeps() + }) + def moduleDeps = outer.moduleDeps.collect { + case m: CrossPlatformModule => m.platformModule(platform) + case m: JavaModule => m + } + } + + def platformModule(platform: String): JavaModule + } + + trait PureCrossModule extends CrossPlatformModule { + object js extends PlatformModule { + def platform = "js" + } + object jvm extends PlatformModule { + def platform = "jvm" + } + + def platformModule(platform: String): JavaModule = platform match { + case "js" => js + case _ => jvm + } + } + + trait PureCrossSbtModule extends CrossPlatformModule { + object js extends PlatformModule with SbtModule { + def platform = "js" + } + object jvm extends PlatformModule with SbtModule { + def platform = "jvm" + } + + def platformModule(platform: String): JavaModule = platform match { + case "js" => js + case _ => jvm + } + } + + trait FullCrossSbtModule extends CrossPlatformModule { + trait FullPlatformModule extends PlatformModule { + def sources = T.sources( + millSourcePath / platform / "src" / "main" / "scala", + millSourcePath / "shared" / "src" / "main" / "scala" + ) + + def resources = T.sources( + millSourcePath / platform / "src" / "main" / "resources", + millSourcePath / "shared" / "src" / "main" / "resources" + ) + } + + object js extends FullPlatformModule { + def platform = "js" + } + object jvm extends FullPlatformModule { + def platform = "jvm" + } + + def platformModule(platform: String): JavaModule = platform match { + case "js" => js + case _ => jvm + } + } + +} + +import support._ + +object mongo extends CommonModule { + def ivyDeps = Agg( + Deps.zio, + Deps.zioJson, + Deps.zioConfig, + ivy"org.mongodb.scala::mongo-scala-driver:4.2.3".withDottyCompat( + scalaVersion() + ) + ) +} + +object tapir extends FullCrossSbtModule { + def ivyDeps = Agg(Deps.tapirCore, Deps.tapirZIOJson, Deps.zioJson) + def jvmDeps = Agg(Deps.tapirZIO, Deps.tapirZIOHttp4sServer) + def jsDeps = Agg(Deps.tapirSttpClient) +} + +object akkaPersistence extends CommonModule { + def millSourcePath = build.millSourcePath / "akka-persistence" + def ivyDeps = (Agg( + Deps.akka.persistenceQuery, + Deps.akka.persistenceJdbc, + Deps.akka.projection.core, + Deps.akka.projection.eventsourced, + Deps.akka.projection.slick + ) ++ Deps.slick.default).map(_.withDottyCompat(scalaVersion())) ++ Agg( + Deps.zio, + Deps.zioJson, + Deps.zioConfig, + Deps.akka.persistence.withDottyCompat(scalaVersion()), + ivy"com.typesafe.akka::akka-cluster-sharding-typed:${Deps.akka.V}" + .withDottyCompat(scalaVersion()) + ) +} + +object ui extends CommonJSModule { + def ivyDeps = Agg( + Deps.zio, + Deps.laminar, + Deps.zioJson, + Deps.waypoint, + Deps.urlDsl, + Deps.laminextCore, + Deps.laminextUI, + Deps.laminextTailwind, + Deps.laminextValidationCore + ) +} diff --git a/build.sc b/build.sc new file mode 100644 index 0000000..8a81445 --- /dev/null +++ b/build.sc @@ -0,0 +1,121 @@ +import mill._, scalalib._, scalajslib._ + +import $file.fiftyforms.{build => ff}, ff.support._ + +object core extends PureCrossSbtModule + +object codecs extends PureCrossSbtModule { + def ivyDeps = Agg(Deps.zioJson) + def moduleDeps = Seq(core, ff.tapir) +} + +val coreCodecs = codecs + +object endpoints extends PureCrossSbtModule { + def moduleDeps = Seq(core, codecs, ff.tapir) +} + +val coreEndpoints = endpoints + +object domain extends Module { + trait DomainModule extends Module { + object shared extends Module { + object model extends PureCrossModule { + def moduleDeps = Seq(core) + def ivyDeps = Agg(Deps.zioPrelude) + } + object codecs extends PureCrossModule { + def moduleDeps = Seq(model, coreCodecs) + def ivyDeps = Agg(Deps.zioJson) + } + } + + trait CommonProjects extends Module { + object model extends PureCrossModule { + def ivyDeps = Agg(Deps.zioPrelude) + def moduleDeps = Seq(shared.model, core) + } + object codecs extends PureCrossModule { + def moduleDeps = + Seq(coreCodecs, model, shared.model, shared.codecs, ff.tapir) + } + object endpoints extends PureCrossModule { + def ivyDeps = Agg(Deps.tapirCore, Deps.tapirZIOJson) + def moduleDeps = Seq(model, codecs, coreEndpoints) + } + object client extends CommonJSModule { + def moduleDeps = Seq(endpoints.js) + } + object components extends CommonJSModule { + def ivyDeps = Agg( + Deps.laminar, + Deps.laminextCore, + Deps.laminextUI, + Deps.laminextTailwind, + Deps.laminextValidationCore + ) + def moduleDeps = Seq(ff.ui) + } + } + + object query extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(repo, query.endpoints.jvm) + } + object repo extends CommonModule { + def ivyDeps = Agg(Deps.zio) + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.mongo) + } + object projection extends CommonModule { + def moduleDeps = Seq(repo, ff.akkaPersistence) + } + } + + object command extends CommonProjects { + object api extends CommonModule { + def ivyDeps = Agg(Deps.zio, Deps.tapirZIOHttp4sServer) + def moduleDeps = Seq(entity, command.endpoints.jvm) + } + object entity extends CommonModule { + def moduleDeps = Seq(model.jvm, codecs.jvm, ff.akkaPersistence) + } + } + } + + object proof extends DomainModule + object parameters extends DomainModule + object users extends DomainModule +} + +object server extends CommonModule { + def moduleDeps = Seq( + core.jvm, + domain.parameters.query.api, + domain.parameters.command.api, + domain.users.query.api, + domain.users.command.api, + domain.proof.query.api, + domain.proof.command.api, + domain.proof.query.projection, + domain.proof.command.entity, + endpoints.jvm + ) + def ivyDeps = Agg( + Deps.zio, + Deps.zioConfig, + Deps.zioConfigTypesafe, + Deps.zioConfigMagnolia, + Deps.zioLoggingSlf4j, + Deps.zioInteropCats, + Deps.tapirCore, + Deps.tapirZIO, + Deps.tapirZIOJson, + Deps.tapirZIOHttp4sServer, + Deps.http4sBlazeServer, + Deps.logbackClassic, + Deps.http4sPac4J, + Deps.pac4jOIDC, + ivy"mysql:mysql-connector-java:8.0.28" + ) +} diff --git a/fiftyforms/bom.sc b/fiftyforms/bom.sc new file mode 100644 index 0000000..e9266b8 --- /dev/null +++ b/fiftyforms/bom.sc @@ -0,0 +1,227 @@ +import mill._, scalalib._ + +object IWMaterials { + + object Versions { + val akka = "2.6.16" + val akkaHttp = "10.2.4" + val cats = "2.7.0" + val elastic4s = "7.12.2" + val http4s = "0.23.10" + val http4sPac4J = "4.0.0" + val laminar = "0.14.2" + val laminext = laminar + val logbackClassic = "1.2.10" + val pac4j = "5.2.0" + val play = "2.8.8" + val playJson = "2.9.2" + val scalaTest = "3.2.9" + val slick = "3.3.3" + val sttpClient = "3.5.0" + val tapir = "0.20.1" + val urlDsl = "0.4.0" + val waypoint = "0.5.0" + val zio = "2.0.0-RC2" + val zioConfig = "3.0.0-RC2" + val zioInteropCats = "3.3.0-RC2" + val zioJson = "0.3.0-RC3" + val zioLogging = "2.0.0-RC5" + val zioPrelude = "1.0.0-RC10" + val zioZMX = "0.0.11" + } + + object Deps extends AkkaLibs with SlickLibs { + import IWMaterials.{Versions => V} + + val zioOrg = "dev.zio" + + def zioLib(name: String, version: String): Dep = + ivy"$zioOrg::zio-$name::$version" + + lazy val zio: Dep = ivy"$zioOrg::zio:${V.zio}" + + lazy val zioTest: Dep = zioLib("test", V.zio) + lazy val zioTestSbt: Dep = zioLib("test", V.zio) + + lazy val zioConfig: Dep = zioLib("config", V.zioConfig) + lazy val zioConfigTypesafe: Dep = + zioLib("config-typesafe", V.zioConfig) + lazy val zioConfigMagnolia: Dep = + zioLib("config-magnolia", V.zioConfig) + + lazy val zioJson: Dep = zioLib("json", V.zioJson) + lazy val zioLogging: Dep = zioLib("logging", V.zioLogging) + lazy val zioLoggingSlf4j: Dep = + zioLib("logging-slf4j", V.zioLogging) + lazy val zioPrelude: Dep = zioLib("prelude", V.zioPrelude) + lazy val zioStreams: Dep = zioLib("streams", V.zio) + lazy val zioZMX: Dep = zioLib("zmx", V.zioZMX) + lazy val zioInteropCats: Dep = + zioLib("interop-cats", V.zioInteropCats) + + /* What is the equivalent? ZIOModule with prepared test config? + def useZIO(testConf: Configuration*): Agg[Dep] = Agg( + zio, + zioTest, + zioTestSbt, + testFrameworks += new TestFramework("zio.test.sbt.ZTestFramework") + ) + */ + + /* + def useZIOAll(testConf: Configuration*): Seq[Def.Setting[_]] = + useZIO(testConf: _*) ++ Seq( + zioStreams, + zioConfig, + zioConfigTypesafe, + zioConfigMagnolia, + zioJson, + zioZMX, + zioLogging, + zioPrelude + ) + */ + + private val tapirOrg = "com.softwaremill.sttp.tapir" + def tapirLib(name: String): Dep = + ivy"${tapirOrg}::tapir-$name::${V.tapir}" + + lazy val tapirCore: Dep = tapirLib("core") + lazy val tapirZIO: Dep = tapirLib("zio") + lazy val tapirZIOJson: Dep = tapirLib("json-zio") + lazy val tapirSttpClient: Dep = tapirLib("sttp-client") + lazy val tapirCats: Dep = tapirLib("cats") + lazy val tapirZIOHttp4sServer: Dep = tapirLib("zio-http4s-server") + + private val sttpClientOrg = "com.softwaremill.sttp.client3" + def sttpClientLib(name: String): Dep = + ivy"${sttpClientOrg}::${name}:${V.sttpClient}" + + lazy val sttpClientCore: Dep = sttpClientLib("core") + + lazy val http4sBlazeServer: Dep = + ivy"org.http4s::http4s-blaze-server:${V.http4s}" + + lazy val http4sPac4J: Dep = + ivy"org.pac4j::http4s-pac4j:${V.http4sPac4J}" + lazy val pac4jOIDC: Dep = + ivy"org.pac4j:pac4j-oidc:${V.pac4j}" + + lazy val scalaTest: Dep = + ivy"org.scalatest::scalatest:${V.scalaTest}" + lazy val scalaTestPlusScalacheck: Dep = + ivy"org.scalatestplus::scalacheck-1-15:3.2.9.0" + lazy val playScalaTest: Dep = + ivy"org.scalatestplus.play::scalatestplus-play:5.1.0" + + private val playOrg = "com.typesafe.play" + lazy val playMailer: Dep = ivy"${playOrg}::play-mailer:8.0.1" + lazy val playServer: Dep = ivy"${playOrg}::play-server:${V.play}" + lazy val playAkkaServer: Dep = + ivy"${playOrg}::play-akka-http-server:${V.play}" + lazy val play: Dep = ivy"${playOrg}::play:${V.play}" + lazy val playAhcWs: Dep = ivy"${playOrg}::play-ahc-ws:${V.play}" + lazy val playJson: Dep = ivy"${playOrg}::play-json:${V.playJson}" + + private val elastic4sOrg = "com.sksamuel.elastic4s" + lazy val useElastic4S: Agg[Dep] = Agg( + ivy"${elastic4sOrg}::elastic4s-core:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-client-akka:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-http-streams:${V.elastic4s}", + ivy"${elastic4sOrg}::elastic4s-json-play:${V.elastic4s}" + ) + + lazy val laminar: Dep = ivy"com.raquo::laminar::${V.laminar}" + + private def laminext(name: String): Dep = + ivy"io.laminext::$name::${V.laminar}" + + lazy val laminextCore: Dep = laminext("core") + lazy val laminextTailwind: Dep = laminext("tailwind") + lazy val laminextFetch: Dep = laminext("fetch") + lazy val laminextValidationCore: Dep = laminext("validation-core") + lazy val laminextUI: Dep = laminext("ui") + + lazy val waypoint: Dep = + ivy"com.raquo::waypoint::${V.waypoint}" + + lazy val urlDsl: Dep = + ivy"be.doeraene::url-dsl::${V.urlDsl}" + + lazy val scalaJavaTime: Dep = + ivy"io.github.cquiroz::scala-java-time::2.3.0" + + lazy val scalaJavaLocales: Dep = + ivy"io.github.cquiroz::scala-java-locales::1.2.1" + + lazy val logbackClassic: Dep = + ivy"ch.qos.logback:logback-classic:${V.logbackClassic}" + } + + trait AkkaLibs { + + self: SlickLibs => + + object akka { + val V = Versions.akka + val tOrg = "com.typesafe.akka" + val lOrg = "com.lightbend.akka" + + def akkaMod(name: String): Dep = + ivy"$tOrg::akka-$name:$V" + + lazy val actor: Dep = akkaMod("actor") + lazy val actorTyped: Dep = akkaMod("actor-typed") + lazy val stream: Dep = akkaMod("stream") + lazy val persistence: Dep = akkaMod("persistence-typed") + lazy val persistenceQuery: Dep = akkaMod("persistence-query") + lazy val persistenceJdbc: Dep = + ivy"$lOrg::akka-persistence-jdbc:5.0.4" + val persistenceTestKit: Dep = ivy"$tOrg::akka-persistence-testkit:$V" + + object http { + val V = Versions.akkaHttp + + lazy val http: Dep = ivy"$tOrg::akka-http:$V" + lazy val sprayJson: Dep = ivy"$tOrg::akka-http-spray-json:$V" + + } + + object projection { + val V = "1.2.2" + + lazy val core: Dep = + ivy"$lOrg::akka-projection-core:$V" + lazy val eventsourced: Dep = + ivy"$lOrg::akka-projection-eventsourced:$V" + lazy val slick: Dep = + ivy"$lOrg::akka-projection-slick:$V" + lazy val jdbc: Dep = + ivy"$lOrg::akka-projection-jdbc:$V" + } + + object profiles { + // TODO: deal with cross-version for Scala3 (for3Use2_13) + lazy val eventsourcedJdbcProjection: Agg[Dep] = Agg( + persistenceQuery, + projection.core, + projection.eventsourced, + projection.slick, + persistenceJdbc + ) ++ slick.default + } + } + } + + trait SlickLibs { + object slick { + val V = IWMaterials.Versions.slick + val org = "com.typesafe.slick" + + lazy val slick: Dep = ivy"$org::slick:$V" + lazy val hikaricp: Dep = ivy"$org::slick-hikaricp:$V" + lazy val default: Agg[Dep] = Agg(slick, hikaricp) + } + } + +} diff --git a/fiftyforms/build.sc b/fiftyforms/build.sc new file mode 100644 index 0000000..df64eb0 --- /dev/null +++ b/fiftyforms/build.sc @@ -0,0 +1,158 @@ +import mill._, scalalib._, scalajslib._ + +import $file.bom + +object support { + val Deps = bom.IWMaterials.Deps + val Versions = bom.IWMaterials.Versions + + trait CommonModule extends ScalaModule { + def scalaVersion = "3.1.1" + def scalacOptions = Seq( + "-encoding", + "utf8", + "-deprecation", + "-explain-types", + "-explain", + "-feature", + "-language:experimental.macros", + "-language:higherKinds", + "-language:implicitConversions", + "-unchecked", + "-Xfatal-warnings", + "-Ykind-projector" + ) + } + + trait CommonJSModule extends CommonModule with ScalaJSModule { + def scalaJSVersion = "1.8.0" + } + + trait CrossPlatformModule extends Module { outer => + def ivyDeps: T[Agg[Dep]] = Agg[Dep]() + def jsDeps: T[Agg[Dep]] = Agg[Dep]() + def jvmDeps: T[Agg[Dep]] = Agg[Dep]() + def moduleDeps: Seq[Module] = Seq[Module]() + + trait PlatformModule extends CommonModule { + def platform: String + def millSourcePath = outer.millSourcePath + def ivyDeps = outer.ivyDeps() ++ (platform match { + case "js" => jsDeps() + case _ => jvmDeps() + }) + def moduleDeps = outer.moduleDeps.collect { + case m: CrossPlatformModule => m.platformModule(platform) + case m: JavaModule => m + } + } + + def platformModule(platform: String): JavaModule + } + + trait PureCrossModule extends CrossPlatformModule { + object js extends PlatformModule { + def platform = "js" + } + object jvm extends PlatformModule { + def platform = "jvm" + } + + def platformModule(platform: String): JavaModule = platform match { + case "js" => js + case _ => jvm + } + } + + trait PureCrossSbtModule extends CrossPlatformModule { + object js extends PlatformModule with SbtModule { + def platform = "js" + } + object jvm extends PlatformModule with SbtModule { + def platform = "jvm" + } + + def platformModule(platform: String): JavaModule = platform match { + case "js" => js + case _ => jvm + } + } + + trait FullCrossSbtModule extends CrossPlatformModule { + trait FullPlatformModule extends PlatformModule { + def sources = T.sources( + millSourcePath / platform / "src" / "main" / "scala", + millSourcePath / "shared" / "src" / "main" / "scala" + ) + + def resources = T.sources( + millSourcePath / platform / "src" / "main" / "resources", + millSourcePath / "shared" / "src" / "main" / "resources" + ) + } + + object js extends FullPlatformModule { + def platform = "js" + } + object jvm extends FullPlatformModule { + def platform = "jvm" + } + + def platformModule(platform: String): JavaModule = platform match { + case "js" => js + case _ => jvm + } + } + +} + +import support._ + +object mongo extends CommonModule { + def ivyDeps = Agg( + Deps.zio, + Deps.zioJson, + Deps.zioConfig, + ivy"org.mongodb.scala::mongo-scala-driver:4.2.3".withDottyCompat( + scalaVersion() + ) + ) +} + +object tapir extends FullCrossSbtModule { + def ivyDeps = Agg(Deps.tapirCore, Deps.tapirZIOJson, Deps.zioJson) + def jvmDeps = Agg(Deps.tapirZIO, Deps.tapirZIOHttp4sServer) + def jsDeps = Agg(Deps.tapirSttpClient) +} + +object akkaPersistence extends CommonModule { + def millSourcePath = build.millSourcePath / "akka-persistence" + def ivyDeps = (Agg( + Deps.akka.persistenceQuery, + Deps.akka.persistenceJdbc, + Deps.akka.projection.core, + Deps.akka.projection.eventsourced, + Deps.akka.projection.slick + ) ++ Deps.slick.default).map(_.withDottyCompat(scalaVersion())) ++ Agg( + Deps.zio, + Deps.zioJson, + Deps.zioConfig, + Deps.akka.persistence.withDottyCompat(scalaVersion()), + ivy"com.typesafe.akka::akka-cluster-sharding-typed:${Deps.akka.V}" + .withDottyCompat(scalaVersion()) + ) +} + +object ui extends CommonJSModule { + def ivyDeps = Agg( + Deps.zio, + Deps.laminar, + Deps.zioJson, + Deps.waypoint, + Deps.urlDsl, + Deps.laminextCore, + Deps.laminextUI, + Deps.laminextTailwind, + Deps.laminextValidationCore + ) +} diff --git a/shell.nix b/shell.nix index 322723d..2582231 100644 --- a/shell.nix +++ b/shell.nix @@ -9,5 +9,5 @@ with pkgs; mkShell { - buildInputs = [ jre ammonite coursier bloop sbt scalafmt nodejs-16_x ]; + buildInputs = [ jre ammonite coursier bloop mill sbt scalafmt nodejs-16_x ]; }