Was Typst falling short in any particular area that made you not want to use it? (If it was on your radar at all). I think it would work for your use case and could also run client side if needed.
Here's the TS library: https://github.com/Myriad-Dreamin/typst.ts