@@ -24,11 +24,19 @@ import sbtbuildinfo.BuildInfoPlugin.autoImport._
2424
2525import scala .util .Properties .isJavaAtLeast
2626import org .portablescala .sbtplatformdeps .PlatformDepsPlugin .autoImport ._
27- import org .scalajs .linker .interface .ModuleInitializer
27+ import org .scalajs .linker .interface .{ ModuleInitializer , StandardConfig }
2828
2929object DottyJSPlugin extends AutoPlugin {
3030 import Build ._
3131
32+ object autoImport {
33+ val switchToESModules : StandardConfig => StandardConfig =
34+ config => config.withModuleKind(ModuleKind .ESModule )
35+ }
36+
37+ val writePackageJSON = taskKey[Unit ](
38+ " Write package.json to configure module type for Node.js" )
39+
3240 override def requires : Plugins = ScalaJSPlugin
3341
3442 override def projectSettings : Seq [Setting [_]] = Def .settings(
@@ -51,6 +59,21 @@ object DottyJSPlugin extends AutoPlugin {
5159
5260 // Typecheck the Scala.js IR found on the classpath
5361 scalaJSLinkerConfig ~= (_.withCheckIR(true )),
62+
63+ Compile / jsEnvInput := (Compile / jsEnvInput).dependsOn(writePackageJSON).value,
64+ Test / jsEnvInput := (Test / jsEnvInput).dependsOn(writePackageJSON).value,
65+
66+ writePackageJSON := {
67+ val packageType = scalaJSLinkerConfig.value.moduleKind match {
68+ case ModuleKind .NoModule => " commonjs"
69+ case ModuleKind .CommonJSModule => " commonjs"
70+ case ModuleKind .ESModule => " module"
71+ }
72+
73+ val path = target.value / " package.json"
74+
75+ IO .write(path, s """ {"type": " $packageType"}\n """ )
76+ },
5477 )
5578}
5679
@@ -1202,6 +1225,19 @@ object Build {
12021225 // A first blacklist of tests for those that do not compile or do not link
12031226 (Test / managedSources) ++= {
12041227 val dir = fetchScalaJSSource.value / " test-suite"
1228+
1229+ val linkerConfig = scalaJSStage.value match {
1230+ case FastOptStage => (Test / fastLinkJS / scalaJSLinkerConfig).value
1231+ case FullOptStage => (Test / fullLinkJS / scalaJSLinkerConfig).value
1232+ }
1233+
1234+ val moduleKind = linkerConfig.moduleKind
1235+ val hasModules = moduleKind != ModuleKind .NoModule
1236+
1237+ def conditionally (cond : Boolean , subdir : String ): Seq [File ] =
1238+ if (! cond) Nil
1239+ else (dir / subdir ** " *.scala" ).get
1240+
12051241 (
12061242 (dir / " shared/src/test/scala" ** ((" *.scala" : FileFilter )
12071243 -- " ReflectiveCallTest.scala" // uses many forms of structural calls that are not allowed in Scala 3 anymore
@@ -1220,9 +1256,28 @@ object Build {
12201256 ++ (dir / " js/src/test/require-2.12" ** " *.scala" ).get
12211257 ++ (dir / " js/src/test/require-sam" ** " *.scala" ).get
12221258 ++ (dir / " js/src/test/scala-new-collections" ** " *.scala" ).get
1223- ++ (dir / " js/src/test/require-no-modules" ** " *.scala" ).get
1259+
1260+ ++ conditionally(! hasModules, " js/src/test/require-no-modules" )
1261+ ++ conditionally(hasModules, " js/src/test/require-modules" )
1262+ ++ conditionally(hasModules && ! linkerConfig.closureCompiler, " js/src/test/require-multi-modules" )
1263+ ++ conditionally(moduleKind == ModuleKind .ESModule , " js/src/test/require-dynamic-import" )
1264+ ++ conditionally(moduleKind == ModuleKind .ESModule , " js/src/test/require-esmodule" )
12241265 )
12251266 },
1267+
1268+ Test / managedResources ++= {
1269+ val testDir = fetchScalaJSSource.value / " test-suite/js/src/test"
1270+
1271+ val common = (testDir / " resources" ** " *.js" ).get
1272+
1273+ val moduleSpecific = scalaJSLinkerConfig.value.moduleKind match {
1274+ case ModuleKind .NoModule => Nil
1275+ case ModuleKind .CommonJSModule => (testDir / " resources-commonjs" ** " *.js" ).get
1276+ case ModuleKind .ESModule => (testDir / " resources-esmodule" ** " *.js" ).get
1277+ }
1278+
1279+ common ++ moduleSpecific
1280+ },
12261281 )
12271282
12281283 lazy val sjsCompilerTests = project.in(file(" sjs-compiler-tests" )).
0 commit comments