ReviewOS

also looking at this

stacks/bun-query-builder

refactor(types): stop publishing `any` across the query builder's surface

#1117
Merged chris wants to merge types/remove-any-from-public-surface into main
13 files +359 -110
packages/bun-query-builder/src/client.tsmodified+31-30
Changes to packages/bun-query-builder/src/client.ts
@@ -3,7 +3,7 @@
33/* eslint-disable no-useless-catch */
44import type { SchemaMeta } from './meta'
55import type { ResolvedPivot } from './pivot'
6import type { DatabaseSchema } from './schema'
6import type { DatabaseSchema, AnyDatabaseSchema } from './schema'
77import type { QueryBuilderOptions, QueryHooks, SupportedDialect} from './types'
88import { config, getPlaceholder, getPlaceholders, isMysqlLike, setConfig } from './config'
99import type { DriverConnection } from './db'
@@ -400,7 +400,7 @@ class QueryCache {
400400 private cache = new Map<string, CacheEntry>()
401401 private maxSize = 100
402402
403 get(key: string): any | null {
403 get<T = unknown>(key: string): T | null {
404404 const entry = this.cache.get(key)
405405 if (!entry)
406406 return null
@@ -420,7 +420,7 @@ class QueryCache {
420420 return entry.data
421421 }
422422
423 set(key: string, data: any, ttlMs: number): void {
423 set(key: string, data: unknown, ttlMs: number): void {
424424 // Re-inserted keys must move to the back or they'd be evicted as if old.
425425 if (this.cache.has(key))
426426 this.cache.delete(key)
@@ -526,15 +526,15 @@ export type SortDirection = 'asc' | 'desc'
526526 *
527527 * Helper type extracting a string union of column names for a given table.
528528 */
529export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
529export type ColumnName<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
530530// Named row alias to improve IDE hover readability
531531export type SelectedRow<
532 DB extends DatabaseSchema<any>,
532 DB extends AnyDatabaseSchema,
533533 _TTable extends keyof DB & string,
534534 TSelected,
535535> = Readonly<TSelected>
536536
537type PrimaryKeyValue<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> =
537type PrimaryKeyValue<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> =
538538 DB[TTable]['primaryKey'] extends keyof DB[TTable]['columns']
539539 ? DB[TTable]['columns'][DB[TTable]['primaryKey']]
540540 : unknown
@@ -545,7 +545,7 @@ type NumericColumnName<Columns> = {
545545 : Exclude<Columns[K], null | undefined> extends number ? K : never
546546}[keyof Columns & string]
547547
548type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
548type JoinColumn<DB extends AnyDatabaseSchema, TTables extends string> = TTables extends any
549549 ? `${TTables}.${keyof DB[TTables]['columns'] & string}`
550550 : never
551551
@@ -559,13 +559,13 @@ type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTable
559559 * untyped schemas keep compiling. A table that declares ZERO relations
560560 * yields `never` — every relation name is rejected.
561561 */
562export type TableRelationName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> =
562export type TableRelationName<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> =
563563 DB[TTable] extends { relations?: infer R }
564564 ? unknown extends R ? string : keyof NonNullable<R> & string
565565 : string
566566
567567type RelatedTableName<
568 DB extends DatabaseSchema<any>,
568 DB extends AnyDatabaseSchema,
569569 TTable extends keyof DB & string,
570570 TRelation extends TableRelationName<DB, TTable>,
571571> = DB[TTable] extends { relations?: infer Relations }
@@ -575,7 +575,7 @@ type RelatedTableName<
575575 : keyof DB & string
576576
577577type RelationQueryBuilder<
578 DB extends DatabaseSchema<any>,
578 DB extends AnyDatabaseSchema,
579579 TTable extends keyof DB & string,
580580 TRelation extends TableRelationName<DB, TTable>,
581581> = SelectQueryBuilder<
@@ -584,7 +584,7 @@ type RelationQueryBuilder<
584584 DB[RelatedTableName<DB, TTable, TRelation>]['columns']
585585>
586586
587type RelationConstraintRecord<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = {
587type RelationConstraintRecord<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> = {
588588 [R in TableRelationName<DB, TTable>]: Partial<Record<R, (qb: RelationQueryBuilder<DB, TTable, R>) => unknown>>
589589}[TableRelationName<DB, TTable>]
590590
@@ -597,7 +597,7 @@ type RelationConstraintRecord<DB extends DatabaseSchema<any>, TTable extends key
597597 * relations accepts nothing (the bare `Partial<Record<never, ...>>` would be
598598 * `{}`, which strings are assignable to — hence the explicit never guard).
599599 */
600export type WithRelationArg<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> =
600export type WithRelationArg<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> =
601601 [TableRelationName<DB, TTable>] extends [never]
602602 ? never
603603 :
@@ -614,7 +614,7 @@ type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
614614// thread a phantom TSql string through method signatures so hovers can show the
615615// composed SQL at compile-time for common operations.
616616type _TypedDynamicWhereMethods<
617 DB extends DatabaseSchema<any>,
617 DB extends AnyDatabaseSchema,
618618 TTable extends keyof DB & string,
619619 TSelected,
620620 TJoined extends string,
@@ -639,7 +639,7 @@ type _TypedDynamicWhereMethods<
639639// resolution, silently downgrading `toSQL()` from the composed literal SQL
640640// type back to `string` after any dynamic-where call.
641641export type TypedSelectQueryBuilder<
642 DB extends DatabaseSchema<any>,
642 DB extends AnyDatabaseSchema,
643643 TTable extends keyof DB & string,
644644 TSelected,
645645 TJoined extends string = TTable,
@@ -685,7 +685,7 @@ export type TypedSelectQueryBuilder<
685685}
686686
687687type DynamicWhereMethods<
688 DB extends DatabaseSchema<any>,
688 DB extends AnyDatabaseSchema,
689689 TTable extends keyof DB & string,
690690 TSelected,
691691 TJoined extends string = TTable,
@@ -698,7 +698,7 @@ type DynamicWhereMethods<
698698}
699699
700700export interface BaseSelectQueryBuilder<
701 DB extends DatabaseSchema<any>,
701 DB extends AnyDatabaseSchema,
702702 TTable extends keyof DB & string,
703703 TSelected,
704704 TJoined extends string = TTable,
@@ -926,7 +926,7 @@ export interface BaseSelectQueryBuilder<
926926 /** OR-connected counterpart of `whereNotNull`. */
927927 orWhereNotNull: (column: keyof DB[TTable]['columns'] & string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
928928 /** OR-connected counterpart of `whereBetween`. */
929 orWhereBetween: (column: keyof DB[TTable]['columns'] & string, start: any, end: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
929 orWhereBetween: <K extends keyof DB[TTable]['columns'] & string>(column: K, start: DB[TTable]['columns'][K], end: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
930930 /** OR-connected counterpart of `whereExists`. */
931931 orWhereExists: (subquery: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
932932 /**
@@ -1906,13 +1906,13 @@ export interface BaseSelectQueryBuilder<
19061906}
19071907
19081908export type SelectQueryBuilder<
1909 DB extends DatabaseSchema<any>,
1909 DB extends AnyDatabaseSchema,
19101910 TTable extends keyof DB & string,
19111911 TSelected,
19121912 TJoined extends string = TTable,
19131913> = BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
19141914
1915export interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
1915export interface InsertQueryBuilder<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> {
19161916 /**
19171917 * # `values`
19181918 *
@@ -1965,7 +1965,7 @@ export interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
19651965 executeTakeFirstOrThrow: () => Promise<DB[TTable]['columns']>
19661966}
19671967
1968export interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
1968export interface UpdateQueryBuilder<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> {
19691969 /**
19701970 * # `set`
19711971 *
@@ -2064,7 +2064,7 @@ export interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
20642064 executeTakeFirstOrThrow: () => Promise<{ numUpdatedRows: number }>
20652065}
20662066
2067export interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
2067export interface DeleteQueryBuilder<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> {
20682068 /**
20692069 * # `where`
20702070 *
@@ -2144,7 +2144,7 @@ export interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
21442144 executeTakeFirstOrThrow: () => Promise<{ numDeletedRows: number }>
21452145}
21462146
2147export interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
2147export interface TableQueryBuilder<DB extends AnyDatabaseSchema, TTable extends keyof DB & string> {
21482148 /**
21492149 * # `insert`
21502150 *
@@ -2192,7 +2192,7 @@ export interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extend
21922192 select: <K extends keyof DB[TTable]['columns'] & string>(...columns: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
21932193}
21942194
2195export interface QueryBuilder<DB extends DatabaseSchema<any>> {
2195export interface QueryBuilder<DB extends AnyDatabaseSchema> {
21962196 // typed select list (column names or raw aliases)
21972197 /**
21982198 * # `select`
@@ -2660,7 +2660,7 @@ finally { reserved.release() }
26602660
26612661// Typed INSERT builder to expose a structured SQL literal in hovers
26622662export type TypedInsertQueryBuilder<
2663 DB extends DatabaseSchema<any>,
2663 DB extends AnyDatabaseSchema,
26642664 TTable extends keyof DB & string,
26652665 TSql extends string = `INSERT INTO ${TTable}`,
26662666> = Omit<InsertQueryBuilder<DB, TTable>, 'toSQL' | 'values' | 'returning'> & {
@@ -2680,9 +2680,10 @@ export type TypedInsertQueryBuilder<
26802680}
26812681
26822682interface InternalState {
2683 sql: any
2683 /** The driver handle - Bun's `SQL` or our SQLite wrapper, both `DriverConnection`. */
2684 sql: DriverConnection
26842685 meta?: SchemaMeta
2685 schema?: any
2686 schema?: AnyDatabaseSchema
26862687 txDefaults?: TransactionOptions
26872688 /**
26882689 * Lifecycle hooks for this builder specifically.
renamed throughout · 13 hidden lines
Changes to packages/bun-query-builder/src/client.ts
@@ -2725,11 +2726,11 @@ function isRetriableTxError(err: any): boolean { renamed throughout
27252726
27262727type TransactionIsolation = 'read committed' | 'repeatable read' | 'serializable'
27272728interface TxBackoff { baseMs?: number, maxMs?: number, factor?: number, jitter?: boolean }
2728interface TxLoggerEvent { type: 'start' | 'retry' | 'commit' | 'rollback' | 'error', attempt: number, error?: any, durationMs?: number }
2729interface TxLoggerEvent { type: 'start' | 'retry' | 'commit' | 'rollback' | 'error', attempt: number, error?: unknown, durationMs?: number }
27292730export interface TransactionOptions {
27302731 retries?: number
27312732 isolation?: TransactionIsolation
2732 onRetry?: (attempt: number, error: any) => void
2733 onRetry?: (attempt: number, error: unknown) => void
27332734 afterCommit?: () => void
27342735 sqlStates?: string[]
27352736 backoff?: TxBackoff
Changes to packages/bun-query-builder/src/client.ts
@@ -2737,7 +2738,7 @@ export interface TransactionOptions {
27372738 /** When true, executes transaction in read-only mode (where supported). */
27382739 readOnly?: boolean
27392740 /** Called when a transaction is rolled back. */
2740 onRollback?: (error: any) => void
2741 onRollback?: (error: unknown) => void
27412742 /** Called after rollback completes. */
27422743 afterRollback?: () => void
27432744}
@@ -2903,7 +2904,7 @@ function computeBackoffMs(attempt: number, cfg?: TxBackoff): number {
29032904}
29042905
29052906// eslint-disable-next-line pickier/no-unused-vars
2906export function createQueryBuilder<DB extends DatabaseSchema<any>>(state?: Partial<InternalState>): QueryBuilder<DB> {
2907export function createQueryBuilder<DB extends AnyDatabaseSchema>(state?: Partial<InternalState>): QueryBuilder<DB> {
29072908 // Single boundary cast: `state.sql` is `any` (allows mock/tx injection) and
29082909 // getOrCreateBunSql() returns Bun's `SQL`; both satisfy DriverConnection. With
29092910 // `_sql` typed, the downstream `.unsafe(...)` calls no longer need casts (#1044).