I’m unsure about this. I’m not saying I have any better ideas though, and I’m totally open to suggestions.
You cited TypeScript as a role model which is a good call. For comparison: At the other end of the spectrum we have, for example, Elm (and ReasonML, and PureScript - but I’m picking on Elm because I’m familiar with it).
I believe Elm meets all your bullet points but this has not lead to mass adoption, and their stated goal was to convert the hoards of JS developers rather than the relatively few Haskell’ers. The elephant in the room being that most JS devs don’t seem to want to do Haskell-like super-constrained functional programming. Strangely enough.
I’d suggest that Scala.js is arguably somewhere in the middle of Elm and TypeScript, admittedly leaning towards TypeScript.
The conundrum is, I think:
Scala devs aren’t brought up as frontend devs (we’re trained to do microservices and big data), and have a hard time moving over conceptually. It’s all a bit scary and different and fiddly and confusing and let’s face it: Not the JVM.
JavaScript devs know the frontend inside-out and back-to-front, but aren’t necessarily interested in deviating away from JavaScript much further than TypeScript has (at least at the moment). However, there are A LOT more JS devs than Scala devs, so you only need a relatively small percentage to adopt (as Elm tried to do).
So which audience do you go for?
If you went for the Scala crowd, actually you might be better off avoiding as much of the NPM ecosystem as possible, since the commonly held view is that it’s all a messy nightmare and our ivy/maven world is much better and familiar and less fraught with weird dangers.
If you want the JS devs then yes, your suggested direction is probably sensible. But ecosystem integration is technically hard and really, its only table-stakes. After you’ve got that baseline tooling sorted, then the work begins to convince people - JS Devs - to actually use it.
There’s tooling work to do either way to be sure, and currently we’re neither one thing nor the other. Is that a bad thing? Is there an interesting middle-ground?
Speaking purely selfishly: I want to see if we can teach the Scala community to be creative. To see if they can get as excited about generative art, and games, and slick interface animations, as they do about effectual monads and reactive streams. If we could get the Scala community to build GUI’s that are comparable to what the JavaScript crowd can, but with fewer bugs, better security, a faster dev cycle, and an enviable process/experience …maybe we’d win anyway?
…but then again, maybe I’m dreaming.