Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Remap es imports - help needed... #882

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ def isScala212(v: Option[(Long, Long)]): Boolean = v.exists(_._1 == 2) && v.exis
def isScala213(v: Option[(Long, Long)]): Boolean = v.exists(_._1 == 2) && v.exists(_._2 == 13)
def isScala3(v: Option[(Long, Long)]): Boolean = v.exists(_._1 == 3)

def jsoniter = List(
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.13.5.2",
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.13.5.2"
)

val isScala212 = Def.setting {
VersionNumber(scalaVersion.value).matchesSemVer(SemanticSelector("2.12.x"))
}
Expand Down Expand Up @@ -250,7 +255,7 @@ lazy val mdoc = project
"com.geirsson" %% "metaconfig-typesafe-config" % V.metaconfig,
"com.lihaoyi" %% "fansi" % V.fansi,
"com.lihaoyi" %% "pprint" % V.pprint
)
) ++ jsoniter
)
.dependsOn(parser, runtime, cli)
.enablePlugins(BuildInfoPlugin)
Expand Down Expand Up @@ -358,7 +363,8 @@ lazy val unitJS = project
publish / skip := true,
Compile / unmanagedSourceDirectories ++= multiScalaDirectories("tests/unit-js").value,
libraryDependencies ++= List(
"org.scalameta" %% "munit" % V.munit % Test
"org.scalameta" %% "munit" % V.munit % Test,
"com.armanbilge" %%% "scalajs-importmap" % "0.1.1" cross CrossVersion.for3Use2_13
),
buildInfoPackage := "tests.js",
buildInfoKeys := Seq[BuildInfoKey](
Expand Down Expand Up @@ -432,7 +438,8 @@ lazy val jsWorker =
.settings(
sharedSettings,
moduleName := "mdoc-js-worker",
libraryDependencies += ("org.scala-js" %% "scalajs-linker" % scalaJSVersion % Provided) cross CrossVersion.for3Use2_13
libraryDependencies += ("org.scala-js" %% "scalajs-linker" % scalaJSVersion % Provided) cross CrossVersion.for3Use2_13,
libraryDependencies += "com.armanbilge" %%% "scalajs-importmap" % "0.1.1" cross CrossVersion.for3Use2_13
)

lazy val js = project
Expand All @@ -441,7 +448,8 @@ lazy val js = project
.settings(
sharedSettings,
moduleName := "mdoc-js",
Compile / unmanagedSourceDirectories ++= multiScalaDirectories("js").value
Compile / unmanagedSourceDirectories ++= multiScalaDirectories("js").value,
libraryDependencies ++= jsoniter
)
.dependsOn(mdoc)

Expand Down
6 changes: 5 additions & 1 deletion cli/src/main/scala/mdoc/internal/cli/Settings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,11 @@ case class Settings(
variablePrinter: Variable => String = ReplVariablePrinter,
@Hidden()
@Description("The Coursier logger used to report progress bars when downloading dependencies")
coursierLogger: coursierapi.Logger = coursierapi.Logger.progressBars()
coursierLogger: coursierapi.Logger = coursierapi.Logger.progressBars(),
@Description(
"The absolute path to a file containing an import map file in this format; https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap"
)
importMapPath: Option[AbsolutePath] = None
) extends mdoc.parser.ParserSettings {

val isMarkdownFileExtension = markdownExtensions.toSet
Expand Down
4 changes: 3 additions & 1 deletion docs/js.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,9 @@ js-linker-classpath=$(coursier fetch org.scalameta:mdoc-js-worker_@SCALA_BINARY_
EOT
```

Note: For scala 3, you may need `js-scalac-options=--scala-js` - this is currently untested.
Note: For scala 3, you may need `js-scalac-options=-scalajs` - instead of the XPlugin incantation - [Doc](https://docs.scala-lang.org/scala3/guides/migration/options-lookup.html#compiler-plugins).



Next, create a basic Markdown files with an `mdoc:js` modifier:

Expand Down
13 changes: 11 additions & 2 deletions mdoc-js-interfaces/src/main/java/ScalajsConfig.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package mdoc.js.interfaces;

import java.util.Map;

public class ScalajsConfig {
public ModuleType moduleType;
public boolean fullOpt;
public boolean sourceMap;
public boolean batchMode;
public boolean closureCompiler;
public Map<String, String> importMap;

public ScalajsConfig() {
}

public ScalajsConfig withModuleKind(ModuleType kind) {
if(kind == ModuleType.ESModule)
if (kind == ModuleType.ESModule)
this.moduleType = ModuleType.ESModule;
else if (kind == ModuleType.NoModule)
this.moduleType = ModuleType.NoModule;
Expand All @@ -20,6 +23,12 @@ else if (kind == ModuleType.CommonJSModule)
return this;
}

public ScalajsConfig withImportMap(Map<String, String> importMap) {
this.importMap = importMap;
System.out.println("setting importmap : " + importMap.toString());
return this;
}

public ScalajsConfig withOptimized(boolean enabled) {
this.fullOpt = enabled;
return this;
Expand Down
29 changes: 25 additions & 4 deletions mdoc-js-worker/src/main/scala/ScalaJSWorker.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@ import org.scalajs.logging.Logger
import org.scalajs.logging.Level
import org.scalajs.linker.standard.MemIRFileImpl
import org.scalajs.linker.interface.Semantics
import scala.jdk.CollectionConverters._
import com.armanbilge.sjsimportmap.ImportMappedIRFile

class ScalaJSWorker(
config: ScalajsConfig,
logger: Logger
) extends ScalajsWorkerApi {
case class IFile(mem: IRFile) extends ScalajsWorkerApi.IRFile

val linker = {
val cfg =
StandardConfig()
Expand All @@ -43,6 +47,15 @@ class ScalaJSWorker(
StandardImpl.clearableLinker(cfg)
}

logger.info(s"scalaJSWorker")
logger.info(config.importMap.toString)

lazy val remapFct = config.importMap.asScala.toSeq.foldLeft((in: String) => in) {
case (fct, (s1, s2)) =>
val fct2: (String => String) = (in => in.replace(s1, s2))
(in => fct(fct2(in)))
}

var cachedFiles = Seq.empty[org.scalajs.linker.interface.IRFile]

val cache = StandardImpl.irFileCache().newCache
Expand All @@ -62,10 +75,18 @@ class ScalaJSWorker(
val mem = MemOutputDirectory()
val report = Await.result(
linker.link(
cachedFiles.toSeq ++
in.toSeq.collect { case IFile(o) =>
o
},
(
cachedFiles.toSeq ++
in.toSeq
.collect { case IFile(o) =>
o
}
).map { ir =>
if (config.importMap.isEmpty)
ir
else
ImportMappedIRFile.fromIRFile(ir)(remapFct)
},
Seq.empty,
mem,
logger
Expand Down
2 changes: 1 addition & 1 deletion mdoc-js-worker/src/main/scala/ScalaJSWorkerProvider.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class ScalaJSWorkerProvider extends i.ScalajsWorkerProvider {
def trace(ex: => Throwable) =
logger.trace(ex)
}

println("creating worker")
new ScalaJSWorker(config, wrappedLogger)
}
}
17 changes: 15 additions & 2 deletions mdoc-js/src/main/scala/mdoc/modifiers/JsConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import scala.meta.internal.io.PathIO
import scala.meta.io.AbsolutePath
import scala.meta.io.Classpath
import mdoc.js.interfaces._
import scala.collection.immutable.HashMap
import com.github.plokhotnyuk.jsoniter_scala.core._
import mdoc.modifiers.ImportMapJsonIr.ImportMap

case class JsConfig(
moduleKind: ModuleType = ModuleType.NoModule,
Expand All @@ -20,8 +23,10 @@ case class JsConfig(
fullOpt: Boolean = true,
htmlPrefix: String = "",
relativeLinkPrefix: String = "",
batchMode: Boolean = false
batchMode: Boolean = false,
importMap: Map[String, String] = Map.empty
) {
println(this.importMap)
lazy val isCommonJS: Boolean = moduleKind == ModuleType.CommonJSModule
lazy val isEsModule: Boolean = moduleKind == ModuleType.ESModule
def libraryScripts(
Expand Down Expand Up @@ -99,7 +104,15 @@ object JsConfig {
}
},
relativeLinkPrefix = ctx.site.getOrElse("js-relative-link-prefix", base.relativeLinkPrefix),
batchMode = ctx.site.getOrElse("js-batch-mode", "false").toBoolean
batchMode = ctx.site.getOrElse("js-batch-mode", "false").toBoolean,
importMap = ctx.settings.importMapPath match {
case None => new HashMap[String, String]()
case Some(value) =>
val importMapRaw = scala.io.Source.fromFile(value.toFile).getLines().mkString("\n")
val importMapParsed = readFromString[ImportMap](importMapRaw)
println(importMapParsed)
importMapParsed.imports
}
)
}
}
19 changes: 19 additions & 0 deletions mdoc-js/src/main/scala/mdoc/modifiers/JsImportMap.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package mdoc.modifiers

import com.github.plokhotnyuk.jsoniter_scala.core._
import com.github.plokhotnyuk.jsoniter_scala.macros._

object ImportMapJsonIr {

type Scope = Map[String, String]

final case class ImportMap(
val imports: Map[String, String],
val scopes: Option[Map[String, Scope]]
)

object ImportMap {
implicit val codec: JsonValueCodec[ImportMap] = JsonCodecMaker.make
}

}
4 changes: 4 additions & 0 deletions mdoc-js/src/main/scala/mdoc/modifiers/JsModifier.scala
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,14 @@ class JsModifier extends mdoc.PreModifier {
}

def scalajsConfig(base: ScalajsConfig, config: JsConfig) = {

base
.withOptimized(config.fullOpt)
.withModuleKind(config.moduleKind)
.withSourceMap(false)
.withBatchMode(config.batchMode)
.withClosureCompiler(config.fullOpt)
.withImportMap(config.importMap.asJava)
}

override def onLoad(ctx: OnLoadContext): Unit = {
Expand All @@ -100,6 +102,8 @@ class JsModifier extends mdoc.PreModifier {
val loader =
ScalaJSClassloader.create(linkerClasspath.entries.map(_.toURI.toURL()).toArray)

sjsLogger.log(LogLevel.Info, "loading Scala.js worker")

scalajsApi = Some(
ServiceLoader
.load(classOf[ScalajsWorkerProvider], loader)
Expand Down
Loading
Loading