Thankfully there are a handful of NPM packages that can do all the work for you. I first tried Madge which seemed to be the most popular solution. It did have an option to identify circular dependencies, but that information wasn’t included in the default output. It also has an impressive dependency visualization option, but it required manually installing a homebrew package.
I next tried dpdm which was simpler to use, and covered more of my needs by default. Here’s what the output looked like when run against the main entry point of my library:
There was in fact a circular dependency between my TypeScript types and interfaces. Real rookie mistake right there. Combining the interfaces and types into a single file eliminated the circular dependency and got dpdm to stop yelling at me.
Ironically after all that, the circular dependency wasn’t even the cause of the error I was seeing. I’m glad I found this handy little utility though, and hopefully working through this will make me less likely to introduce a circular dependency in the future.