Directory:
.
├── apps
│ ├── core
│ │ └── src
│ │ └── Color.scala
│ └── web
│ ├── index.html
│ ├── javascript.svg
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ ├── public
│ │ └── vite.svg
│ ├── src
│ │ └── main.scala
│ ├── style.css
│ └── vite.config.js
├── build.sbt
└── project
├── build.properties
├── metals.sbt
├── plugins.sbt
└── project
├── metals.sbt
└── project
├── metals.sbt
└── project
build.sbt
import org.scalajs.linker.interface.ModuleSplitStyle
import scala.sys.process.Process
lazy val core = project.in(file("apps/core"))
.settings(
name := "core",
scalaVersion := "3.6.2",
Compile / scalaSource := baseDirectory.value / "src",
scalacOptions ++= Seq(
"-language:experimental.namedTuples"
),
)
lazy val web = (project in file("apps/web"))
.dependsOn(core)
.enablePlugins(ScalaJSPlugin)
.enablePlugins(ScalablyTypedConverterExternalNpmPlugin)
.settings(
name := "web",
scalaVersion := "3.6.2",
Compile / scalaSource := baseDirectory.value / "src",
scalacOptions ++= Seq(
"-language:experimental.namedTuples"
),
scalaJSUseMainModuleInitializer := true,
scalaJSLinkerConfig ~= {
_.withModuleKind(ModuleKind.ESModule)
.withModuleSplitStyle(
ModuleSplitStyle.SmallModulesFor(List("game")))
},
libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "2.8.0",
externalNpm := {
Process("npm install", baseDirectory.value).!
baseDirectory.value
}
)
vite.config.js
import { defineConfig } from "vite";
import scalaJSPlugin from "@scala-js/vite-plugin-scalajs";
export default defineConfig({
plugins: [scalaJSPlugin({
cwd: "../..",
projectID: "web"
})
],
});
package.json
{
"name": "mygame",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"@scala-js/vite-plugin-scalajs": "^1.0.0",
"@types/three": "^0.130.0",
"three": "^0.130.0",
"typescript": "^5.7.3",
"vite": "^4.1.0"
}
}
metals stack trace
running '/Users/john/Library/Application Support/Coursier/bin/sbt -Dbloop.export-jar-classifiers=sources bloopInstall'
ERROR org.jline.utils.Log logr
ERROR WARNING: Unable to create a system terminal, creating a dumb terminal (enable debug logging for more information)
INFO [info] welcome to sbt 1.10.0 (Homebrew Java 23.0.1)
INFO [info] loading settings for project practice-build-build-build from metals.sbt ...
INFO [info] loading project definition from /Users/john/projects/practice/project/project/project
INFO
INFO | => practice-build-build-build / Compile / compileIncremental 0s
INFO [info] loading settings for project practice-build-build from metals.sbt ...
INFO [info] loading project definition from /Users/john/projects/practice/project/project
INFO
INFO | => practice-build-build / updateSbtClassifiers 0s
INFO [success] Generated .bloop/practice-build-build.json
INFO
INFO | => practice-build-build / updateSbtClassifiers 0s
INFO [success] Total time: 1 s, completed
INFO [info] loading settings for project practice-build from metals.sbt,plugins.sbt ...
INFO [info] loading project definition from /Users/john/projects/practice/project
INFO
INFO | => practice-build / updateSbtClassifiers 0s
INFO [success] Generated .bloop/practice-build.json
INFO
INFO | => practice-build / updateSbtClassifiers 0s
INFO [success] Total time: 1 s, completed
INFO [info] loading settings for project practice from build.sbt ...
INFO [info] set current project to practice (in build file:/Users/john/projects/practice/)
INFO
INFO | => web / externalNpm 0s
INFO [success] Generated .bloop/practice.json
INFO
INFO | => web / externalNpm 0s
INFO [success] Generated .bloop/core.json
INFO
INFO | => web / externalNpm 0s
INFO [success] Generated .bloop/practice-test.json
INFO
INFO | => web / externalNpm 0s
INFO [success] Generated .bloop/core-test.json
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO up to date, audited 28 packages in 697ms
INFO
INFO 3 packages are looking for funding
INFO run `npm fund` for details
INFO
INFO | => web / externalNpm 0s
INFO
INFO | => web / externalNpm 0s
INFO
INFO found 0 vulnerabilities
INFO
INFO | => web / externalNpm 0s
INFO [success] Generated .bloop/web.json
INFO
INFO | => web / externalNpm 0s
INFO [success] Generated .bloop/web-test.json
INFO
INFO | => web / externalNpm 0s
INFO [success] Total time: 1 s, completed
INFO
INFO time: ran 'sbt bloopInstall' in 10s
INFO Attempting to connect to the build server...
INFO No running Bloop server found, starting one.
INFO Starting compilation server
INFO tracing is disabled for protocol BSP, to enable tracing of incoming and outgoing JSON messages create an empty file at /Users/john/projects/practice/.metals/bsp.trace.json or /Users/john/Library/Caches/org.scalameta.metals/bsp.trace.json
INFO Attempting to connect to the build server...
INFO Found a Bloop server running
INFO Attempting to connect to the build server...
INFO Found a Bloop server running
INFO tracing is disabled for protocol BSP, to enable tracing of incoming and outgoing JSON messages create an empty file at /Users/john/projects/practice/project/project/.metals/bsp.trace.json or /Users/john/Library/Caches/org.scalameta.metals/bsp.trace.json
INFO tracing is disabled for protocol BSP, to enable tracing of incoming and outgoing JSON messages create an empty file at /Users/john/projects/practice/project/.metals/bsp.trace.json or /Users/john/Library/Caches/org.scalameta.metals/bsp.trace.json
INFO time: Connected to build server in 6.53s
INFO Connected to Build server: Bloop v2.0.6
INFO running doctor check
INFO java targets: web-test, core-test, core, practice-build-build, web, practice-build, practice, practice-test
INFO time: indexed workspace in 1.14s
INFO compiling core (1 scala source)
INFO Generated JavaScript file '/Users/john/projects/practice/.bloop/web/web-test-js'
INFO Scala test classes not supported by server
org.eclipse.lsp4j.jsonrpc.ResponseErrorException: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at bloop.engine.tasks.toolchains.ScalaJsToolchain.discoverTestFrameworks(ScalaJsToolchain.scala:98)
at bloop.engine.tasks.TestTask$.$anonfun$discoverTestFrameworks$5(TestTask.scala:234)
at bloop.task.Task.$anonfun$runAsync$7(Task.scala:265)
at scala.Function1.$anonfun$andThen$1(Function1.scala:57)
at monix.eval.Task$Map.apply(Task.scala:4604)
at monix.eval.Task$Map.apply(Task.scala:4600)
at monix.eval.internal.TaskRunLoop$.startFull(TaskRunLoop.scala:170)
at monix.eval.internal.TaskRestartCallback.syncOnSuccess(TaskRestartCallback.scala:101)
at monix.eval.internal.TaskRestartCallback.onSuccess(TaskRestartCallback.scala:74)
at monix.eval.internal.TaskCreate$CallbackForCreate.run(TaskCreate.scala:252)
at monix.execution.internal.Trampoline.monix$execution$internal$Trampoline$$immediateLoop(Trampoline.scala:66)
at monix.execution.internal.Trampoline.startLoop(Trampoline.scala:32)
at monix.execution.schedulers.TrampolineExecutionContext$JVMOptimalTrampoline.startLoop(TrampolineExecutionContext.scala:132)
at monix.execution.internal.Trampoline.execute(Trampoline.scala:40)
at monix.execution.schedulers.TrampolineExecutionContext.execute(TrampolineExecutionContext.scala:57)
at monix.execution.schedulers.BatchingScheduler.execute(BatchingScheduler.scala:50)
at monix.execution.schedulers.BatchingScheduler.execute$(BatchingScheduler.scala:47)
at monix.execution.schedulers.AsyncScheduler.execute(AsyncScheduler.scala:31)
at monix.eval.internal.TaskCreate$CallbackForCreate.startExecution(TaskCreate.scala:236)
at monix.eval.internal.TaskCreate$CallbackForCreate.tryOnSuccess(TaskCreate.scala:202)
at monix.eval.internal.TaskCreate$CallbackForCreate.onSuccess(TaskCreate.scala:195)
at bloop.task.Task$.result$2(Task.scala:465)
at bloop.task.Task$.$anonfun$parSequenceUnordered$3(Task.scala:475)
at bloop.task.Task$.$anonfun$parSequenceUnordered$3$adapted(Task.scala:473)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:74)
at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1726)
at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1717)
at java.base/java.util.concurrent.ForkJoinTask$InterruptibleTask.exec(ForkJoinTask.java:1641)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1458)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2034)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:189)
Caused by: org.scalajs.testing.common.RPCCore$ClosedException: org.scalajs.testing.adapter.JSEnvRPC$RunTerminatedException
at org.scalajs.testing.common.RPCCore.helpClose(RPCCore.scala:223)
at org.scalajs.testing.common.RPCCore.close(RPCCore.scala:215)
at org.scalajs.testing.adapter.JSEnvRPC.close(JSEnvRPC.scala:69)
at org.scalajs.testing.adapter.JSEnvRPC.$anonfun$new$1(JSEnvRPC.scala:60)
at org.scalajs.testing.adapter.JSEnvRPC.$anonfun$new$1$adapted(JSEnvRPC.scala:60)
... 8 more
Caused by: org.scalajs.testing.adapter.JSEnvRPC$RunTerminatedException
... 10 more
Caused by: org.scalajs.jsenv.ExternalJSRun$NonZeroExitException: exited with code 1
at org.scalajs.jsenv.ExternalJSRun$$anon$1.run(ExternalJSRun.scala:200)
at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.handleResponse(RemoteEndpoint.java:220)
at org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.consume(RemoteEndpoint.java:204)
at scala.meta.internal.metals.RequestMonitorImpl$$anon$1.consume(ServerLivenessMonitor.scala:41)
at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.handleMessage(StreamMessageProducer.java:185)
at org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.listen(StreamMessageProducer.java:97)
at org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor.run(ConcurrentMessageProcessor.java:114)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.lang.Thread.run(Thread.java:1575)
INFO compiling web (1 scala source)
INFO time: compiled core in 3.36s
INFO time: compiled web in 0.18s