Skip to content

Commit

Permalink
Merge branch 'master' into update/interface-0.0.25
Browse files Browse the repository at this point in the history
  • Loading branch information
scala-steward committed Sep 2, 2020
2 parents cdbec59 + 8488bb7 commit 038d9b8
Show file tree
Hide file tree
Showing 11 changed files with 95 additions and 110 deletions.
25 changes: 12 additions & 13 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ def scala211 = "2.11.12"
def scala213 = "2.13.2"
def scala3 = "0.26.0-RC1"

def scalajs = "0.6.32"
def scalajsBinaryVersion = "0.6"
def scalajs = "1.1.1"
def scalajsBinaryVersion = "1"
def scalajsDom = "1.0.0"

def isScala2(v: Option[(Long, Long)]): Boolean = v.exists(_._1 == 2)
Expand All @@ -23,6 +23,10 @@ val isScala3 = Def.setting {
VersionNumber(scalaVersion.value).matchesSemVer(SemanticSelector("<=1.0.0 || >=3.0.0"))
}

val isScalaJs1 = Def.setting {
VersionNumber(scalaJSVersion).matchesSemVer(SemanticSelector(">=1.0.0"))
}

def multiScalaDirectories(projectName: String) =
Def.setting {
val root = baseDirectory.in(ThisBuild).value / projectName
Expand Down Expand Up @@ -106,8 +110,8 @@ lazy val sharedSettings = List(

val V = new {
val scalameta = "4.3.20"
val munit = "0.7.10"
val coursier = "0.0.25"
val munit = "0.7.11"
val coursier = "0.0.24"
}

lazy val pprintVersion = Def.setting {
Expand Down Expand Up @@ -239,15 +243,10 @@ val jsdocs = project
.settings(
sharedSettings,
skip in publish := true,
scalaJSModuleKind := ModuleKind.CommonJSModule,
crossScalaVersions -= scala3,
libraryDependencies ++= {
if (isScala213.value) Nil
else
List(
"in.nvilla" %%% "monadic-html" % "0.4.0-RC1"
)
scalaJSLinkerConfig ~= {
_.withModuleKind(ModuleKind.CommonJSModule)
},
crossScalaVersions -= scala3,
libraryDependencies ++= List(
"org.scala-js" %%% "scalajs-dom" % scalajsDom
),
Expand Down Expand Up @@ -345,7 +344,7 @@ lazy val js = project
scala212LibraryDependencies(
List(
"org.scala-js" % "scalajs-compiler" % scalajs cross CrossVersion.full,
"org.scala-js" %% "scalajs-tools" % scalajs
"org.scala-js" %% "scalajs-linker" % scalajs
)
)
)
Expand Down
31 changes: 0 additions & 31 deletions docs/js.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,37 +32,6 @@ setInterval({ () =>
}, 100)
```

<p></p>

A good use-case for `mdoc:js` code fences is interactive documentation. For
example, here below is a counter implemented with
[monadic-html](https://github.com/OlivierBlanvillain/monadic-html).

````md
```scala mdoc:js
import mhtml._
val counter = Var(0)
val component =
<div>
<button onclick={() => counter.update(_ - 1)}>-</button>
{counter}
<button onclick={() => counter.update(_ + 1)}>+</button>
</div>
mount(node, component)
```
````

```scala mdoc:js:invisible
import mhtml._
val counter = Var(0)
val component =
<div>
<button onclick={() => counter.update(_ - 1)}>-</button>
{counter}
<button onclick={() => counter.update(_ + 1)}>+</button>
</div>
mount(node, component)
```

## Installation

Expand Down
4 changes: 2 additions & 2 deletions mdoc-js/src/main/resources/mdoc.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

function loadAll(scope) {
findDivs().forEach(function(el) {
var id = el.getAttribute("id");
scope[id](el);
var id = el.getAttribute("id").replace("-html-", "_js_");
eval(id)(el);
});
}

Expand Down
4 changes: 2 additions & 2 deletions mdoc-js/src/main/scala-2.12/mdoc/modifiers/JsConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package mdoc.modifiers
import mdoc.OnLoadContext
import mdoc.PostProcessContext
import mdoc.internal.pos.PositionSyntax._
import org.scalajs.core.tools.linker.backend.ModuleKind
import org.scalajs.core.tools.logging.Level
import org.scalajs.linker.interface.ModuleKind
import org.scalajs.logging.Level
import scala.meta.internal.io.PathIO
import scala.meta.io.AbsolutePath
import scala.meta.io.Classpath
Expand Down
101 changes: 58 additions & 43 deletions mdoc-js/src/main/scala-2.12/mdoc/modifiers/JsModifier.scala
Original file line number Diff line number Diff line change
@@ -1,45 +1,51 @@
package mdoc.modifiers

import mdoc.OnLoadContext
import mdoc.PostProcessContext
import mdoc.PreModifierContext
import mdoc.{OnLoadContext, PostProcessContext, PreModifierContext}
import mdoc.internal.cli.InputFile
import mdoc.internal.io.ConsoleReporter
import mdoc.internal.livereload.Resources
import mdoc.internal.markdown.CodeBuilder
import mdoc.internal.markdown.Gensym
import mdoc.internal.markdown.MarkdownCompiler
import mdoc.internal.markdown.{CodeBuilder, Gensym, MarkdownCompiler}
import mdoc.internal.pos.PositionSyntax._
import mdoc.internal.pos.TokenEditDistance
import org.scalajs.core.tools.io.IRFileCache
import org.scalajs.core.tools.io.IRFileCache.VirtualRelativeIRFile
import org.scalajs.core.tools.io.MemVirtualSerializedScalaJSIRFile
import org.scalajs.core.tools.io.VirtualScalaJSIRFile
import org.scalajs.core.tools.io.WritableMemVirtualJSFile
import org.scalajs.core.tools.linker.Linker
import org.scalajs.core.tools.linker.StandardLinker
import org.scalajs.core.tools.logging.Level
import org.scalajs.core.tools.logging.Logger
import org.scalajs.core.tools.sem.Semantics
import org.scalajs.linker.interface.{IRContainer, Linker, Semantics}
import org.scalajs.linker.standard.StandardIRFileCache
import org.scalajs.logging.{Level, Logger}

import scala.collection.mutable.ListBuffer
import scala.meta.Term
import scala.meta.inputs.Input
import scala.meta.io.Classpath
import scala.meta.io.{AbsolutePath, Classpath}
import scala.reflect.io.VirtualDirectory
import mdoc.internal.cli.InputFile
import scala.meta.io.AbsolutePath
import org.scalajs.linker.interface.StandardConfig
import org.scalajs.linker.StandardImpl
import org.scalajs.linker.PathIRContainer
import scala.concurrent.ExecutionContext
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import org.scalajs.linker.interface.IRFile
import org.scalajs.linker.PathIRFile
import org.scalajs.linker.standard.MemIRFileImpl
import org.scalajs.linker.interface.LinkerOutput
import org.scalajs.linker.MemOutputFile
import java.util.concurrent.Executor

class JsModifier extends mdoc.PreModifier {
override val name = "js"
override def toString: String = s"JsModifier($config)"
val irCache = new IRFileCache
val irCache = new StandardIRFileCache
val target = new VirtualDirectory("(memory)", None)
var maybeCompiler: Option[MarkdownCompiler] = None
var config = JsConfig()
var linker: Linker = newLinker()
var virtualIrFiles: Seq[VirtualRelativeIRFile] = Nil
var virtualIrFiles: Seq[IRFile] = Nil
var classpathHash: Int = 0
var reporter: mdoc.Reporter = new ConsoleReporter(System.out)
var gensym = new Gensym()

implicit val synchronousExecutionContext = ExecutionContext.fromExecutor(new Executor {
def execute(task: Runnable) = task.run()
})

val sjsLogger: Logger = new Logger {
override def log(level: Level, message: => String): Unit = {
if (level >= config.minLevel) {
Expand All @@ -48,8 +54,7 @@ class JsModifier extends mdoc.PreModifier {
else reporter.info(message)
}
}
override def success(message: => String): Unit =
reporter.info(message)

override def trace(t: => Throwable): Unit =
reporter.error(t)
}
Expand All @@ -66,17 +71,17 @@ class JsModifier extends mdoc.PreModifier {
}

def newLinker(): Linker = {
val semantics =
val semantics: Semantics =
if (config.fullOpt) Semantics.Defaults.optimized
else Semantics.Defaults
StandardLinker(
StandardLinker
.Config()
.withSemantics(semantics)
.withSourceMap(false)
.withClosureCompilerIfAvailable(config.fullOpt)
.withModuleKind(config.moduleKind)
)

val conf = StandardConfig()
.withSemantics(semantics)
.withSourceMap(false)
.withModuleKind(config.moduleKind)
.withClosureCompilerIfAvailable(config.fullOpt)

StandardImpl.linker(conf)
}

override def onLoad(ctx: OnLoadContext): Unit = {
Expand All @@ -97,10 +102,16 @@ class JsModifier extends mdoc.PreModifier {
classpathHash = newClasspathHash
maybeCompiler = Some(new MarkdownCompiler(classpath, scalacOptions, target))
virtualIrFiles = {

val irContainer =
IRFileCache.IRContainer.fromClasspath(Classpath(classpath).entries.map(_.toFile))
PathIRContainer.fromClasspath(Classpath(classpath).entries.map(_.toNIO))

val cache = irCache.newCache
cache.cached(irContainer)

Await.result(
irContainer.map(_._1).flatMap(fs => cache.cached(fs)),
Duration.Inf
)
}
}
}
Expand Down Expand Up @@ -143,18 +154,20 @@ class JsModifier extends mdoc.PreModifier {
x <- target.toList
if x.name.endsWith(".sjsir")
} yield {
val f = new MemVirtualSerializedScalaJSIRFile(x.path)
f.content = x.toByteArray
f: VirtualScalaJSIRFile
new MemIRFileImpl(
x.path,
None,
x.toByteArray
): IRFile
}
if (sjsir.isEmpty) {
if (!hasErrors) {
ctx.reporter.error("Scala.js compilation failed")
}
""
} else {
val output = WritableMemVirtualJSFile("output.js")
linker.link(virtualIrFiles ++ sjsir, Nil, output, sjsLogger)
val output = MemOutputFile.apply()
linker.link(virtualIrFiles ++ sjsir, Nil, LinkerOutput.apply(output), sjsLogger)
ctx.settings.toInputFile(ctx.inputFile) match {
case None =>
ctx.reporter.error(
Expand All @@ -164,7 +177,7 @@ class JsModifier extends mdoc.PreModifier {
""
case Some(inputFile) =>
val outjsfile = resolveOutputJsFile(inputFile)
outjsfile.write(output.content)
outjsfile.write(new String(output.content))
val outmdoc = outjsfile.resolveSibling(_ => "mdoc.js")
outmdoc.write(Resources.readPath("/mdoc.js"))
val relfile = outjsfile.toRelativeLinkFrom(ctx.outputFile, config.relativeLinkPrefix)
Expand Down Expand Up @@ -220,7 +233,8 @@ class JsModifier extends mdoc.PreModifier {
}
val run = gensym.fresh("run")
inputs += input
val id = s"mdoc-js-$run"
val htmlId = s"mdoc-html-$run"
val jsId = s"mdoc_js_$run"
val mountNodeParam = Term.Name(config.mountNode)
val code: String =
if (mods.isShared) {
Expand All @@ -233,18 +247,19 @@ class JsModifier extends mdoc.PreModifier {
.toString
} else {
new CodeBuilder()
.println(s""" @_root_.scala.scalajs.js.annotation.JSExportTopLevel("$id") """)
.println(s"""@_root_.scala.scalajs.js.annotation.JSExportTopLevel("$jsId") """)
.println(
s"""def $run($mountNodeParam: _root_.org.scalajs.dom.raw.HTMLElement): Unit = {"""
)
.println(input.text)
.println("}")
.toString
}

runs += code
new CodeBuilder()
.printlnIf(!mods.isInvisible, s"```scala\n${input.text}\n```")
.printlnIf(mods.isEntrypoint, s"""<div id="$id" data-mdoc-js>$body</div>""")
.printlnIf(mods.isEntrypoint, s"""<div id="$htmlId" data-mdoc-js>$body</div>""")
.toString
}
}
8 changes: 5 additions & 3 deletions mdoc-sbt/src/main/scala/mdoc/MdocPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,11 @@ object MdocPlugin extends AutoPlugin {
fullClasspath.in(ref, Compile).value.map(_.data),
classloadedSetting(
ref,
"org.scalajs.core.tools.linker.backend.ModuleKind",
"scalaJSModuleKind"
).value.map(_.toString)
"org.scalajs.linker.interface.StandardConfig",
"scalaJSLinkerConfig"
).value.map { config =>
config.getClass.getMethod("moduleKind").invoke(config).toString
}
)
}

Expand Down
4 changes: 2 additions & 2 deletions mdoc-sbt/src/sbt-test/sbt-mdoc/basic/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ println(example.Example.greeting)
```scala
println("Hello Scala.js!")
```
<div id="mdoc-js-run0" data-mdoc-js></div>
<div id="mdoc-html-run0" data-mdoc-js></div>
<script type="text/javascript" src="readme.md.js" defer></script>
<script type="text/javascript" src="mdoc.js" defer></script>
""".trim,
Expand All @@ -28,6 +28,6 @@ println("Hello Scala.js!")

lazy val jsapp = project
.settings(
libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "0.9.6"
libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "1.0.0"
)
.enablePlugins(ScalaJSPlugin)
2 changes: 1 addition & 1 deletion mdoc-sbt/src/sbt-test/sbt-mdoc/basic/project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.26")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.1.0")
addSbtPlugin("org.scalameta" % "sbt-mdoc" % sys.props("plugin.version"))
addSbtCoursier
6 changes: 3 additions & 3 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0")
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.15.0")
addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.3")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.32")
addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.14.0")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.1.1")
addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.18.0")
addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.4.1")

libraryDependencies ++= List(
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/src/test/scala-2.12/tests/js/JsCliSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,14 @@ class JsCliSuite extends BaseCliSuite {
|```scala
|println("hello world!")
|```
|<div id="mdoc-js-run0" data-mdoc-js></div>
|<div id="mdoc-html-run0" data-mdoc-js></div>
|${suffix("index1")}
|
|/index2.md
|```scala
|println("hello world!")
|```
|<div id="mdoc-js-run0" data-mdoc-js></div>
|<div id="mdoc-html-run0" data-mdoc-js></div>
|${suffix("index2")}
|""".stripMargin,
input = "index1.md",
Expand Down
Loading

0 comments on commit 038d9b8

Please sign in to comment.