Repository: 7mind/izumi
Pull request #1843 (2022-12-19 18:49:35)

Update to 2.13.10, Fix logstage expression parsing on 2.13.10


Patch:
diff --git a/build.sbt b/build.sbt
index 63c058ab3..e8f39464a 100644
--- a/build.sbt
+++ b/build.sbt
@@ -3,38 +3,26 @@
 // ALL CHANGES WILL BE LOST
 
 
+import sbtcrossproject.CrossPlugin.autoImport.{crossProject, CrossType}
+
 import com.github.sbt.git.SbtGit.GitKeys._
 
 enablePlugins(SbtgenVerificationPlugin)
 
 disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-functional` = project.in(file("fundamentals/fundamentals-functional"))
+lazy val `fundamentals-functional` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-functional"))
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full)
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -108,7 +96,7 @@ lazy val `fundamentals-functional` = project.in(file("fundamentals/fundamentals-
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -143,7 +131,6 @@ lazy val `fundamentals-functional` = project.in(file("fundamentals/fundamentals-
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -159,7 +146,7 @@ lazy val `fundamentals-functional` = project.in(file("fundamentals/fundamentals-
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -171,37 +158,44 @@ lazy val `fundamentals-functional` = project.in(file("fundamentals/fundamentals-
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-functionalJVM` = `fundamentals-functional`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-functionalJS` = `fundamentals-functional`.js
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-collections` = project.in(file("fundamentals/fundamentals-collections"))
+lazy val `fundamentals-collections` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-collections"))
   .dependsOn(
     `fundamentals-functional` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full)
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -275,7 +269,7 @@ lazy val `fundamentals-collections` = project.in(file("fundamentals/fundamentals
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -310,7 +304,6 @@ lazy val `fundamentals-collections` = project.in(file("fundamentals/fundamentals
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -326,7 +319,7 @@ lazy val `fundamentals-collections` = project.in(file("fundamentals/fundamentals
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -338,13 +331,34 @@ lazy val `fundamentals-collections` = project.in(file("fundamentals/fundamentals
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-collectionsJVM` = `fundamentals-collections`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-collectionsJS` = `fundamentals-collections`.js
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-literals` = project.in(file("fundamentals/fundamentals-literals"))
+lazy val `fundamentals-literals` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-literals"))
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
@@ -352,21 +366,7 @@ lazy val `fundamentals-literals` = project.in(file("fundamentals/fundamentals-li
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -440,7 +440,7 @@ lazy val `fundamentals-literals` = project.in(file("fundamentals/fundamentals-li
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -475,7 +475,6 @@ lazy val `fundamentals-literals` = project.in(file("fundamentals/fundamentals-li
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -491,7 +490,7 @@ lazy val `fundamentals-literals` = project.in(file("fundamentals/fundamentals-li
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -503,39 +502,46 @@ lazy val `fundamentals-literals` = project.in(file("fundamentals/fundamentals-li
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-literalsJVM` = `fundamentals-literals`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-literalsJS` = `fundamentals-literals`.js
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-orphans` = project.in(file("fundamentals/fundamentals-orphans"))
+lazy val `fundamentals-orphans` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-orphans"))
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "org.typelevel" %% "cats-core" % V.cats % Optional,
-      "org.typelevel" %% "cats-effect" % V.cats_effect % Optional,
-      "dev.zio" %% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Optional,
-      "dev.zio" %% "zio-interop-cats" % V.zio_interop_cats % Optional excludeAll("dev.zio" %% "izumi-reflect")
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "org.typelevel" %%% "cats-core" % V.cats % Optional,
+      "org.typelevel" %%% "cats-effect" % V.cats_effect % Optional,
+      "dev.zio" %%% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect % Optional,
+      "dev.zio" %%% "zio-interop-cats" % V.zio_interop_cats % Optional excludeAll("dev.zio" %% "izumi-reflect")
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full)
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -609,7 +615,7 @@ lazy val `fundamentals-orphans` = project.in(file("fundamentals/fundamentals-orp
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -644,7 +650,6 @@ lazy val `fundamentals-orphans` = project.in(file("fundamentals/fundamentals-orp
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -660,7 +665,7 @@ lazy val `fundamentals-orphans` = project.in(file("fundamentals/fundamentals-orp
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -672,16 +677,37 @@ lazy val `fundamentals-orphans` = project.in(file("fundamentals/fundamentals-orp
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-orphansJVM` = `fundamentals-orphans`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-orphansJS` = `fundamentals-orphans`.js
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-language` = project.in(file("fundamentals/fundamentals-language"))
+lazy val `fundamentals-language` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-language"))
   .dependsOn(
     `fundamentals-literals` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
@@ -697,21 +723,7 @@ lazy val `fundamentals-language` = project.in(file("fundamentals/fundamentals-la
     }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -785,7 +797,7 @@ lazy val `fundamentals-language` = project.in(file("fundamentals/fundamentals-la
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -820,7 +832,6 @@ lazy val `fundamentals-language` = project.in(file("fundamentals/fundamentals-la
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -836,7 +847,7 @@ lazy val `fundamentals-language` = project.in(file("fundamentals/fundamentals-la
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -848,17 +859,39 @@ lazy val `fundamentals-language` = project.in(file("fundamentals/fundamentals-la
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-languageJVM` = `fundamentals-language`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-languageJS` = `fundamentals-language`.js
+  .enablePlugins(ScalaJSBundlerPlugin)
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-platform"))
+lazy val `fundamentals-platform` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-platform"))
   .dependsOn(
     `fundamentals-language` % "test->compile;compile->compile",
     `fundamentals-collections` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
@@ -866,21 +899,7 @@ lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-pl
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -954,7 +973,7 @@ lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-pl
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -989,7 +1008,6 @@ lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-pl
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -1005,7 +1023,7 @@ lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-pl
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -1017,50 +1035,61 @@ lazy val `fundamentals-platform` = project.in(file("fundamentals/fundamentals-pl
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) },
+    Test / npmDependencies ++= Seq(
+      (  "hash.js",  "1.1.7")
+    )
+  )
+lazy val `fundamentals-platformJVM` = `fundamentals-platform`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-platformJS` = `fundamentals-platform`.js
+  .enablePlugins(ScalaJSBundlerPlugin)
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-json-circe` = project.in(file("fundamentals/fundamentals-json-circe"))
+lazy val `fundamentals-json-circe` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-json-circe"))
   .dependsOn(
     `fundamentals-platform` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "io.circe" %% "circe-core" % V.circe,
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "io.circe" %%% "circe-core" % V.circe,
       "org.typelevel" %% "jawn-parser" % V.jawn % Test,
-      "io.circe" %% "circe-literal" % V.circe % Test
+      "io.circe" %%% "circe-literal" % V.circe % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
-      "io.circe" %% "circe-derivation" % V.circe_derivation,
+      "io.circe" %%% "circe-derivation" % V.circe_derivation,
       "org.scala-lang" % "scala-reflect" % scalaVersion.value % Provided
     ) else Seq.empty },
     libraryDependencies ++= {
       val version = scalaVersion.value
       if (version.startsWith("0.") || version.startsWith("3.")) {
         Seq(
-          "io.circe" %% "circe-generic" % V.circe
+          "io.circe" %%% "circe-generic" % V.circe
         )
       } else Seq.empty
     }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -1134,7 +1163,7 @@ lazy val `fundamentals-json-circe` = project.in(file("fundamentals/fundamentals-
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -1169,7 +1198,6 @@ lazy val `fundamentals-json-circe` = project.in(file("fundamentals/fundamentals-
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -1185,7 +1213,7 @@ lazy val `fundamentals-json-circe` = project.in(file("fundamentals/fundamentals-
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -1197,18 +1225,39 @@ lazy val `fundamentals-json-circe` = project.in(file("fundamentals/fundamentals-
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-json-circeJVM` = `fundamentals-json-circe`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-json-circeJS` = `fundamentals-json-circe`.js
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-reflection` = project.in(file("fundamentals/fundamentals-reflection"))
+lazy val `fundamentals-reflection` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-reflection"))
   .dependsOn(
     `fundamentals-platform` % "test->compile;compile->compile",
     `fundamentals-functional` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
@@ -1216,21 +1265,7 @@ lazy val `fundamentals-reflection` = project.in(file("fundamentals/fundamentals-
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -1304,7 +1339,7 @@ lazy val `fundamentals-reflection` = project.in(file("fundamentals/fundamentals-
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -1339,7 +1374,6 @@ lazy val `fundamentals-reflection` = project.in(file("fundamentals/fundamentals-
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -1355,7 +1389,7 @@ lazy val `fundamentals-reflection` = project.in(file("fundamentals/fundamentals-
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -1367,48 +1401,55 @@ lazy val `fundamentals-reflection` = project.in(file("fundamentals/fundamentals-
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-reflectionJVM` = `fundamentals-reflection`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-reflectionJS` = `fundamentals-reflection`.js
   .disablePlugins(AssemblyPlugin)
 
-lazy val `fundamentals-bio` = project.in(file("fundamentals/fundamentals-bio"))
+lazy val `fundamentals-bio` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("fundamentals/fundamentals-bio"))
   .dependsOn(
     `fundamentals-language` % "test->compile;compile->compile",
     `fundamentals-orphans` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "org.typelevel" %% "cats-core" % V.cats % Optional,
-      "org.typelevel" %% "cats-effect" % V.cats_effect % Optional,
-      "dev.zio" %% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Optional,
-      "org.typelevel" %% "cats-effect-laws" % V.cats_effect % Test,
-      "org.typelevel" %% "cats-effect-testkit" % V.cats_effect % Test,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "org.typelevel" %% "discipline-core" % V.discipline % Test,
-      "org.typelevel" %% "discipline-scalatest" % V.discipline_scalatest % Test,
-      "dev.zio" %% "zio-interop-cats" % V.zio_interop_cats % Test excludeAll("dev.zio" %% "izumi-reflect")
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "org.typelevel" %%% "cats-core" % V.cats % Optional,
+      "org.typelevel" %%% "cats-effect" % V.cats_effect % Optional,
+      "dev.zio" %%% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect % Optional,
+      "org.typelevel" %%% "cats-effect-laws" % V.cats_effect % Test,
+      "org.typelevel" %%% "cats-effect-testkit" % V.cats_effect % Test,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "org.typelevel" %%% "discipline-core" % V.discipline % Test,
+      "org.typelevel" %%% "discipline-scalatest" % V.discipline_scalatest % Test,
+      "dev.zio" %%% "zio-interop-cats" % V.zio_interop_cats % Test excludeAll("dev.zio" %% "izumi-reflect")
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full)
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -1482,7 +1523,7 @@ lazy val `fundamentals-bio` = project.in(file("fundamentals/fundamentals-bio"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -1517,7 +1558,6 @@ lazy val `fundamentals-bio` = project.in(file("fundamentals/fundamentals-bio"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -1533,7 +1573,7 @@ lazy val `fundamentals-bio` = project.in(file("fundamentals/fundamentals-bio"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -1545,25 +1585,51 @@ lazy val `fundamentals-bio` = project.in(file("fundamentals/fundamentals-bio"))
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `fundamentals-bioJVM` = `fundamentals-bio`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `fundamentals-bioJS` = `fundamentals-bio`.js
+  .settings(
+    libraryDependencies ++= Seq(
+      "io.github.cquiroz" %%% "scala-java-time" % V.scala_java_time % Test
+    )
+  )
   .disablePlugins(AssemblyPlugin)
 
-lazy val `distage-core-api` = project.in(file("distage/distage-core-api"))
+lazy val `distage-core-api` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("distage/distage-core-api"))
   .dependsOn(
     `fundamentals-reflection` % "test->compile;compile->compile",
     `fundamentals-bio` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "org.typelevel" %% "cats-core" % V.cats % Optional,
-      "org.typelevel" %% "cats-effect" % V.cats_effect % Optional,
-      "dev.zio" %% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Optional,
-      "org.typelevel" %% "cats-core" % V.cats % Test,
-      "org.typelevel" %% "cats-effect" % V.cats_effect % Test,
-      "dev.zio" %% "zio" % V.zio % Test excludeAll("dev.zio" %% "izumi-reflect"),
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Test
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "org.typelevel" %%% "cats-core" % V.cats % Optional,
+      "org.typelevel" %%% "cats-effect" % V.cats_effect % Optional,
+      "dev.zio" %%% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect % Optional,
+      "org.typelevel" %%% "cats-core" % V.cats % Test,
+      "org.typelevel" %%% "cats-effect" % V.cats_effect % Test,
+      "dev.zio" %%% "zio" % V.zio % Test excludeAll("dev.zio" %% "izumi-reflect"),
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
@@ -1571,21 +1637,7 @@ lazy val `distage-core-api` = project.in(file("distage/distage-core-api"))
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -1659,7 +1711,7 @@ lazy val `distage-core-api` = project.in(file("distage/distage-core-api"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -1694,7 +1746,6 @@ lazy val `distage-core-api` = project.in(file("distage/distage-core-api"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -1710,7 +1761,7 @@ lazy val `distage-core-api` = project.in(file("distage/distage-core-api"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -1722,11 +1773,32 @@ lazy val `distage-core-api` = project.in(file("distage/distage-core-api"))
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `distage-core-apiJVM` = `distage-core-api`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `distage-core-apiJS` = `distage-core-api`.js
   .disablePlugins(AssemblyPlugin)
 
 lazy val `distage-core-proxy-bytebuddy` = project.in(file("distage/distage-core-proxy-bytebuddy"))
   .dependsOn(
-    `distage-core-api` % "test->compile;compile->compile"
+    `distage-core-apiJVM` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
@@ -1741,19 +1813,11 @@ lazy val `distage-core-proxy-bytebuddy` = project.in(file("distage/distage-core-
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -1827,7 +1891,7 @@ lazy val `distage-core-proxy-bytebuddy` = project.in(file("distage/distage-core-
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -1862,7 +1926,6 @@ lazy val `distage-core-proxy-bytebuddy` = project.in(file("distage/distage-core-
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -1878,7 +1941,7 @@ lazy val `distage-core-proxy-bytebuddy` = project.in(file("distage/distage-core-
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -1894,7 +1957,7 @@ lazy val `distage-core-proxy-bytebuddy` = project.in(file("distage/distage-core-
 
 lazy val `distage-framework-api` = project.in(file("distage/distage-framework-api"))
   .dependsOn(
-    `distage-core-api` % "test->compile;compile->compile"
+    `distage-core-apiJVM` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
@@ -1909,19 +1972,11 @@ lazy val `distage-framework-api` = project.in(file("distage/distage-framework-ap
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -1995,7 +2050,7 @@ lazy val `distage-framework-api` = project.in(file("distage/distage-framework-ap
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -2030,7 +2085,6 @@ lazy val `distage-framework-api` = project.in(file("distage/distage-framework-ap
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -2046,7 +2100,7 @@ lazy val `distage-framework-api` = project.in(file("distage/distage-framework-ap
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -2060,20 +2114,19 @@ lazy val `distage-framework-api` = project.in(file("distage/distage-framework-ap
   )
   .disablePlugins(AssemblyPlugin)
 
-lazy val `distage-core` = project.in(file("distage/distage-core"))
+lazy val `distage-core` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("distage/distage-core"))
   .dependsOn(
-    `distage-core-api` % "test->compile;compile->compile",
-    `distage-core-proxy-bytebuddy` % "test->compile;compile->compile"
+    `distage-core-api` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "org.typelevel" %% "cats-core" % V.cats % Optional,
-      "org.typelevel" %% "cats-effect" % V.cats_effect % Optional,
-      "dev.zio" %% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Optional,
-      "dev.zio" %% "zio-interop-cats" % V.zio_interop_cats % Optional excludeAll("dev.zio" %% "izumi-reflect"),
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "org.typelevel" %%% "cats-core" % V.cats % Optional,
+      "org.typelevel" %%% "cats-effect" % V.cats_effect % Optional,
+      "dev.zio" %%% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect % Optional,
+      "dev.zio" %%% "zio-interop-cats" % V.zio_interop_cats % Optional excludeAll("dev.zio" %% "izumi-reflect"),
       "javax.inject" % "javax.inject" % "1" % Test
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
@@ -2081,21 +2134,7 @@ lazy val `distage-core` = project.in(file("distage/distage-core"))
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -2169,7 +2208,7 @@ lazy val `distage-core` = project.in(file("distage/distage-core"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -2204,7 +2243,6 @@ lazy val `distage-core` = project.in(file("distage/distage-core"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -2220,7 +2258,7 @@ lazy val `distage-core` = project.in(file("distage/distage-core"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -2232,12 +2270,41 @@ lazy val `distage-core` = project.in(file("distage/distage-core"))
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `distage-coreJVM` = `distage-core`.jvm
+  .dependsOn(
+    `distage-core-proxy-bytebuddy` % "test->compile;compile->compile"
+  )
+  .disablePlugins(AssemblyPlugin)
+lazy val `distage-coreJS` = `distage-core`.js
+  .settings(
+    libraryDependencies ++= Seq(
+      "io.github.cquiroz" %%% "scala-java-time" % V.scala_java_time % Test
+    )
+  )
   .disablePlugins(AssemblyPlugin)
 
 lazy val `distage-extension-config` = project.in(file("distage/distage-extension-config"))
   .dependsOn(
-    `distage-core-api` % "test->compile;compile->compile",
-    `distage-core` % "test->compile"
+    `distage-core-apiJVM` % "test->compile;compile->compile",
+    `distage-coreJVM` % "test->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
@@ -2255,19 +2322,11 @@ lazy val `distage-extension-config` = project.in(file("distage/distage-extension
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -2341,7 +2400,7 @@ lazy val `distage-extension-config` = project.in(file("distage/distage-extension
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -2376,7 +2435,6 @@ lazy val `distage-extension-config` = project.in(file("distage/distage-extension
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -2392,7 +2450,7 @@ lazy val `distage-extension-config` = project.in(file("distage/distage-extension
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -2406,39 +2464,24 @@ lazy val `distage-extension-config` = project.in(file("distage/distage-extension
   )
   .disablePlugins(AssemblyPlugin)
 
-lazy val `distage-extension-logstage` = project.in(file("distage/distage-extension-logstage"))
+lazy val `distage-extension-logstage` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("distage/distage-extension-logstage"))
   .dependsOn(
-    `distage-extension-config` % "test->compile;compile->compile",
     `distage-core-api` % "test->compile;compile->compile",
     `distage-core` % "test->compile",
     `logstage-core` % "test->test;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "dev.zio" %% "zio" % V.zio % Test excludeAll("dev.zio" %% "izumi-reflect")
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "dev.zio" %%% "zio" % V.zio % Test excludeAll("dev.zio" %% "izumi-reflect")
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full)
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -2512,7 +2555,7 @@ lazy val `distage-extension-logstage` = project.in(file("distage/distage-extensi
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -2547,7 +2590,6 @@ lazy val `distage-extension-logstage` = project.in(file("distage/distage-extensi
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -2563,7 +2605,7 @@ lazy val `distage-extension-logstage` = project.in(file("distage/distage-extensi
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -2575,14 +2617,35 @@ lazy val `distage-extension-logstage` = project.in(file("distage/distage-extensi
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `distage-extension-logstageJVM` = `distage-extension-logstage`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `distage-extension-logstageJS` = `distage-extension-logstage`.js
   .disablePlugins(AssemblyPlugin)
 
 lazy val `distage-extension-plugins` = project.in(file("distage/distage-extension-plugins"))
   .dependsOn(
-    `distage-core-api` % "test->compile;compile->compile",
-    `distage-core` % "test->compile",
+    `distage-core-apiJVM` % "test->compile;compile->compile",
+    `distage-coreJVM` % "test->compile",
     `distage-extension-config` % "test->compile",
-    `logstage-core` % "test->compile"
+    `logstage-coreJVM` % "test->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
@@ -2598,19 +2661,11 @@ lazy val `distage-extension-plugins` = project.in(file("distage/distage-extensio
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -2684,7 +2739,7 @@ lazy val `distage-extension-plugins` = project.in(file("distage/distage-extensio
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -2719,7 +2774,6 @@ lazy val `distage-extension-plugins` = project.in(file("distage/distage-extensio
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -2735,7 +2789,7 @@ lazy val `distage-extension-plugins` = project.in(file("distage/distage-extensio
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -2751,9 +2805,9 @@ lazy val `distage-extension-plugins` = project.in(file("distage/distage-extensio
 
 lazy val `distage-framework` = project.in(file("distage/distage-framework"))
   .dependsOn(
-    `distage-extension-logstage` % "test->compile;compile->compile",
-    `logstage-rendering-circe` % "test->compile;compile->compile",
-    `distage-core` % "test->compile;compile->compile",
+    `distage-extension-logstageJVM` % "test->compile;compile->compile",
+    `logstage-rendering-circeJVM` % "test->compile;compile->compile",
+    `distage-coreJVM` % "test->compile;compile->compile",
     `distage-framework-api` % "test->compile;compile->compile",
     `distage-extension-plugins` % "test->compile;compile->compile",
     `distage-extension-config` % "test->compile;compile->compile",
@@ -2778,19 +2832,11 @@ lazy val `distage-framework` = project.in(file("distage/distage-framework"))
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -2864,7 +2910,7 @@ lazy val `distage-framework` = project.in(file("distage/distage-framework"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -2899,7 +2945,6 @@ lazy val `distage-framework` = project.in(file("distage/distage-framework"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -2915,7 +2960,7 @@ lazy val `distage-framework` = project.in(file("distage/distage-framework"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -2931,10 +2976,10 @@ lazy val `distage-framework` = project.in(file("distage/distage-framework"))
 
 lazy val `distage-framework-docker` = project.in(file("distage/distage-framework-docker"))
   .dependsOn(
-    `distage-core` % "test->compile;compile->compile",
+    `distage-coreJVM` % "test->compile;compile->compile",
     `distage-extension-config` % "test->compile;compile->compile",
     `distage-framework-api` % "test->compile;compile->compile",
-    `distage-extension-logstage` % "test->compile;compile->compile",
+    `distage-extension-logstageJVM` % "test->compile;compile->compile",
     `distage-testkit-scalatest` % "test->compile"
   )
   .settings(
@@ -2955,19 +3000,11 @@ lazy val `distage-framework-docker` = project.in(file("distage/distage-framework
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -3041,7 +3078,7 @@ lazy val `distage-framework-docker` = project.in(file("distage/distage-framework
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -3076,7 +3113,6 @@ lazy val `distage-framework-docker` = project.in(file("distage/distage-framework
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -3092,7 +3128,7 @@ lazy val `distage-framework-docker` = project.in(file("distage/distage-framework
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -3122,19 +3158,11 @@ lazy val `distage-testkit-core` = project.in(file("distage/distage-testkit-core"
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -3208,7 +3236,7 @@ lazy val `distage-testkit-core` = project.in(file("distage/distage-testkit-core"
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -3243,7 +3271,6 @@ lazy val `distage-testkit-core` = project.in(file("distage/distage-testkit-core"
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -3259,7 +3286,7 @@ lazy val `distage-testkit-core` = project.in(file("distage/distage-testkit-core"
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -3276,7 +3303,7 @@ lazy val `distage-testkit-core` = project.in(file("distage/distage-testkit-core"
 lazy val `distage-testkit-scalatest` = project.in(file("distage/distage-testkit-scalatest"))
   .dependsOn(
     `distage-testkit-core` % "test->compile;compile->compile",
-    `distage-core` % "test->compile;compile->compile",
+    `distage-coreJVM` % "test->compile;compile->compile",
     `distage-extension-plugins` % "test->compile;compile->compile",
     `distage-framework` % "test->test;compile->compile"
   )
@@ -3298,19 +3325,11 @@ lazy val `distage-testkit-scalatest` = project.in(file("distage/distage-testkit-
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -3384,7 +3403,7 @@ lazy val `distage-testkit-scalatest` = project.in(file("distage/distage-testkit-
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -3419,7 +3438,6 @@ lazy val `distage-testkit-scalatest` = project.in(file("distage/distage-testkit-
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -3435,7 +3453,7 @@ lazy val `distage-testkit-scalatest` = project.in(file("distage/distage-testkit-
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -3450,19 +3468,19 @@ lazy val `distage-testkit-scalatest` = project.in(file("distage/distage-testkit-
   )
   .disablePlugins(AssemblyPlugin)
 
-lazy val `logstage-core` = project.in(file("logstage/logstage-core"))
+lazy val `logstage-core` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("logstage/logstage-core"))
   .dependsOn(
     `fundamentals-bio` % "test->compile;compile->compile",
     `fundamentals-platform` % "test->compile;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
-      "org.typelevel" %% "cats-core" % V.cats % Optional,
-      "org.typelevel" %% "cats-effect" % V.cats_effect % Optional,
-      "dev.zio" %% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
-      "dev.zio" %% "izumi-reflect" % V.izumi_reflect % Optional
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
+      "org.typelevel" %%% "cats-core" % V.cats % Optional,
+      "org.typelevel" %%% "cats-effect" % V.cats_effect % Optional,
+      "dev.zio" %%% "zio" % V.zio % Optional excludeAll("dev.zio" %% "izumi-reflect"),
+      "dev.zio" %%% "izumi-reflect" % V.izumi_reflect % Optional
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full),
@@ -3470,21 +3488,7 @@ lazy val `logstage-core` = project.in(file("logstage/logstage-core"))
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -3558,7 +3562,7 @@ lazy val `logstage-core` = project.in(file("logstage/logstage-core"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -3593,7 +3597,6 @@ lazy val `logstage-core` = project.in(file("logstage/logstage-core"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -3609,7 +3612,7 @@ lazy val `logstage-core` = project.in(file("logstage/logstage-core"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -3621,43 +3624,55 @@ lazy val `logstage-core` = project.in(file("logstage/logstage-core"))
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `logstage-coreJVM` = `logstage-core`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `logstage-coreJS` = `logstage-core`.js
+  .settings(
+    libraryDependencies ++= Seq(
+      "io.github.cquiroz" %%% "scala-java-time" % V.scala_java_time
+    )
+  )
   .disablePlugins(AssemblyPlugin)
 
-lazy val `logstage-rendering-circe` = project.in(file("logstage/logstage-rendering-circe"))
+lazy val `logstage-rendering-circe` = crossProject(JVMPlatform, JSPlatform).crossType(CrossType.Pure).in(file("logstage/logstage-rendering-circe"))
   .dependsOn(
     `fundamentals-json-circe` % "test->compile;compile->compile",
     `logstage-core` % "test->test;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
-      "org.scala-lang.modules" %% "scala-collection-compat" % V.collection_compat,
-      "org.scalatest" %% "scalatest" % V.scalatest % Test,
+      "org.scala-lang.modules" %%% "scala-collection-compat" % V.collection_compat,
+      "org.scalatest" %%% "scalatest" % V.scalatest % Test,
       "org.typelevel" %% "jawn-parser" % V.jawn % Test,
-      "io.circe" %% "circe-parser" % V.circe % Test,
-      "io.circe" %% "circe-literal" % V.circe % Test,
-      "io.circe" %% "circe-generic" % V.circe % Test,
-      "dev.zio" %% "zio" % V.zio % Test excludeAll("dev.zio" %% "izumi-reflect")
+      "io.circe" %%% "circe-parser" % V.circe % Test,
+      "io.circe" %%% "circe-literal" % V.circe % Test,
+      "io.circe" %%% "circe-generic" % V.circe % Test,
+      "dev.zio" %%% "zio" % V.zio % Test excludeAll("dev.zio" %% "izumi-reflect")
     ),
     libraryDependencies ++= { if (scalaVersion.value.startsWith("2.")) Seq(
       compilerPlugin("org.typelevel" % "kind-projector" % V.kind_projector cross CrossVersion.full)
     ) else Seq.empty }
   )
   .settings(
-    crossScalaVersions := Seq(
-      "3.2.1",
-      "2.13.8",
-      "2.12.17"
-    ),
-    scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -3731,7 +3746,7 @@ lazy val `logstage-rendering-circe` = project.in(file("logstage/logstage-renderi
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -3766,7 +3781,6 @@ lazy val `logstage-rendering-circe` = project.in(file("logstage/logstage-renderi
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -3782,7 +3796,7 @@ lazy val `logstage-rendering-circe` = project.in(file("logstage/logstage-renderi
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -3794,11 +3808,32 @@ lazy val `logstage-rendering-circe` = project.in(file("logstage/logstage-renderi
     } },
     Test / packageDoc / publishArtifact := false
   )
+  .jvmSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .jsSettings(
+    crossScalaVersions := Seq(
+      "3.2.1",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head,
+    coverageEnabled := false,
+    scalaJSLinkerConfig := { scalaJSLinkerConfig.value.withModuleKind(ModuleKind.CommonJSModule) }
+  )
+lazy val `logstage-rendering-circeJVM` = `logstage-rendering-circe`.jvm
+  .disablePlugins(AssemblyPlugin)
+lazy val `logstage-rendering-circeJS` = `logstage-rendering-circe`.js
   .disablePlugins(AssemblyPlugin)
 
 lazy val `logstage-adapter-slf4j` = project.in(file("logstage/logstage-adapter-slf4j"))
   .dependsOn(
-    `logstage-core` % "test->test;compile->compile"
+    `logstage-coreJVM` % "test->test;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
@@ -3813,19 +3848,11 @@ lazy val `logstage-adapter-slf4j` = project.in(file("logstage/logstage-adapter-s
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -3899,7 +3926,7 @@ lazy val `logstage-adapter-slf4j` = project.in(file("logstage/logstage-adapter-s
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -3934,7 +3961,6 @@ lazy val `logstage-adapter-slf4j` = project.in(file("logstage/logstage-adapter-s
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -3950,7 +3976,7 @@ lazy val `logstage-adapter-slf4j` = project.in(file("logstage/logstage-adapter-s
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -3969,7 +3995,7 @@ lazy val `logstage-adapter-slf4j` = project.in(file("logstage/logstage-adapter-s
 
 lazy val `logstage-sink-slf4j` = project.in(file("logstage/logstage-sink-slf4j"))
   .dependsOn(
-    `logstage-core` % "test->test;compile->compile"
+    `logstage-coreJVM` % "test->test;compile->compile"
   )
   .settings(
     libraryDependencies ++= Seq(
@@ -3985,19 +4011,11 @@ lazy val `logstage-sink-slf4j` = project.in(file("logstage/logstage-sink-slf4j")
   .settings(
     crossScalaVersions := Seq(
       "3.2.1",
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -4071,7 +4089,7 @@ lazy val `logstage-sink-slf4j` = project.in(file("logstage/logstage-sink-slf4j")
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -4106,7 +4124,6 @@ lazy val `logstage-sink-slf4j` = project.in(file("logstage/logstage-sink-slf4j")
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -4122,7 +4139,7 @@ lazy val `logstage-sink-slf4j` = project.in(file("logstage/logstage-sink-slf4j")
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -4138,28 +4155,28 @@ lazy val `logstage-sink-slf4j` = project.in(file("logstage/logstage-sink-slf4j")
 
 lazy val `microsite` = project.in(file("doc/microsite"))
   .dependsOn(
-    `fundamentals-functional` % "test->compile;compile->compile",
-    `fundamentals-collections` % "test->compile;compile->compile",
-    `fundamentals-literals` % "test->compile;compile->compile",
-    `fundamentals-orphans` % "test->compile;compile->compile",
-    `fundamentals-language` % "test->compile;compile->compile",
-    `fundamentals-platform` % "test->compile;compile->compile",
-    `fundamentals-json-circe` % "test->compile;compile->compile",
-    `fundamentals-reflection` % "test->compile;compile->compile",
-    `fundamentals-bio` % "test->compile;compile->compile",
-    `distage-core-api` % "test->compile;compile->compile",
+    `fundamentals-functionalJVM` % "test->compile;compile->compile",
+    `fundamentals-collectionsJVM` % "test->compile;compile->compile",
+    `fundamentals-literalsJVM` % "test->compile;compile->compile",
+    `fundamentals-orphansJVM` % "test->compile;compile->compile",
+    `fundamentals-languageJVM` % "test->compile;compile->compile",
+    `fundamentals-platformJVM` % "test->compile;compile->compile",
+    `fundamentals-json-circeJVM` % "test->compile;compile->compile",
+    `fundamentals-reflectionJVM` % "test->compile;compile->compile",
+    `fundamentals-bioJVM` % "test->compile;compile->compile",
+    `distage-core-apiJVM` % "test->compile;compile->compile",
     `distage-core-proxy-bytebuddy` % "test->compile;compile->compile",
     `distage-framework-api` % "test->compile;compile->compile",
-    `distage-core` % "test->compile;compile->compile",
+    `distage-coreJVM` % "test->compile;compile->compile",
     `distage-extension-config` % "test->compile;compile->compile",
-    `distage-extension-logstage` % "test->compile;compile->compile",
+    `distage-extension-logstageJVM` % "test->compile;compile->compile",
     `distage-extension-plugins` % "test->compile;compile->compile",
     `distage-framework` % "test->compile;compile->compile",
     `distage-framework-docker` % "test->compile;compile->compile",
     `distage-testkit-core` % "test->compile;compile->compile",
     `distage-testkit-scalatest` % "test->compile;compile->compile",
-    `logstage-core` % "test->compile;compile->compile",
-    `logstage-rendering-circe` % "test->compile;compile->compile",
+    `logstage-coreJVM` % "test->compile;compile->compile",
+    `logstage-rendering-circeJVM` % "test->compile;compile->compile",
     `logstage-adapter-slf4j` % "test->compile;compile->compile",
     `logstage-sink-slf4j` % "test->compile;compile->compile"
   )
@@ -4181,19 +4198,11 @@ lazy val `microsite` = project.in(file("doc/microsite"))
   )
   .settings(
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -4267,7 +4276,7 @@ lazy val `microsite` = project.in(file("doc/microsite"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -4302,7 +4311,6 @@ lazy val `microsite` = project.in(file("doc/microsite"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -4318,7 +4326,7 @@ lazy val `microsite` = project.in(file("doc/microsite"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -4412,14 +4420,6 @@ lazy val `sbt-izumi-deps` = project.in(file("sbt-plugins/sbt-izumi-deps"))
     scalaVersion := crossScalaVersions.value.head,
     coverageEnabled := false,
     organization := "io.7mind.izumi",
-    Compile / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/main/scala" ,
-    Compile / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/main/scala-$v").distinct,
-    Compile / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/main/resources" ,
-    Test / unmanagedSourceDirectories += baseDirectory.value / ".jvm/src/test/scala" ,
-    Test / unmanagedSourceDirectories ++= (scalaBinaryVersion.value :: CrossVersion.partialVersion(scalaVersion.value).toList.map(_._1))
-      .map(v => baseDirectory.value / s".jvm/src/test/scala-$v").distinct,
-    Test / unmanagedResourceDirectories += baseDirectory.value / ".jvm/src/test/resources" ,
     scalacOptions ++= Seq(
       s"-Xmacro-settings:product-name=${name.value}",
       s"-Xmacro-settings:product-version=${version.value}",
@@ -4493,7 +4493,7 @@ lazy val `sbt-izumi-deps` = project.in(file("sbt-plugins/sbt-izumi-deps"))
         "-Ycache-plugin-class-loader:always",
         "-Ycache-macro-class-loader:last-modified"
       )
-      case (_, "2.13.8") => Seq(
+      case (_, "2.13.10") => Seq(
         "-Wconf:any:error",
         "-release:8",
         "-explaintypes",
@@ -4528,7 +4528,6 @@ lazy val `sbt-izumi-deps` = project.in(file("sbt-plugins/sbt-izumi-deps"))
       case (_, _) => Seq.empty
     } },
     scalacOptions -= "-Wconf:any:warning",
-    scalacOptions -= "-release:8",
     scalacOptions += "-Wconf:cat=deprecation:warning",
     scalacOptions += "-Wconf:msg=nowarn:silent",
     scalacOptions += "-Wconf:msg=parameter.value.x\\$4.in.anonymous.function.is.never.used:silent",
@@ -4544,7 +4543,7 @@ lazy val `sbt-izumi-deps` = project.in(file("sbt-plugins/sbt-izumi-deps"))
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
-      case (false, "2.13.8") => Seq(
+      case (false, "2.13.10") => Seq(
         "-opt:l:inline",
         "-opt-inline-from:izumi.**"
       )
@@ -4564,63 +4563,97 @@ lazy val `fundamentals` = (project in file(".agg/fundamentals-fundamentals"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
-    `fundamentals-functional`,
-    `fundamentals-collections`,
-    `fundamentals-literals`,
-    `fundamentals-orphans`,
-    `fundamentals-language`,
-    `fundamentals-platform`,
-    `fundamentals-json-circe`,
-    `fundamentals-reflection`,
-    `fundamentals-bio`
+    `fundamentals-functionalJVM`,
+    `fundamentals-functionalJS`,
+    `fundamentals-collectionsJVM`,
+    `fundamentals-collectionsJS`,
+    `fundamentals-literalsJVM`,
+    `fundamentals-literalsJS`,
+    `fundamentals-orphansJVM`,
+    `fundamentals-orphansJS`,
+    `fundamentals-languageJVM`,
+    `fundamentals-languageJS`,
+    `fundamentals-platformJVM`,
+    `fundamentals-platformJS`,
+    `fundamentals-json-circeJVM`,
+    `fundamentals-json-circeJS`,
+    `fundamentals-reflectionJVM`,
+    `fundamentals-reflectionJS`,
+    `fundamentals-bioJVM`,
+    `fundamentals-bioJS`
   )
 
 lazy val `fundamentals-jvm` = (project in file(".agg/fundamentals-fundamentals-jvm"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .disablePlugins(AssemblyPlugin)
+  .aggregate(
+    `fundamentals-functionalJVM`,
+    `fundamentals-collectionsJVM`,
+    `fundamentals-literalsJVM`,
+    `fundamentals-orphansJVM`,
+    `fundamentals-languageJVM`,
+    `fundamentals-platformJVM`,
+    `fundamentals-json-circeJVM`,
+    `fundamentals-reflectionJVM`,
+    `fundamentals-bioJVM`
+  )
+
+lazy val `fundamentals-js` = (project in file(".agg/fundamentals-fundamentals-js"))
+  .settings(
+    publish / skip := true,
+    crossScalaVersions := Seq(
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
-    `fundamentals-functional`,
-    `fundamentals-collections`,
-    `fundamentals-literals`,
-    `fundamentals-orphans`,
-    `fundamentals-language`,
-    `fundamentals-platform`,
-    `fundamentals-json-circe`,
-    `fundamentals-reflection`,
-    `fundamentals-bio`
+    `fundamentals-functionalJS`,
+    `fundamentals-collectionsJS`,
+    `fundamentals-literalsJS`,
+    `fundamentals-orphansJS`,
+    `fundamentals-languageJS`,
+    `fundamentals-platformJS`,
+    `fundamentals-json-circeJS`,
+    `fundamentals-reflectionJS`,
+    `fundamentals-bioJS`
   )
 
 lazy val `distage` = (project in file(".agg/distage-distage"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
-    `distage-core-api`,
+    `distage-core-apiJVM`,
+    `distage-core-apiJS`,
     `distage-core-proxy-bytebuddy`,
     `distage-framework-api`,
-    `distage-core`,
+    `distage-coreJVM`,
+    `distage-coreJS`,
     `distage-extension-config`,
-    `distage-extension-logstage`,
+    `distage-extension-logstageJVM`,
+    `distage-extension-logstageJS`,
     `distage-extension-plugins`,
     `distage-framework`,
     `distage-framework-docker`,
@@ -4632,19 +4665,43 @@ lazy val `distage-jvm` = (project in file(".agg/distage-distage-jvm"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .disablePlugins(AssemblyPlugin)
+  .aggregate(
+    `distage-core-apiJVM`,
+    `distage-core-proxy-bytebuddy`,
+    `distage-framework-api`,
+    `distage-coreJVM`,
+    `distage-extension-config`,
+    `distage-extension-logstageJVM`,
+    `distage-extension-plugins`,
+    `distage-framework`,
+    `distage-framework-docker`,
+    `distage-testkit-core`,
+    `distage-testkit-scalatest`
+  )
+
+lazy val `distage-js` = (project in file(".agg/distage-distage-js"))
+  .settings(
+    publish / skip := true,
+    crossScalaVersions := Seq(
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
-    `distage-core-api`,
+    `distage-core-apiJS`,
     `distage-core-proxy-bytebuddy`,
     `distage-framework-api`,
-    `distage-core`,
+    `distage-coreJS`,
     `distage-extension-config`,
-    `distage-extension-logstage`,
+    `distage-extension-logstageJS`,
     `distage-extension-plugins`,
     `distage-framework`,
     `distage-framework-docker`,
@@ -4656,15 +4713,17 @@ lazy val `logstage` = (project in file(".agg/logstage-logstage"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
-    `logstage-core`,
-    `logstage-rendering-circe`,
+    `logstage-coreJVM`,
+    `logstage-coreJS`,
+    `logstage-rendering-circeJVM`,
+    `logstage-rendering-circeJS`,
     `logstage-adapter-slf4j`,
     `logstage-sink-slf4j`
   )
@@ -4673,15 +4732,32 @@ lazy val `logstage-jvm` = (project in file(".agg/logstage-logstage-jvm"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
-    `logstage-core`,
-    `logstage-rendering-circe`,
+    `logstage-coreJVM`,
+    `logstage-rendering-circeJVM`,
+    `logstage-adapter-slf4j`,
+    `logstage-sink-slf4j`
+  )
+
+lazy val `logstage-js` = (project in file(".agg/logstage-logstage-js"))
+  .settings(
+    publish / skip := true,
+    crossScalaVersions := Seq(
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .disablePlugins(AssemblyPlugin)
+  .aggregate(
+    `logstage-coreJS`,
+    `logstage-rendering-circeJS`,
     `logstage-adapter-slf4j`,
     `logstage-sink-slf4j`
   )
@@ -4690,7 +4766,7 @@ lazy val `doc` = (project in file(".agg/doc-doc"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
@@ -4704,7 +4780,21 @@ lazy val `doc-jvm` = (project in file(".agg/doc-doc-jvm"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .disablePlugins(AssemblyPlugin)
+  .aggregate(
+    `microsite`
+  )
+
+lazy val `doc-js` = (project in file(".agg/doc-doc-js"))
+  .settings(
+    publish / skip := true,
+    crossScalaVersions := Seq(
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
@@ -4736,11 +4826,22 @@ lazy val `sbt-plugins-jvm` = (project in file(".agg/sbt-plugins-sbt-plugins-jvm"
     `sbt-izumi-deps`
   )
 
+lazy val `sbt-plugins-js` = (project in file(".agg/sbt-plugins-sbt-plugins-js"))
+  .settings(
+    publish / skip := true,
+    crossScalaVersions := Nil,
+    scalaVersion := "2.12.17"
+  )
+  .disablePlugins(AssemblyPlugin)
+  .aggregate(
+    `sbt-izumi-deps`
+  )
+
 lazy val `izumi-jvm` = (project in file(".agg/.agg-jvm"))
   .settings(
     publish / skip := true,
     crossScalaVersions := Seq(
-      "2.13.8",
+      "2.13.10",
       "2.12.17"
     ),
     scalaVersion := crossScalaVersions.value.head
@@ -4753,6 +4854,23 @@ lazy val `izumi-jvm` = (project in file(".agg/.agg-jvm"))
     `sbt-plugins-jvm`
   )
 
+lazy val `izumi-js` = (project in file(".agg/.agg-js"))
+  .settings(
+    publish / skip := true,
+    crossScalaVersions := Seq(
+      "2.13.10",
+      "2.12.17"
+    ),
+    scalaVersion := crossScalaVersions.value.head
+  )
+  .disablePlugins(AssemblyPlugin)
+  .aggregate(
+    `fundamentals-js`,
+    `distage-js`,
+    `logstage-js`,
+    `sbt-plugins-js`
+  )
+
 lazy val `izumi` = (project in file("."))
   .settings(
     publish / skip := true,
@@ -4786,7 +4904,7 @@ lazy val `izumi` = (project in file("."))
       s"-Xmacro-settings:git-head-commit=${com.github.sbt.git.SbtGit.GitKeys.gitHeadCommit.value.getOrElse("")}"
     ),
     crossScalaVersions := Nil,
-    scalaVersion := "2.13.8",
+    scalaVersion := "2.13.10",
     ThisBuild / organization := "io.7mind.izumi",
     sonatypeProfileName := "io.7mind",
     sonatypeSessionName := s"[sbt-sonatype] ${name.value} ${version.value} ${java.util.UUID.randomUUID}",
@@ -4804,7 +4922,7 @@ lazy val `izumi` = (project in file("."))
               Developer(id = "7mind", name = "Septimal Mind", url = url("https://github.com/7mind"), email = "team@7mind.io"),
             ),
     ThisBuild / scmInfo := Some(ScmInfo(url("https://github.com/7mind/izumi"), "scm:git:https://github.com/7mind/izumi.git")),
-    libraryDependencies += "io.7mind.izumi.sbt" % "sbtgen_2.13" % "0.0.98" % Provided
+    libraryDependencies += "io.7mind.izumi.sbt" % "sbtgen_2.13" % "0.0.97" % Provided
   )
   .disablePlugins(AssemblyPlugin)
   .aggregate(
diff --git a/fundamentals/fundamentals-platform/.jvm/src/main/scala/izumi/fundamentals/platform/resources/IzResources.scala b/fundamentals/fundamentals-platform/.jvm/src/main/scala/izumi/fundamentals/platform/resources/IzResources.scala
index 818f31fcd..c9ce15c72 100644
--- a/fundamentals/fundamentals-platform/.jvm/src/main/scala/izumi/fundamentals/platform/resources/IzResources.scala
+++ b/fundamentals/fundamentals-platform/.jvm/src/main/scala/izumi/fundamentals/platform/resources/IzResources.scala
@@ -1,6 +1,6 @@
 package izumi.fundamentals.platform.resources
 
-import java.io.{FileSystem => _, _}
+import java.io._
 import java.net.{URI, URL}
 import java.nio.file._
 import java.nio.file.attribute.BasicFileAttributes
diff --git a/logstage/logstage-core/src/main/scala-2/izumi/logstage/macros/LogMessageMacro.scala b/logstage/logstage-core/src/main/scala-2/izumi/logstage/macros/LogMessageMacro.scala
index 9a8a8ce3b..5b5c67e27 100644
--- a/logstage/logstage-core/src/main/scala-2/izumi/logstage/macros/LogMessageMacro.scala
+++ b/logstage/logstage-core/src/main/scala-2/izumi/logstage/macros/LogMessageMacro.scala
@@ -12,9 +12,9 @@ final class LogMessageMacroStrict(override val c: blackbox.Context) extends LogM
 class LogMessageMacro0[C <: blackbox.Context](val c: C, strict: Boolean) {
   private[this] final val nameExtractor = new ArgumentNameExtractionMacro[c.type](c, strict)
 
-  final def logMessageMacro(message: c.Expr[String]): c.Expr[Message] = {
-    import c.universe._
+  import c.universe._
 
+  final def logMessageMacro(message: c.Expr[String]): c.Expr[Message] = {
     message.tree match {
       case Typed(tree, _) =>
         processExpr(tree, isMultiline = false)
@@ -25,8 +25,6 @@ class LogMessageMacro0[C <: blackbox.Context](val c: C, strict: Boolean) {
 
   @scala.annotation.tailrec
   private[this] def processExpr(message: c.Tree, isMultiline: Boolean): c.Expr[Message] = {
-    import c.universe._
-
     sealed trait Chunk {
       def tree: Tree
     }
@@ -143,7 +141,16 @@ class LogMessageMacro0[C <: blackbox.Context](val c: C, strict: Boolean) {
       case PlusExtractor(lst) =>
         val namedArgs = nameExtractor.recoverArgNames(lst.arguments)
         val sc = lst.makeStringContext(isMultiline)
-        reifyContext(sc, namedArgs)
+        createMessageExpr(sc, namedArgs)
+
+      case Literal(Constant(s)) =>
+        val emptyArgs = reify(List.empty)
+        val sc = if (isMultiline) {
+          q"_root_.scala.StringContext(${s.toString}.stripMargin)"
+        } else {
+          q"_root_.scala.StringContext(${s.toString})"
+        }
+        createMessageExpr(sc, emptyArgs)
 
       case Apply(
             Select(stringContext @ Apply(Select(Select(Ident(TermName("scala")), TermName("StringContext")), TermName("apply")), _), TermName("s")),
@@ -152,7 +159,7 @@ class LogMessageMacro0[C <: blackbox.Context](val c: C, strict: Boolean) {
         // qq causes a weird warning here
         // case q"scala.StringContext.apply($stringContext).s(..$args)" =>
         val namedArgs = nameExtractor.recoverArgNames(args)
-        reifyContext(stringContext, namedArgs)
+        createMessageExpr(stringContext, namedArgs)
 
       case Select(
             Apply(
@@ -168,21 +175,26 @@ class LogMessageMacro0[C <: blackbox.Context](val c: C, strict: Boolean) {
           ) =>
         val namedArgs = nameExtractor.recoverArgNames(args)
         val sc = q"""_root_.scala.StringContext($stringContext.parts.map(_.stripMargin): _*)"""
-        reifyContext(sc, namedArgs)
+        createMessageExpr(sc, namedArgs)
 
-      // support .stripMargin in scala 2.13
-      case Select(Apply(_, List(Typed(tree, _))), TermName("stripMargin")) =>
-        processExpr(tree, isMultiline = true)
+      // support .stripMargin in scala 2.13 and 2.13.10
+      case Select(Apply(_, List(arg)), TermName("stripMargin")) =>
+        arg match {
+          case Typed(tree, _) =>
+            processExpr(tree, isMultiline = true)
+          case tree =>
+            processExpr(tree, isMultiline = true)
+        }
 
-      case Literal(Constant(s)) =>
-        val emptyArgs = reify(List.empty)
-        val sc = q"_root_.scala.StringContext(${s.toString})"
-        reifyContext(sc, emptyArgs)
+      case Typed(tree, _) =>
+        processExpr(tree, isMultiline)
 
       case other =>
         c.warning(
           other.pos,
-          s"""Complex expression found as an input for a logger: ${other.toString()} ; ${showRaw(other)}.
+          s"""Complex expression found as an input for a logger: ${other.toString()}
+             |
+             |Tree: ${showRaw(other)}
              |
              |But Logstage expects you to use string interpolations instead, such as:
              |${nameExtractor.example}
@@ -195,12 +207,11 @@ class LogMessageMacro0[C <: blackbox.Context](val c: C, strict: Boolean) {
           ...
          */
         val sc = q"_root_.scala.StringContext($other)"
-        reifyContext(sc, emptyArgs)
+        createMessageExpr(sc, emptyArgs)
     }
   }
 
-  private[this] def reifyContext(stringContext: c.Tree, namedArgs: c.Expr[List[LogArg]]): c.Expr[Message] = {
-    import c.universe._
+  private[this] def createMessageExpr(stringContext: c.Tree, namedArgs: c.Expr[List[LogArg]]): c.Expr[Message] = {
     reify {
       Message(
         c.Expr[StringContext](stringContext).splice,
diff --git a/project/Deps.sc b/project/Deps.sc
index e5b4f994a..77a15ec37 100644
--- a/project/Deps.sc
+++ b/project/Deps.sc
@@ -1,4 +1,4 @@
-import $ivy.`io.7mind.izumi.sbt:sbtgen_2.13:0.0.98`
+import $ivy.`io.7mind.izumi.sbt:sbtgen_2.13:0.0.97`
 import izumi.sbtgen._
 import izumi.sbtgen.model._
 
@@ -145,7 +145,7 @@ object Izumi {
 
   // DON'T REMOVE, these variables are read from CI build (build.sh)
   final val scala212 = ScalaVersion("2.12.17")
-  final val scala213 = ScalaVersion("2.13.8")
+  final val scala213 = ScalaVersion("2.13.10")
   final val scala300 = ScalaVersion("3.2.1")
 
   object Groups {
@@ -281,7 +281,6 @@ object Izumi {
           SettingKey.Default := Const.EmptySeq,
         ),
         "scalacOptions" -= "-Wconf:any:warning",
-        "scalacOptions" -= "-release:8", // FIXME: pending 2.13.10
         "scalacOptions" += "-Wconf:cat=deprecation:warning",
         "scalacOptions" += "-Wconf:msg=nowarn:silent",
         "scalacOptions" += "-Wconf:msg=parameter.value.x\\\\$4.in.anonymous.function.is.never.used:silent",
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 465a2c1c5..5651a1034 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,10 +1,21 @@
 // DO NOT EDIT THIS FILE
 // IT IS AUTOGENERATED BY `sbtgen.sc` SCRIPT
 // ALL CHANGES WILL BE LOST
+// https://www.scala-js.org/
+addSbtPlugin("org.scala-js" % "sbt-scalajs" % PV.scala_js_version)
+
+// https://github.com/portable-scala/sbt-crossproject
+addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0")
+
+// https://scalacenter.github.io/scalajs-bundler/
+addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.21.1")
+
+// https://github.com/scala-js/jsdependencies
+addSbtPlugin("org.scala-js" % "sbt-jsdependencies" % "1.0.2")
 
 ////////////////////////////////////////////////////////////////////////////////
 
-addSbtPlugin("io.7mind.izumi.sbt" % "sbt-izumi" % "0.0.98")
+addSbtPlugin("io.7mind.izumi.sbt" % "sbt-izumi" % "0.0.97")
 
 addSbtPlugin("com.eed3si9n" % "sbt-assembly" % PV.sbt_assembly)
 


Test patch:
diff --git a/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala b/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala
index 31ee3fa0f..f119ab032 100644
--- a/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala
+++ b/distage/distage-core/src/test/scala/izumi/distage/injector/ZIOHasInjectionTest.scala
@@ -311,7 +311,7 @@ class ZIOHasInjectionTest extends AnyWordSpec with MkInjector {
 
       object MyPlugin extends ModuleDef {
         make[MyClient].fromHas[OpenTracing with Has[MyPublisher] with Has[SttpBackend[Task, ZioStreams with WebSockets]] with Has[MyEndpoints[IO]], Nothing, MyClient] {
-          ??? : zio.ZIO[OpenTracing with Has[MyPublisher] with Has[SttpBackend[Task, ZioStreams with WebSockets]] with Has[MyEndpoints[IO]], Nothing, MyClient]
+          ZIO.succeed(???): ZIO[OpenTracing with Has[MyPublisher] with Has[SttpBackend[Task, ZioStreams with WebSockets]] with Has[MyEndpoints[IO]], Nothing, MyClient]
         }
       }
       val _ = MyPlugin
diff --git a/logstage/logstage-core/src/test/scala/izumi/logstage/api/BasicLoggingTest.scala b/logstage/logstage-core/src/test/scala/izumi/logstage/api/BasicLoggingTest.scala
index b4a9517bf..e29dbeabf 100644
--- a/logstage/logstage-core/src/test/scala/izumi/logstage/api/BasicLoggingTest.scala
+++ b/logstage/logstage-core/src/test/scala/izumi/logstage/api/BasicLoggingTest.scala
@@ -8,7 +8,6 @@ import org.scalatest.wordspec.AnyWordSpec
 
 import scala.util.Random
 
-@nowarn("msg=[Ee]xpression.*logger")
 class BasicLoggingTest extends AnyWordSpec {
 
   "Argument extraction macro" should {
@@ -16,7 +15,7 @@ class BasicLoggingTest extends AnyWordSpec {
       val arg1 = 1
       val arg2 = "argument 2"
 
-      val message = Message(s"argument1: $arg1, argument2: $arg2, argument2 again: $arg2, expression ${2 + 2}, ${2 + 2}")
+      val message = Message(s"argument1: $arg1, argument2: $arg2, argument2 again: $arg2, expression ${2 + 2}, ${2 + 2}"): @nowarn("msg=Constant expression")
 
       val expectation = if (IzScala.scalaRelease.major == 3) {
         // on scala3 we get access to exact raw tree w/o optimizations
@@ -42,7 +41,7 @@ class BasicLoggingTest extends AnyWordSpec {
       assert(message.args == expectation)
       assert(message.template.parts == expectedParts)
 
-      val message1 = Message(s"expression: ${Random.self.nextInt() + 1}")
+      val message1 = Message(s"expression: ${Random.self.nextInt() + 1}"): @nowarn("msg=Expression")
       assert(message1.args.head.name == "EXPRESSION:scala.util.Random.self.nextInt().+(1)")
       assert(message1.template.parts == List("expression: ", ""))
     }
@@ -98,9 +97,9 @@ class BasicLoggingTest extends AnyWordSpec {
     }
     "allow concatenating Log.Message" should {
       "multiple parts" in {
-        val msg1 = Message(s"begin1${1.1}middle1${1.2}end1")
-        val msg2 = Message(s"begin2 ${2.1} middle2 ${2.2} end2 ")
-        val msg3 = Message(s" begin3${3.1}middle3 ${3.2}end3")
+        val msg1 = Message(s"begin1${1.1}middle1${1.2}end1"): @nowarn("msg=Constant expression")
+        val msg2 = Message(s"begin2 ${2.1} middle2 ${2.2} end2 "): @nowarn("msg=Constant expression")
+        val msg3 = Message(s" begin3${3.1}middle3 ${3.2}end3"): @nowarn("msg=Constant expression")
 
         val msgConcatenated = msg1 + msg2 + msg3
 
@@ -120,7 +119,7 @@ class BasicLoggingTest extends AnyWordSpec {
       }
       "one part" in {
         val msg1 = Message(s"begin1")
-        val msg2 = Message(s"${2}")
+        val msg2 = Message(s"${2}"): @nowarn("msg=Constant expression")
         val msg3 = Message(s"end3")
 
         val msgConcatenated = msg1 + msg2 + msg3