scala.util.Properties already has methods
isMac, but no way to tell if Scala is running on the JVM, JS, or Native platforms.
This information is pretty important in applications like Scala 3’s Typeclass Derivation.
For example, imagine you have a Scala 3 crossproject with a
/shared, you define all your case class DTOs.
For JSON serialization, you pull in a new library and add
derives JsonCodec to your classes.
It’s critical for this typeclass to know the environment. If JS, then it might use the global
JSON object, and likewise on the JVM use some standard library method not-implemented by Scala.js.
The proposal is to add methods
Properties.isNative, or something of similar effect. Since the methods will be
JsonCodec and other libraries can do
inline ifs on the values and return a correct implementation.
The alternative that we’re living with is to define two different typeclasses,
JsonCodecJS, and manually derive
givens in objects in their respective projects, like
// in /shared project case class User(name: String, isAdmin: Boolean, age: Int) // in /js project object DtoConverters: given JsonCodecJVM[User] = JsonCodecJVM.derived // in /jvm project object DtoConverters: given JsonCodecJS[User] = JsonCodecJS.derived
I vaguely remember @japgolly had some idea like this before. I wonder about the build-system implications for this, and also if there are other alternatives.