diff --git a/build.sbt b/build.sbt index 0c982301f..332bd98af 100644 --- a/build.sbt +++ b/build.sbt @@ -3,6 +3,7 @@ import org.openqa.selenium.firefox.{FirefoxDriverLogLevel, FirefoxOptions} import org.scalajs.jsdependencies.sbtplugin.JSModuleID import org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv import org.scalajs.jsenv.selenium.SeleniumJSEnv +import sbtcrossproject.CrossProject name := "udash" @@ -141,25 +142,21 @@ def jvmProject(proj: Project): Project = sourceDirsSettings(_ / ".jvm"), ) + +def sharedProject(cross: CrossProject.Builder): CrossProject = { + cross + .crossType(CrossType.Pure) + .withoutSuffixFor(JVMPlatform) + .settings(commonSettings) + .jsSettings(commonJsSettings) + .platformsEnablePlugins(JSPlatform)(JSDependenciesPlugin) +} + def jsProject(proj: Project): Project = proj.in(proj.base / ".js") .enablePlugins(ScalaJSPlugin, JSDependenciesPlugin) .settings(commonJsSettings) -def jsProjectFor(jsProj: Project, jvmProj: Project): Project = - jsProj.in(jvmProj.base / ".js") - .enablePlugins(ScalaJSPlugin, JSDependenciesPlugin) - .configure(p => if (forIdeaImport) p.dependsOn(jvmProj) else p) - .settings( - commonJsSettings, - - moduleName := (jvmProj / moduleName).value, - sourceDirsSettings(_.getParentFile), - - // workaround for some cross-compilation problems in IntelliJ - libraryDependencies ++= (if (forIdeaImport) (jvmProj / libraryDependencies).value else Seq.empty) - ) - def frontendExecutable(proj: Project)( staticsRoot: String, jsDeps: Def.Initialize[Seq[JSModuleID]], @@ -247,14 +244,12 @@ lazy val udash = project.in(file(".")) ideSkipProject := false, ) -//for simplifying Travis build matrix and project dependencies -lazy val jvmLibraries = Seq[ProjectReference](macros, utils, core, rpc, rest, `rest-jetty`, i18n, auth, css) lazy val `udash-jvm` = project.in(file(".jvm")) - .aggregate(jvmLibraries: _*) + .aggregate(utils.jvm, core.jvm, rpc.jvm, rest.jvm, `rest-jetty`, i18n.jvm, auth.jvm, css.jvm) .settings(aggregateProjectSettings) lazy val jsLibraries = Seq[ProjectReference]( - macros, `utils-js`, `core-js`, `rpc-js`, `rest-js`, `i18n-js`, `auth-js`, `css-js`, bootstrap4 + utils.js, core.js, rpc.js, rest.js, i18n.js, auth.js, css.js, bootstrap4 ) lazy val `udash-js` = project.in(file(".js")) .aggregate(jsLibraries: _*) @@ -266,88 +261,43 @@ lazy val macros = project libraryDependencies ++= Dependencies.macroDeps.value, ) -lazy val utils = jvmProject(project) - .dependsOn(macros) - .settings( - libraryDependencies ++= Dependencies.utilsJvmDeps.value, - ) +lazy val utils = sharedProject(crossProject(JVMPlatform, JSPlatform)) + .configure(_.dependsOn(macros)) + .settings(libraryDependencies ++= Dependencies.utilsCrossDeps.value) + .jvmSettings(libraryDependencies ++= Dependencies.utilsJvmDeps.value) + .jsSettings(libraryDependencies ++= Dependencies.utilsSjsDeps.value) -lazy val `utils-js` = jsProjectFor(project, utils) - .dependsOn(macros) - .settings( - libraryDependencies ++= Dependencies.utilsSjsDeps.value, - ) - -lazy val core = jvmProject(project) +lazy val core = sharedProject(crossProject(JVMPlatform, JSPlatform)) .dependsOn(utils % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.coreJvmDeps.value, - ) + .settings(libraryDependencies ++= Dependencies.coreCrossDeps.value) -lazy val `core-js` = jsProjectFor(project, core) - .dependsOn(`utils-js` % CompileAndTest) - .settings( - testInBrowser, - libraryDependencies ++= Dependencies.coreSjsDeps.value, - ) - -lazy val rpc = jvmProject(project) +lazy val rpc = sharedProject(crossProject(JVMPlatform, JSPlatform)) .dependsOn(utils % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.rpcJvmDeps.value, - ) - -lazy val `rpc-js` = jsProjectFor(project, rpc) - .dependsOn(`utils-js` % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.rpcSjsDeps.value, - jsDependencies ++= Dependencies.rpcJsDeps.value, - ) + .settings(libraryDependencies ++= Dependencies.rpcCrossDeps.value) + .jvmSettings(libraryDependencies ++= Dependencies.rpcJvmDeps.value) + .jsSettings(jsDependencies ++= Dependencies.rpcJsDeps.value) -lazy val rest = jvmProject(project) +lazy val rest = sharedProject(crossProject(JVMPlatform, JSPlatform)) .dependsOn(utils % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.restJvmDeps.value, - ) - -lazy val `rest-js` = jsProjectFor(project, rest) - .dependsOn(`utils-js` % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.restSjsDeps.value, - ) + .jvmSettings(libraryDependencies ++= Dependencies.restJvmDeps.value) + .jsSettings(libraryDependencies ++= Dependencies.restSjsDeps.value) lazy val `rest-jetty` = jvmProject(project.in(file("rest/jetty"))) - .dependsOn(rest % CompileAndTest) + .dependsOn(rest.jvm % CompileAndTest) .settings( libraryDependencies ++= Dependencies.restJettyDeps.value, ) -lazy val i18n = jvmProject(project) - .dependsOn(core % CompileAndTest, rpc % CompileAndTest) +lazy val i18n = sharedProject(crossProject(JVMPlatform, JSPlatform)).dependsOn(core, rpc) -lazy val `i18n-js` = jsProjectFor(project, i18n) - .dependsOn(`core-js` % CompileAndTest, `rpc-js` % CompileAndTest) +lazy val auth = sharedProject(crossProject(JVMPlatform, JSPlatform)).dependsOn(core, rpc) -lazy val auth = jvmProject(project) - .dependsOn(core % CompileAndTest, rpc) - -lazy val `auth-js` = jsProjectFor(project, auth) - .dependsOn(`core-js` % CompileAndTest, `rpc-js`) - -lazy val css = jvmProject(project) - .dependsOn(core % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.cssJvmDeps.value, - ) - -lazy val `css-js` = jsProjectFor(project, css) - .dependsOn(`core-js` % CompileAndTest) - .settings( - libraryDependencies ++= Dependencies.cssSjsDeps.value, - ) +lazy val css = sharedProject(crossProject(JVMPlatform, JSPlatform)) + .dependsOn(core) + .settings(libraryDependencies ++= Dependencies.cssCrossDeps.value) lazy val bootstrap4 = jsProject(project) - .dependsOn(`core-js` % CompileAndTest, `css-js`, `i18n-js` % Test) + .dependsOn(core.js % CompileAndTest, css.js, i18n.js % Test) .settings( testInBrowser, libraryDependencies ++= Dependencies.bootstrap4SjsDeps.value, @@ -376,7 +326,7 @@ val compileAndOptimizeStatics = taskKey[File]( ) lazy val guide = project.in(file("guide")) - .aggregate(`guide-shared`, `guide-shared-js`, `guide-backend`, `guide-commons`, `guide-homepage`, + .aggregate(`guide-shared`.jvm, `guide-shared`.js, `guide-backend`, `guide-commons`, `guide-homepage`, `guide-guide`, `guide-packager`, `guide-selenium`) .settings( aggregateProjectSettings, @@ -384,24 +334,19 @@ lazy val guide = project.in(file("guide")) ) lazy val `guide-shared` = - jvmProject(project.in(file("guide/shared"))) - .dependsOn(jvmLibraries.map(p => p: ClasspathDep[ProjectReference]): _*) - .settings( - noPublishSettings, - crossScalaVersions := Seq(Dependencies.versionOfScala), - ) - -lazy val `guide-shared-js` = - jsProjectFor(project, `guide-shared`) - .dependsOn(jsLibraries.map(p => p: ClasspathDep[ProjectReference]): _*) + sharedProject(crossProject(JVMPlatform, JSPlatform)) + .dependsOn(utils, core, rpc, rest, i18n, auth, css) + .jvmConfigure(_.dependsOn(`rest-jetty`)) + .jsConfigure(_.dependsOn(bootstrap4)) .settings( noPublishSettings, crossScalaVersions := Seq(Dependencies.versionOfScala), ) + .in(file("guide/shared")) lazy val `guide-backend` = jvmProject(project.in(file("guide/backend"))) - .dependsOn(`guide-shared`) + .dependsOn(`guide-shared`.jvm) .settings( noPublishSettings, crossScalaVersions := Seq(Dependencies.versionOfScala), @@ -412,7 +357,7 @@ lazy val `guide-backend` = lazy val `guide-commons` = jsProject(project.in(file("guide/commons"))) .enablePlugins(SbtWeb) - .dependsOn(`guide-shared-js`) + .dependsOn(`guide-shared`.js) .settings( noPublishSettings, crossScalaVersions := Seq(Dependencies.versionOfScala), diff --git a/project/Dependencies.scala b/project/Dependencies.scala index a6d3c1af7..acad3b195 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -59,7 +59,6 @@ object Dependencies { ).map(_ % Test)) val macroDeps = Def.setting(Seq( - "org.scala-lang" % "scala-reflect" % scalaVersion.value, "com.avsystem.commons" %% "commons-macros" % avsCommonsVersion, )) @@ -67,35 +66,29 @@ object Dependencies { "com.avsystem.commons" %%% "commons-core" % avsCommonsVersion, )) - val utilsJvmDeps = Def.setting(utilsCrossDeps.value ++ Seq( - "com.typesafe.scala-logging" %% "scala-logging" % scalaLoggingVersion + val utilsJvmDeps = Def.setting(Seq( + "com.typesafe.scala-logging" %% "scala-logging" % scalaLoggingVersion, )) - val utilsSjsDeps = Def.setting(utilsCrossDeps.value ++ Seq( + val utilsSjsDeps = Def.setting(Seq( "org.scala-js" %%% "scalajs-dom" % scalaJsDomVersion, )) - private val coreCrossDeps = Def.setting(Seq( + val coreCrossDeps = Def.setting(Seq( "com.lihaoyi" %%% "scalatags" % scalaTagsVersion )) - val coreJvmDeps = coreCrossDeps - - val coreSjsDeps = coreCrossDeps - - private val rpcCrossDeps = Def.setting(Seq( + val rpcCrossDeps = Def.setting(Seq( "com.lihaoyi" %%% "upickle" % upickleVersion % Test, "io.circe" %%% "circe-core" % circeVersion % Test, "io.circe" %%% "circe-parser" % circeVersion % Test, )) - val rpcJvmDeps = Def.setting(rpcCrossDeps.value ++ Seq( + val rpcJvmDeps = Def.setting(Seq( "javax.servlet" % "javax.servlet-api" % servletVersion, "org.atmosphere" % "atmosphere-runtime" % atmosphereVersion )) - val rpcSjsDeps = rpcCrossDeps - val rpcJsDeps = Def.setting(Seq( "org.webjars" % "atmosphere-javascript" % atmosphereJSVersion / s"$atmosphereJSVersion/atmosphere.js" minified s"$atmosphereJSVersion/atmosphere-min.js" @@ -123,16 +116,10 @@ object Dependencies { "org.eclipse.jetty" % "jetty-client" % jettyVersion )) - private val cssCrossDeps = Def.setting(Seq( + val cssCrossDeps = Def.setting(Seq( "com.github.japgolly.scalacss" %%% "core" % scalaCssVersion, )) - val cssJvmDeps = cssCrossDeps - - val cssSjsDeps = Def.setting(cssCrossDeps.value ++ Seq( - "com.lihaoyi" %%% "scalatags" % scalaTagsVersion, - )) - val bootstrap4SjsDeps = Def.setting(Seq( "io.udash" %%% "udash-jquery" % jqueryWrapperVersion, )) diff --git a/project/plugins.sbt b/project/plugins.sbt index b8958dea0..7ff52373d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -3,6 +3,7 @@ logLevel := Level.Warn libraryDependencies += "org.scala-js" %% "scalajs-env-selenium" % "1.1.1" libraryDependencies += "org.scala-js" %% "scalajs-env-jsdom-nodejs" % "1.1.0" +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.2.0") addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0") addSbtPlugin("org.scala-js" % "sbt-jsdependencies" % "1.0.2") addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.6.4")