I think I figured it out. In knex.js, say you specify a table like:
knex.select( '*' ).from( 'Users' )
Then you can just add the AS keyword within the quotes of the table name to alias it, like so:
knex.select( '*' ).from( 'Users AS u' )
..and you can do this for column names, too; so my original SQL would look like this in knex-land:
knex.select( 'w.*', 'ua.name AS ua_name', 'uw.name AS uw_name' )
.innerJoin( 'Users AS ua', 'author_id', 'ua.id' )
.leftJoin( 'Users as uw', 'winner_id', 'uw.id' )
I guess I got confused by the presence of knex’s .as() method, which (as far as I currently understand) is meant just for subqueries, not for aliasing tables or column names.