From 60d10b25ee786f591c78e7b2b163da5511b57ac5 Mon Sep 17 00:00:00 2001 From: mushtaq Date: Sat, 19 Sep 2020 14:11:26 +0530 Subject: [PATCH] Fix #115: Add ESModule support --- build.sbt | 25 +++++++---- .../scalajs/jsenv/selenium/SeleniumRun.scala | 41 ++++++++++++------- .../scalajs/jsenv/selenium/CamelCase.scala | 5 +++ .../jsenv/selenium/CamelcaseEsModule.scala | 10 +++++ .../jsenv/selenium/CamelCaseTest.scala | 10 +++++ .../scalajs/jsenv/selenium/LocationTest.scala | 14 +++++++ 6 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelCase.scala create mode 100644 seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelcaseEsModule.scala create mode 100644 seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/CamelCaseTest.scala create mode 100644 seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/LocationTest.scala diff --git a/build.sbt b/build.sbt index f723cbf..758b453 100644 --- a/build.sbt +++ b/build.sbt @@ -64,6 +64,16 @@ val testSettings: Seq[Setting[_]] = commonSettings ++ Seq( scalaJSUseMainModuleInitializer := true ) +val httpTestSettings: Seq[Setting[_]] = testSettings ++ Seq( + jsEnv := { + new SeleniumJSEnv( + jsEnvCapabilities.value, + SeleniumJSEnv.Config() + .withMaterializeInServer("tmp", "http://localhost:8080/tmp/") + ) + } +) + // We'll need the name scalajs-env-selenium for the `seleniumJSEnv` project name := "root" @@ -127,13 +137,12 @@ lazy val seleniumJSEnvTest: Project = project. lazy val seleniumJSHttpEnvTest: Project = project. enablePlugins(ScalaJSPlugin). enablePlugins(ScalaJSJUnitPlugin). - settings(testSettings). + settings(httpTestSettings) + +lazy val seleniumJSHttpESModuleEnvTest: Project = project. + enablePlugins(ScalaJSPlugin). + enablePlugins(ScalaJSJUnitPlugin). + settings(httpTestSettings). settings( - jsEnv := { - new SeleniumJSEnv( - jsEnvCapabilities.value, - SeleniumJSEnv.Config() - .withMaterializeInServer("tmp", "http://localhost:8080/tmp/") - ) - } + scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.ESModule) } ) diff --git a/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/SeleniumRun.scala b/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/SeleniumRun.scala index 3c08ce5..a5e1c26 100644 --- a/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/SeleniumRun.scala +++ b/seleniumJSEnv/src/main/scala/org/scalajs/jsenv/selenium/SeleniumRun.scala @@ -10,6 +10,8 @@ import scala.util.control.NonFatal import java.util.concurrent.{ConcurrentLinkedQueue, Executors} import java.util.function.Consumer +import java.nio.file.Path +import java.net.URL private sealed class SeleniumRun( driver: WebDriver with JavascriptExecutor, @@ -129,20 +131,19 @@ private[selenium] object SeleniumRun { newRun: Ctor[T], failed: Throwable => T): T = { validator.validate(runConfig) - val scripts = input.map { - case Input.Script(s) => s - case _ => throw new UnsupportedInputException(input) + var scripts: Seq[Path] = Seq.empty + var modules: Seq[Path] = Seq.empty + + input.foreach { + case Input.Script(s) => scripts :+= s + case Input.ESModule(s) => modules :+= s + case _ => throw new UnsupportedInputException(input) } try { withCleanup(FileMaterializer(config.materialization))(_.close()) { m => - val allScriptURLs = ( - m.materialize("setup.js", JSSetup.setupCode(enableCom)) +: - scripts.map(m.materialize) - ) - - val page = m.materialize("scalajsRun.html", htmlPage(allScriptURLs)) - + val setupJsUrl = m.materialize("setup.js", JSSetup.setupCode(enableCom)) + val page = m.materialize("scalajsRun.html", htmlPage(setupJsUrl, input, m)) withCleanup(newDriver())(maybeCleanupDriver(_, config)) { driver => driver.navigate().to(page) @@ -171,13 +172,25 @@ private[selenium] object SeleniumRun { private def maybeCleanupDriver(d: WebDriver, config: SeleniumJSEnv.Config) = if (!config.keepAlive) d.close() - private def htmlPage(scripts: Seq[java.net.URL]): String = { - val scriptTags = - scripts.map(path => s"") + private def htmlPage(setupJsUrl: URL, input: Seq[Input], materializer: FileMaterializer): String = { + val setupJs = s"" + + val tags = input.map { + case Input.Script(path) => + val url = materializer.materialize(path) + s"" + case Input.ESModule(path) => + val url = materializer.materialize(path) + s"" + case _ => throw new UnsupportedInputException(input) + } + + val allTags = setupJs +: tags + s""" | | - | ${scriptTags.mkString("\n ")} + | ${allTags.mkString("\n ")} | | """.stripMargin diff --git a/seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelCase.scala b/seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelCase.scala new file mode 100644 index 0000000..e6a6775 --- /dev/null +++ b/seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelCase.scala @@ -0,0 +1,5 @@ +package org.scalajs.jsenv.selenium + +object CamelCase { + def hello(input: String): String = s"Hello ${CamelcaseEsModule(input)}!" +} diff --git a/seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelcaseEsModule.scala b/seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelcaseEsModule.scala new file mode 100644 index 0000000..50071e6 --- /dev/null +++ b/seleniumJSHttpESModuleEnvTest/src/main/scala/org/scalajs/jsenv/selenium/CamelcaseEsModule.scala @@ -0,0 +1,10 @@ +package org.scalajs.jsenv.selenium + +import scala.scalajs.js +import scala.scalajs.js.annotation.JSImport + +@JSImport("https://cdn.skypack.dev/camelcase@^6.0.0", JSImport.Default) +@js.native +object CamelcaseEsModule extends js.Object { + def apply(input: String): String = js.native +} diff --git a/seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/CamelCaseTest.scala b/seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/CamelCaseTest.scala new file mode 100644 index 0000000..1dae43d --- /dev/null +++ b/seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/CamelCaseTest.scala @@ -0,0 +1,10 @@ +package org.scalajs.jsenv.selenium + +import org.junit.Assert._ +import org.junit.Test + +class CamelCaseTest { + @Test def CamelCaseTest(): Unit = { + assertEquals("Hello scalaJsSelenium!", CamelCase.hello("scala js selenium")) + } +} diff --git a/seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/LocationTest.scala b/seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/LocationTest.scala new file mode 100644 index 0000000..bd8d2d8 --- /dev/null +++ b/seleniumJSHttpESModuleEnvTest/src/test/scala/org/scalajs/jsenv/selenium/LocationTest.scala @@ -0,0 +1,14 @@ +package org.scalajs.jsenv.selenium + +import org.junit.Assert._ +import org.junit.Test + +import scala.scalajs.js.Dynamic.global + +class LocationTest { + + @Test def LocationTest(): Unit = { + assertEquals("http:", global.window.location.protocol.toString()) + assertEquals("localhost:8080", global.window.location.host.toString()) + } +}