For TypeScript specifically there is some justification in that the TypeScript compiler is rather slow, so any speed benefits of Biome would go away if it relied on TypeScript for type information.
But as a whole, not-invented-here syndrome has plagued Biome/Rome for the entire lifespan of the project. Like take a look at their error reporting code[1]. They made their own markup abstraction with their own Display trait and Write trait and a proc macro on top of it. It's cool code and probably does produce very nice error messages, but they could have easily used off the shelf crates like miette or ariadne and moved on to more important tasks.
Or even their JS parser. It's a really nice JS parser! Maybe the best in terms of error reporting and AST resolution. But they could have easily used swc and maybe shipped the actual end-user products a little faster.
The zero dependency philosophy concerns the legacy Rome JavaScript implementation. With the Rust rewrite, the Rome team was more open to add dependencies when it makes sense. I must admit that I don't know why they chose to implement their own console printer at the time.
The Rome community project (rebranded under the name "Biome") started one year ago, when the company failed. Only one core contributor comes from the Rome team. Others, including myself, joined the project at that time. Although we kept most of the Rome philosophy, we diverge from some of them. We are more open to the community: We implemented some of the most requested options (The Rome project was more hostile to add options). We are also more open to reuse existing solutions when it aligns with our primary goals.
IMO this alone makes it worth it. The Rust compiler produces error messages that sit in a class of their own compared to almost everything else. I believe we should strive for more DX like that.
I don't know anything about miette, but it didn't exist when Rome, the original code, was created (maybe it did exist but it was in its infancy, the two projects have the same age)
It definitely existed by the time rome_console/biome_console was created! The crate was created 2 years ago[1] and miette was released more than 2 years ago[2]. By the time rome_console was created miette was on v4, so presumably somewhat mature.
Originally, the project had a goal of zero dependencies. [1] I assume that was considered infeasible with the migration to Rust, but part of the philosophy remained.
Yeah...but why? Like zero-dependencies is one of those things that gets you praise on HN, but it means you spend a lot of time building...terminal console abstractions and not actually shipping stuff to users.
My understanding is that the zero-dependency approach was both 1) to require no transitive dependencies on install, compared to installing hundreds of packages to run some of the current standard JS tooling, and 2) to have maximum control over performance and size.
It’s an extreme approach that intended to get extreme results. One could definitely argue that you can get just good results with a good approach (like using a bundler to produce a single output, writing perf-sensitive code, continually testing for perf regression), that’s just not the path they chose from the start.
But as a whole, not-invented-here syndrome has plagued Biome/Rome for the entire lifespan of the project. Like take a look at their error reporting code[1]. They made their own markup abstraction with their own Display trait and Write trait and a proc macro on top of it. It's cool code and probably does produce very nice error messages, but they could have easily used off the shelf crates like miette or ariadne and moved on to more important tasks.
Or even their JS parser. It's a really nice JS parser! Maybe the best in terms of error reporting and AST resolution. But they could have easily used swc and maybe shipped the actual end-user products a little faster.
[1]: https://github.com/biomejs/biome/blob/main/crates/biome_cons...