@@ -24,11 +24,19 @@ import sbtbuildinfo.BuildInfoPlugin.autoImport._
24
24
25
25
import scala .util .Properties .isJavaAtLeast
26
26
import org .portablescala .sbtplatformdeps .PlatformDepsPlugin .autoImport ._
27
- import org .scalajs .linker .interface .ModuleInitializer
27
+ import org .scalajs .linker .interface .{ ModuleInitializer , StandardConfig }
28
28
29
29
object DottyJSPlugin extends AutoPlugin {
30
30
import Build ._
31
31
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
+
32
40
override def requires : Plugins = ScalaJSPlugin
33
41
34
42
override def projectSettings : Seq [Setting [_]] = Def .settings(
@@ -51,6 +59,21 @@ object DottyJSPlugin extends AutoPlugin {
51
59
52
60
// Typecheck the Scala.js IR found on the classpath
53
61
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
+ },
54
77
)
55
78
}
56
79
@@ -1202,6 +1225,19 @@ object Build {
1202
1225
// A first blacklist of tests for those that do not compile or do not link
1203
1226
(Test / managedSources) ++= {
1204
1227
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
+
1205
1241
(
1206
1242
(dir / " shared/src/test/scala" ** ((" *.scala" : FileFilter )
1207
1243
-- " ReflectiveCallTest.scala" // uses many forms of structural calls that are not allowed in Scala 3 anymore
@@ -1220,9 +1256,28 @@ object Build {
1220
1256
++ (dir / " js/src/test/require-2.12" ** " *.scala" ).get
1221
1257
++ (dir / " js/src/test/require-sam" ** " *.scala" ).get
1222
1258
++ (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" )
1224
1265
)
1225
1266
},
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
+ },
1226
1281
)
1227
1282
1228
1283
lazy val sjsCompilerTests = project.in(file(" sjs-compiler-tests" )).
0 commit comments