Problem
DatabaseInterface.query() returns a type that does not expose the .rows property, even though the PostgreSQL driver returns { rows: T[] } at runtime. Every downstream consumer must cast through any to access row data:
const result = await db.query(`SELECT ... FROM ...`, arg);
const rows = (result as any).rows ?? result; // forced cast
This pattern appears in 5+ files across blindmanpress.com (and likely other consumers), completely defeating TypeScript safety on all raw query results.
Expected Behavior
query() return type should either:
- Expose
.rows directly (e.g., { rows: T[] })
- Return rows as the top-level array (so no
.rows access is needed)
- Provide a typed
queryRows<T>() convenience method
Consumer Impact
Every file using db.query() with raw SQL currently has zero type safety on the result shape. Column renames or schema changes in upstream packages will not produce compile-time errors — only runtime failures.
References
const result = await db.query(`SELECT ... FROM ...`, arg);
const rows = (result as any).rows ?? result; // forced cast
`referrals/links`, `referrals/click`, `affiliates/events`
Problem
DatabaseInterface.query()returns a type that does not expose the.rowsproperty, even though the PostgreSQL driver returns{ rows: T[] }at runtime. Every downstream consumer must cast throughanyto access row data:This pattern appears in 5+ files across
blindmanpress.com(and likely other consumers), completely defeating TypeScript safety on all raw query results.Expected Behavior
query()return type should either:.rowsdirectly (e.g.,{ rows: T[] }).rowsaccess is needed)queryRows<T>()convenience methodConsumer Impact
Every file using
db.query()with raw SQL currently has zero type safety on the result shape. Column renames or schema changes in upstream packages will not produce compile-time errors — only runtime failures.References