Newer
Older
iw-project-support / sbt-iw-projects / src / main / scala / works / iterative / sbt / IWMaterialsPlugin.scala
package works.iterative.sbt

import sbt._
import sbt.Keys._
import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._
import _root_.io.gitub.sbt.tzdb.TzdbPlugin
import _root_.io.gitub.sbt.tzdb.TzdbPlugin.autoImport._
import locales.LocalesPlugin
import locales.LocalesPlugin.autoImport._

object IWMaterialsPlugin extends AutoPlugin {
  override def trigger: PluginTrigger = allRequirements
  object autoImport {
    val IWVersions = IWMaterialsVersions
    val IWDeps = IWMaterialsDeps
  }
}

object IWMaterialsVersions {
  val akka = "2.6.14"
  val akkaHttp = "10.2.4"
  val elastic4s = "7.12.2"
  val play = "2.8.8"
  val playJson = "2.9.2"
  val scalaTest = "3.2.9"
  val zio = "1.0.13"
  val zioConfig = "1.0.10"
  val zioJson = "0.2.0-M4"
  val zioLogging = "0.5.14"
  val zioPrelude = "1.0.0-RC8"
  val zioZMX = "0.0.11"
  val laminar = "0.14.2"
}

object IWMaterialsDeps {
  import works.iterative.sbt.{IWMaterialsVersions => V}

  val zioOrg = "dev.zio"

  def zioLib(
      name: String,
      version: String,
      configurations: Option[String]
  ): Def.Setting[_] =
    libraryDependencies += (zioOrg %%% s"zio-$name" % version)
      .withConfigurations(configurations)

  def zioLib(
      name: String,
      version: String,
      config: Configuration*
  ): Def.Setting[_] = zioLib(
    name,
    version,
    if (config.isEmpty) None else Some(config.map(_.name).mkString(","))
  )

  val zio: Def.Setting[_] = libraryDependencies += zioOrg %%% "zio" % V.zio

  def zioTest(c: Configuration*): Def.Setting[_] =
    zioLib("test", V.zio, c: _*)

  def zioTestSbt(c: Configuration*): Def.Setting[_] =
    zioLib("test-sbt", V.zio, c: _*)

  val zioConfig: Def.Setting[_] = zioLib("config", V.zioConfig)
  val zioConfigTypesafe: Def.Setting[_] = zioLib("config-typesafe", V.zioConfig)
  val zioConfigMagnolia: Def.Setting[_] = zioLib("config-magnolia", V.zioConfig)

  val zioJson: Def.Setting[_] = zioLib("json", V.zioJson)
  val zioLogging: Def.Setting[_] = zioLib("logging", V.zioLogging)
  val zioPrelude: Def.Setting[_] = zioLib("prelude", V.zioPrelude)
  val zioStreams: Def.Setting[_] = zioLib("streams", V.zio)
  val zioZMX: Def.Setting[_] = zioLib("zmx", V.zioZMX)

  def useZIO(testConf: Configuration*): Seq[Def.Setting[_]] = Seq(
    zio,
    zioTest(testConf: _*),
    zioTestSbt(testConf: _*),
    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 akkaOrg = "com.typesafe.akka"
  val akkaActor: Def.Setting[_] =
    libraryDependencies += akkaOrg %% "akka-actor" % V.akka
  val akkaActorTyped: Def.Setting[_] =
    libraryDependencies += akkaOrg %% "akka-actor-typed" % V.akka
  val akkaHttp: Def.Setting[_] =
    libraryDependencies += akkaOrg %% "akka-http" % V.akkaHttp
  val akkaHttpSprayJson: Def.Setting[_] =
    libraryDependencies += akkaOrg %% "akka-http-spray-json" % V.akkaHttp
  val akkaStream: Def.Setting[_] =
    libraryDependencies += akkaOrg %% "akka-stream" % V.akka
  val akkaPersistenceTestKit: Def.Setting[_] =
    libraryDependencies += akkaOrg %% "akka-persistence-testkit" % V.akka

  val scalaTest: Def.Setting[_] =
    libraryDependencies += "org.scalatest" %%% "scalatest" % V.scalaTest
  val scalaTestPlusScalacheck: Def.Setting[_] =
    libraryDependencies += "org.scalatestplus" %% "scalacheck-1-15" % "3.2.9.0"
  val playScalaTest: Def.Setting[_] =
    libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.1.0"

  private val playOrg = "com.typesafe.play"
  val playMailer: Def.Setting[_] =
    libraryDependencies += playOrg %% "play-mailer" % "8.0.1"
  val playServer: Def.Setting[_] =
    libraryDependencies += playOrg %% "play-server" % V.play
  val playAkkaServer: Def.Setting[_] =
    libraryDependencies += playOrg %% "play-akka-http-server" % V.play
  val play: Def.Setting[_] = libraryDependencies += playOrg %% "play" % V.play
  val playAhcWs: Def.Setting[_] =
    libraryDependencies += playOrg %% "play-ahc-ws" % V.play
  val playJson: Def.Setting[_] =
    libraryDependencies += playOrg %%% "play-json" % V.playJson

  private val elastic4sOrg = "com.sksamuel.elastic4s"
  val useElastic4S: Def.Setting[_] = libraryDependencies ++= Seq(
    elastic4sOrg %% "elastic4s-core" % V.elastic4s,
    elastic4sOrg %% "elastic4s-client-akka" % V.elastic4s,
    elastic4sOrg %% "elastic4s-http-streams" % V.elastic4s,
    elastic4sOrg %% "elastic4s-json-play" % V.elastic4s
  )

  val laminar: Def.Setting[_] =
    libraryDependencies += "com.raquo" %%% "laminar" % V.laminar

  val laminextTailwind: Def.Setting[_] =
    libraryDependencies += "io.laminext" %%% "tailwind" % "0.13.10"

  val laminextFetch: Def.Setting[_] =
    libraryDependencies += "io.laminext" %%% "fetch" % "0.13.10"

  val addScalaJavaTime: Def.Setting[_] =
    libraryDependencies += "io.github.cquiroz" %%% "scala-java-time" % "2.3.0"

  val addScalaJavaLocales: Def.Setting[_] =
    libraryDependencies += "io.github.cquiroz" %%% "scala-java-locales" % "1.2.1"

  def useScalaJavaTimeAndLocales(proj: Project): Project =
    proj
      .enablePlugins(TzdbPlugin, LocalesPlugin)
      .settings(
        addScalaJavaTime,
        addScalaJavaLocales,
        localesFilter := locales.LocalesFilter
          .Selection("en-US", "en", "cs-CZ", "cs"),
        currencyFilter := locales.CurrencyFilter.Selection(
          "AUD",
          "BGN",
          "CAD",
          "CNY",
          "CZK",
          "DKK",
          "EUR",
          "GBP",
          "HKD",
          "HRK",
          "HUF",
          "CHF",
          "ILS",
          "JPY",
          "KRW",
          "NOK",
          "NZD",
          "PLN",
          "RON",
          "RUB",
          "SEK",
          "TRY",
          "USD"
        ),
        supportISOCodes := false,
        supportNumberFormats := true,
        zonesFilter := { (z: String) =>
          z == "Europe/Prague" || z == "CET" || z == "Etc/UTC" || z == "UTC"
        }
      )
}