From d848b28b0babad7a500a86a3085d19882923ab6d Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Wed, 7 Dec 2022 19:13:22 +0100 Subject: [PATCH 1/3] Cross-compile macroUtils on Scala.js --- build.sbt | 35 ++++++++++--------- .../scala/EquivSupportSpecification.scala | 34 +++++++++++------- project/plugins.sbt | 5 ++- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/build.sbt b/build.sbt index 90663b49..0ecf1869 100644 --- a/build.sbt +++ b/build.sbt @@ -16,7 +16,7 @@ lazy val baseSettings = Seq( organizationName := "Iterators", organizationHomepage := Some(url("https://iterato.rs")), homepage := Some(url("https://github.com/theiterators/kebs")), - scalacOptions := Seq("-deprecation", "-unchecked", "-feature", "-encoding", "utf8") + scalacOptions ++= Seq("-deprecation", "-unchecked", "-feature", "-encoding", "utf8") ) lazy val commonMacroSettings = baseSettings ++ Seq( @@ -105,7 +105,7 @@ def paradisePlugin(scalaVersion: String): Seq[ModuleID] = Seq.empty val scalaTest = "org.scalatest" %% "scalatest" % "3.2.14" -val scalaCheck = "org.scalacheck" %% "scalacheck" % "1.17.0" +val scalaCheck = Def.setting("org.scalacheck" %%% "scalacheck" % "1.17.0") val slick = "com.typesafe.slick" %% "slick" % "3.4.1" val optionalSlick = optional(slick) val playJson = "com.typesafe.play" %% "play-json" % "2.9.3" @@ -174,7 +174,7 @@ lazy val doobieSettings = commonSettings ++ Seq( ) lazy val macroUtilsSettings = commonMacroSettings ++ Seq( - libraryDependencies += (scalaCheck % "test").cross(CrossVersion.for3Use2_13), + libraryDependencies += (scalaCheck.value % "test").cross(CrossVersion.for3Use2_13), libraryDependencies += optionalEnumeratum ) @@ -253,7 +253,9 @@ lazy val taggedMetaSettings = metaSettings ++ Seq( lazy val instancesSettings = commonSettings -lazy val macroUtils = project +lazy val macroUtils = crossProject(JSPlatform, JVMPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(CrossType.Pure) .in(file("macro-utils")) .settings(macroUtilsSettings: _*) .settings(publishSettings: _*) @@ -265,7 +267,7 @@ lazy val macroUtils = project lazy val slickSupport = project .in(file("slick")) - .dependsOn(macroUtils, instances) + .dependsOn(macroUtils.jvm, instances) .settings(slickSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -290,7 +292,7 @@ lazy val doobieSupport = project lazy val sprayJsonMacros = project .in(file("spray-json-macros")) - .dependsOn(macroUtils) + .dependsOn(macroUtils.jvm) .settings(sprayJsonMacroSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -316,7 +318,7 @@ lazy val sprayJsonSupport = project lazy val playJsonSupport = project .in(file("play-json")) - .dependsOn(macroUtils, instances) + .dependsOn(macroUtils.jvm, instances) .settings(playJsonSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -329,7 +331,7 @@ lazy val playJsonSupport = project lazy val circeSupport = project .in(file("circe")) - .dependsOn(macroUtils, instances) + .dependsOn(macroUtils.jvm, instances) .settings(circeSettings: _*) .settings(crossBuildSettings: _*) .settings(publishSettings: _*) @@ -342,7 +344,7 @@ lazy val circeSupport = project lazy val akkaHttpSupport = project .in(file("akka-http")) - .dependsOn(macroUtils, instances, tagged % "test -> test", taggedMeta % "test -> test") + .dependsOn(macroUtils.jvm, instances, tagged % "test -> test", taggedMeta % "test -> test") .settings(akkaHttpSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -355,7 +357,7 @@ lazy val akkaHttpSupport = project lazy val http4sSupport = project .in(file("http4s")) - .dependsOn(macroUtils, instances, opaque % "test -> test", tagged % "test -> test", taggedMeta % "test -> test") + .dependsOn(macroUtils.jvm, instances, opaque % "test -> test", tagged % "test -> test", taggedMeta % "test -> test") .settings(http4sSettings: _*) .settings(publishSettings: _*) .settings( @@ -367,7 +369,7 @@ lazy val http4sSupport = project lazy val jsonschemaSupport = project .in(file("jsonschema")) - .dependsOn(macroUtils) + .dependsOn(macroUtils.jvm) .settings(jsonschemaSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -380,7 +382,7 @@ lazy val jsonschemaSupport = project lazy val scalacheckSupport = project .in(file("scalacheck")) - .dependsOn(macroUtils) + .dependsOn(macroUtils.jvm) .settings(scalacheckSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -393,7 +395,7 @@ lazy val scalacheckSupport = project lazy val tagged = project .in(file("tagged")) - .dependsOn(macroUtils) + .dependsOn(macroUtils.jvm) .settings(taggedSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -406,7 +408,7 @@ lazy val tagged = project lazy val opaque = project .in(file("opaque")) - .dependsOn(macroUtils) + .dependsOn(macroUtils.jvm) .settings(opaqueSettings: _*) .settings(disableScala("2.13")) .settings(disableScala("2.12")) @@ -422,7 +424,7 @@ lazy val opaque = project lazy val taggedMeta = project .in(file("tagged-meta")) .dependsOn( - macroUtils, + macroUtils.jvm, tagged, sprayJsonSupport % "test -> test", circeSupport % "test -> test", @@ -476,7 +478,8 @@ lazy val kebs = project .aggregate( tagged, opaque, - macroUtils, + macroUtils.jvm, + macroUtils.js, slickSupport, doobieSupport, sprayJsonMacros, diff --git a/macro-utils/src/test/scala/EquivSupportSpecification.scala b/macro-utils/src/test/scala/EquivSupportSpecification.scala index 74346186..c7cd36d2 100644 --- a/macro-utils/src/test/scala/EquivSupportSpecification.scala +++ b/macro-utils/src/test/scala/EquivSupportSpecification.scala @@ -6,23 +6,38 @@ object EquivSupportSpecification extends Properties("EquivSupport") { import StringsDomain._ import pl.iterators.kebs.support._ + private def isScalaJS = System.getProperty("java.vm.name") == "Scala.js" + private def areEquiv[A](e1: A, e2: A)(implicit E: Equiv[A]): Boolean = E.equiv(e1, e2) implicit private val equiv: Equiv[String] = Equiv.reference[String] - property("tagged string should be equivalent to reference of non tagged string") = forAll { (stringValue: String) => - val string = new String(stringValue) - val stringTagged = TaggedString(string) + if (!isScalaJS) { + property("string should not be equivalent to other reference of same string") = forAll { (stringValue: String) => + !areEquiv(stringValue, new String(stringValue)) + } - areEquiv(stringTagged, TaggedString(string)) + property("tagged string should not be equivalent to new instance of non tagged string") = forAll { (stringValue: String) => + val string = new String(stringValue) + val stringTagged = TaggedString(string) + + !areEquiv(stringTagged, TaggedString(new String(stringValue))) + } + + property("boxed string should not be equivalent to new instance of non boxed string") = forAll { (stringValue: String) => + val string = new String(stringValue) + val stringBoxed = BoxedString(string) + + !areEquiv(stringBoxed, BoxedString(new String(stringValue))) + } } - property("tagged string should not be equivalent to new instance of non tagged string") = forAll { (stringValue: String) => + property("tagged string should be equivalent to reference of non tagged string") = forAll { (stringValue: String) => val string = new String(stringValue) val stringTagged = TaggedString(string) - !areEquiv(stringTagged, TaggedString(new String(stringValue))) + areEquiv(stringTagged, TaggedString(string)) } property("boxed string should be equivalent to reference of non boxed string") = forAll { (stringValue: String) => @@ -31,11 +46,4 @@ object EquivSupportSpecification extends Properties("EquivSupport") { areEquiv(stringBoxed, BoxedString(string)) } - - property("boxed string should not be equivalent to new instance of non boxed string") = forAll { (stringValue: String) => - val string = new String(stringValue) - val stringBoxed = BoxedString(string) - - !areEquiv(stringBoxed, BoxedString(new String(stringValue))) - } } diff --git a/project/plugins.sbt b/project/plugins.sbt index f27db17b..e01195e9 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,4 +2,7 @@ logLevel := Level.Warn addSbtPlugin("com.lucidchart" % "sbt-scalafmt" % "1.16") addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.3") -addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.11") \ No newline at end of file +addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.11") + +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.12.0") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") \ No newline at end of file From b2243b71ef7740f0855812720485d5df5f948938 Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Thu, 8 Dec 2022 11:43:39 +0100 Subject: [PATCH 2/3] Cross-compile tagged to Scala.js Slick is not available in Scala.js. So pl.iterators.kebs.tagged.slick is only available on the JVM. And the related tests are only running on the JVM. --- build.sbt | 30 ++++++++++--------- .../kebs/tagged/slick/SlickSupport.scala | 0 .../iterators/kebs/tagged/slick/package.scala | 0 .../scala/SlickTaggedColumnTypeTests.scala | 0 .../scala/TaggedTypeIsomorphismTests.scala | 0 .../kebs/tagged/circe/CirceSupport.scala | 0 .../iterators/kebs/tagged/circe/package.scala | 0 .../pl/iterators/kebs/tagged/package.scala | 0 8 files changed, 16 insertions(+), 14 deletions(-) rename tagged/{ => jvm}/src/main/scala/pl/iterators/kebs/tagged/slick/SlickSupport.scala (100%) rename tagged/{ => jvm}/src/main/scala/pl/iterators/kebs/tagged/slick/package.scala (100%) rename tagged/{ => jvm}/src/test/scala/SlickTaggedColumnTypeTests.scala (100%) rename tagged/{ => jvm}/src/test/scala/TaggedTypeIsomorphismTests.scala (100%) rename tagged/{ => shared}/src/main/scala/pl/iterators/kebs/tagged/circe/CirceSupport.scala (100%) rename tagged/{ => shared}/src/main/scala/pl/iterators/kebs/tagged/circe/package.scala (100%) rename tagged/{ => shared}/src/main/scala/pl/iterators/kebs/tagged/package.scala (100%) diff --git a/build.sbt b/build.sbt index 0ecf1869..4f5d8e62 100644 --- a/build.sbt +++ b/build.sbt @@ -104,7 +104,7 @@ def paradisePlugin(scalaVersion: String): Seq[ModuleID] = else Seq.empty -val scalaTest = "org.scalatest" %% "scalatest" % "3.2.14" +val scalaTest = Def.setting("org.scalatest" %%% "scalatest" % "3.2.14") val scalaCheck = Def.setting("org.scalacheck" %%% "scalacheck" % "1.17.0") val slick = "com.typesafe.slick" %% "slick" % "3.4.1" val optionalSlick = optional(slick) @@ -113,11 +113,10 @@ val slickPg = "com.github.tminglei" %% "slick-pg" % "0.21.1" val doobie = "org.tpolecat" %% "doobie-core" % "1.0.0-RC2" val doobiePg = "org.tpolecat" %% "doobie-postgres" % "1.0.0-RC2" val sprayJson = "io.spray" %% "spray-json" % "1.3.6" -val circe = "io.circe" %% "circe-core" % "0.14.3" +val circe = Def.setting("io.circe" %%% "circe-core" % "0.14.3") val circeAuto = "io.circe" %% "circe-generic" % "0.14.3" val circeAutoExtras = "io.circe" %% "circe-generic-extras" % "0.14.3" val circeParser = "io.circe" %% "circe-parser" % "0.14.3" -val optionalCirce = optional(circe) val jsonschema = "com.github.andyglow" %% "scala-jsonschema" % "0.7.9" @@ -158,7 +157,7 @@ lazy val commonSettings = baseSettings ++ Seq( Seq("-language:implicitConversions", "-Ykind-projector", "-Xignore-scala2-macros") else Seq("-language:implicitConversions", "-language:experimental.macros")), // (scalacOptions in Test) ++= Seq("-Ymacro-debug-lite" /*, "-Xlog-implicits"*/ ), - libraryDependencies += scalaTest % "test" + libraryDependencies += scalaTest.value % "test" ) lazy val slickSettings = commonSettings ++ Seq( @@ -191,7 +190,7 @@ lazy val playJsonSettings = commonSettings ++ Seq( ) lazy val circeSettings = commonSettings ++ Seq( - libraryDependencies += circe, + libraryDependencies += circe.value, libraryDependencies += circeAuto, libraryDependencies += circeAutoExtras.cross(CrossVersion.for3Use2_13), libraryDependencies += optionalEnumeratum.cross(CrossVersion.for3Use2_13), @@ -226,7 +225,7 @@ lazy val scalacheckSettings = commonSettings ++ Seq( lazy val taggedSettings = commonSettings ++ Seq( libraryDependencies += optionalSlick.cross(CrossVersion.for3Use2_13), - libraryDependencies += optionalCirce + libraryDependencies += optional(circe.value) ) lazy val opaqueSettings = commonSettings @@ -241,14 +240,14 @@ lazy val examplesSettings = commonSettings ++ Seq( ) lazy val benchmarkSettings = commonSettings ++ Seq( - libraryDependencies += scalaTest, + libraryDependencies += scalaTest.value, libraryDependencies += enumeratum.cross(CrossVersion.for3Use2_13), libraryDependencies ++= akkaHttpInBenchmarks ) lazy val taggedMetaSettings = metaSettings ++ Seq( libraryDependencies += optional(sprayJson.cross(CrossVersion.for3Use2_13)), - libraryDependencies += optional(circe) + libraryDependencies += optional(circe.value) ) lazy val instancesSettings = commonSettings @@ -344,7 +343,7 @@ lazy val circeSupport = project lazy val akkaHttpSupport = project .in(file("akka-http")) - .dependsOn(macroUtils.jvm, instances, tagged % "test -> test", taggedMeta % "test -> test") + .dependsOn(macroUtils.jvm, instances, tagged.jvm % "test -> test", taggedMeta % "test -> test") .settings(akkaHttpSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -357,7 +356,7 @@ lazy val akkaHttpSupport = project lazy val http4sSupport = project .in(file("http4s")) - .dependsOn(macroUtils.jvm, instances, opaque % "test -> test", tagged % "test -> test", taggedMeta % "test -> test") + .dependsOn(macroUtils.jvm, instances, opaque % "test -> test", tagged.jvm % "test -> test", taggedMeta % "test -> test") .settings(http4sSettings: _*) .settings(publishSettings: _*) .settings( @@ -393,9 +392,11 @@ lazy val scalacheckSupport = project crossScalaVersions := supportedScalaVersions ) -lazy val tagged = project +lazy val tagged = crossProject(JSPlatform, JVMPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(CrossType.Full) .in(file("tagged")) - .dependsOn(macroUtils.jvm) + .dependsOn(macroUtils) .settings(taggedSettings: _*) .settings(publishSettings: _*) .settings(disableScala("3")) @@ -425,7 +426,7 @@ lazy val taggedMeta = project .in(file("tagged-meta")) .dependsOn( macroUtils.jvm, - tagged, + tagged.jvm, sprayJsonSupport % "test -> test", circeSupport % "test -> test", jsonschemaSupport % "test -> test", @@ -476,7 +477,8 @@ lazy val instances = project lazy val kebs = project .in(file(".")) .aggregate( - tagged, + tagged.jvm, + tagged.js, opaque, macroUtils.jvm, macroUtils.js, diff --git a/tagged/src/main/scala/pl/iterators/kebs/tagged/slick/SlickSupport.scala b/tagged/jvm/src/main/scala/pl/iterators/kebs/tagged/slick/SlickSupport.scala similarity index 100% rename from tagged/src/main/scala/pl/iterators/kebs/tagged/slick/SlickSupport.scala rename to tagged/jvm/src/main/scala/pl/iterators/kebs/tagged/slick/SlickSupport.scala diff --git a/tagged/src/main/scala/pl/iterators/kebs/tagged/slick/package.scala b/tagged/jvm/src/main/scala/pl/iterators/kebs/tagged/slick/package.scala similarity index 100% rename from tagged/src/main/scala/pl/iterators/kebs/tagged/slick/package.scala rename to tagged/jvm/src/main/scala/pl/iterators/kebs/tagged/slick/package.scala diff --git a/tagged/src/test/scala/SlickTaggedColumnTypeTests.scala b/tagged/jvm/src/test/scala/SlickTaggedColumnTypeTests.scala similarity index 100% rename from tagged/src/test/scala/SlickTaggedColumnTypeTests.scala rename to tagged/jvm/src/test/scala/SlickTaggedColumnTypeTests.scala diff --git a/tagged/src/test/scala/TaggedTypeIsomorphismTests.scala b/tagged/jvm/src/test/scala/TaggedTypeIsomorphismTests.scala similarity index 100% rename from tagged/src/test/scala/TaggedTypeIsomorphismTests.scala rename to tagged/jvm/src/test/scala/TaggedTypeIsomorphismTests.scala diff --git a/tagged/src/main/scala/pl/iterators/kebs/tagged/circe/CirceSupport.scala b/tagged/shared/src/main/scala/pl/iterators/kebs/tagged/circe/CirceSupport.scala similarity index 100% rename from tagged/src/main/scala/pl/iterators/kebs/tagged/circe/CirceSupport.scala rename to tagged/shared/src/main/scala/pl/iterators/kebs/tagged/circe/CirceSupport.scala diff --git a/tagged/src/main/scala/pl/iterators/kebs/tagged/circe/package.scala b/tagged/shared/src/main/scala/pl/iterators/kebs/tagged/circe/package.scala similarity index 100% rename from tagged/src/main/scala/pl/iterators/kebs/tagged/circe/package.scala rename to tagged/shared/src/main/scala/pl/iterators/kebs/tagged/circe/package.scala diff --git a/tagged/src/main/scala/pl/iterators/kebs/tagged/package.scala b/tagged/shared/src/main/scala/pl/iterators/kebs/tagged/package.scala similarity index 100% rename from tagged/src/main/scala/pl/iterators/kebs/tagged/package.scala rename to tagged/shared/src/main/scala/pl/iterators/kebs/tagged/package.scala From 6bec7e3775a0ee4ed15133547f171390e57cbc07 Mon Sep 17 00:00:00 2001 From: Adrien Piquerez Date: Thu, 8 Dec 2022 11:46:19 +0100 Subject: [PATCH 3/3] Cross-compile opaque to Scala.js --- build.sbt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build.sbt b/build.sbt index 4f5d8e62..270c5b17 100644 --- a/build.sbt +++ b/build.sbt @@ -279,7 +279,7 @@ lazy val slickSupport = project lazy val doobieSupport = project .in(file("doobie")) - .dependsOn(instances, opaque) + .dependsOn(instances, opaque.jvm) .settings(doobieSettings: _*) .settings(publishSettings: _*) .settings( @@ -356,7 +356,7 @@ lazy val akkaHttpSupport = project lazy val http4sSupport = project .in(file("http4s")) - .dependsOn(macroUtils.jvm, instances, opaque % "test -> test", tagged.jvm % "test -> test", taggedMeta % "test -> test") + .dependsOn(macroUtils.jvm, instances, opaque.jvm % "test -> test", tagged.jvm % "test -> test", taggedMeta % "test -> test") .settings(http4sSettings: _*) .settings(publishSettings: _*) .settings( @@ -407,9 +407,11 @@ lazy val tagged = crossProject(JSPlatform, JVMPlatform) crossScalaVersions := supportedScalaVersions ) -lazy val opaque = project +lazy val opaque = crossProject(JSPlatform, JVMPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(CrossType.Pure) .in(file("opaque")) - .dependsOn(macroUtils.jvm) + .dependsOn(macroUtils) .settings(opaqueSettings: _*) .settings(disableScala("2.13")) .settings(disableScala("2.12")) @@ -479,7 +481,8 @@ lazy val kebs = project .aggregate( tagged.jvm, tagged.js, - opaque, + opaque.jvm, + opaque.js, macroUtils.jvm, macroUtils.js, slickSupport,