We've used Knex and it works well provided you don't need features such as repeatable migrations.
Imo you should actually differentiate your migrations between schema changes and data mutations. That allows you to use a more powerful tool like liquibase/flyway for schema yet use your preferred language (JS/TS) for data mutations which might need other libraries.
I'm curious if people have tried this approach before.