bun-query-builder 0.2.26 → 0.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/browser.d.ts CHANGED
@@ -14,6 +14,14 @@ export declare function getBrowserConfig(): BrowserConfig;
14
14
  * Check if we're in a browser environment
15
15
  */
16
16
  export declare function isBrowser(): boolean;
17
+ /**
18
+ * Get the current auth token
19
+ */
20
+ declare function getAuthToken(): Promise<string | null>;
21
+ /**
22
+ * Build fetch headers with auth
23
+ */
24
+ declare function buildHeaders(): Promise<HeadersInit>;
17
25
  /**
18
26
  * Create a browser query builder for a table
19
27
  */
@@ -53,19 +61,17 @@ export declare function createBrowserDb<Tables extends Record<string, any>>(): {
53
61
  * // type: ('admin' | 'user' | 'moderator')[]
54
62
  * ```
55
63
  */
56
- export declare function createBrowserModel<const TDef extends BrowserModelDefinition>(definition: TDef): void;
64
+ export declare function createBrowserModel<const TDef extends BrowserModelDefinition>(definition: TDef): unknown;
57
65
  /**
58
66
  * Auth helpers for browser
59
67
  * @defaultValue
60
68
  * ```ts
61
69
  * {
62
- * login: (credentials?: { email: string, password: string }): Promise<{ user: Record<string, unknown>, token: string }> {
63
- * const response) => Promise<unknown>,
64
- * register: (data?: { name: string, email: string, password: string }): Promise<{ user: Record<string, unknown>, token: string }> {
65
- * const response) => Promise<unknown>,
66
- * logout: () => unknown,
67
- * user: () => unknown,
68
- * check: () => unknown
70
+ * login: (credentials: { email: string, password: string }) => Promise<{ user: Record<string, unknown>, token: string }>,
71
+ * register: (data: { name: string, email: string, password: string }) => Promise<{ user: Record<string, unknown>, token: string }>,
72
+ * logout: () => Promise<void>,
73
+ * user: () => Promise<Record<string, unknown> | null>,
74
+ * check: () => Promise<boolean>
69
75
  * }
70
76
  * ```
71
77
  */
package/dist/client.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { config } from './config';
2
2
  import { resetConnection } from './db';
3
3
  import type { DatabaseSchema } from './schema';
4
+ import type { DriverConnection } from './db';
4
5
  import type { QueryHooks } from './types';
5
6
  import type { SchemaMeta } from './meta';
6
7
  /**
@@ -59,20 +60,24 @@ declare interface RawExpression {
59
60
  raw: string
60
61
  }
61
62
  export declare interface WhereRaw {
62
- raw: any
63
+ raw: SqlFragment
63
64
  }
64
65
  export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable,> {
65
66
  distinct: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
66
67
  distinctOn: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
67
68
  selectRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
68
- where: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => SelectQueryBuilder<DB, TTable, TSelected>
69
+ where: <K extends keyof DB[TTable]['columns'] & string>(
70
+ expr: WhereExpression<DB[TTable]['columns']> | K,
71
+ op?: WhereOperator,
72
+ value?: WhereValue<DB[TTable]['columns'][K]>,
73
+ ) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
69
74
  whereRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
70
75
  whereColumn: (left: string, op: WhereOperator, right: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
71
76
  orWhereColumn: (left: string, op: WhereOperator, right: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
72
- whereIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
73
- orWhereIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
74
- whereNotIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
75
- orWhereNotIn: (column: keyof DB[TTable]['columns'] & string, values: any[] | { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
77
+ whereIn: <K extends keyof DB[TTable]['columns'] & string>(column: K, values: DB[TTable]['columns'][K][] | { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
78
+ orWhereIn: <K extends keyof DB[TTable]['columns'] & string>(column: K, values: DB[TTable]['columns'][K][] | { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
79
+ whereNotIn: <K extends keyof DB[TTable]['columns'] & string>(column: K, values: DB[TTable]['columns'][K][] | { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
80
+ orWhereNotIn: <K extends keyof DB[TTable]['columns'] & string>(column: K, values: DB[TTable]['columns'][K][] | { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
76
81
  whereLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
77
82
  whereILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
78
83
  orWhereLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
@@ -81,18 +86,26 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
81
86
  whereNotILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
82
87
  orWhereNotLike: (column: keyof DB[TTable]['columns'] & string, pattern: string, caseSensitive?: boolean) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
83
88
  orWhereNotILike?: (column: keyof DB[TTable]['columns'] & string, pattern: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
84
- whereAny: (columns: (keyof DB[TTable]['columns'] & string)[], op: WhereOperator, value: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
85
- whereAll: (columns: (keyof DB[TTable]['columns'] & string)[], op: WhereOperator, value: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
86
- whereNone: (columns: (keyof DB[TTable]['columns'] & string)[], op: WhereOperator, value: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
87
- whereNested: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
88
- orWhereNested: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
89
+ whereAny: <K extends keyof DB[TTable]['columns'] & string>(columns: K[], op: WhereOperator, value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
90
+ whereAll: <K extends keyof DB[TTable]['columns'] & string>(columns: K[], op: WhereOperator, value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
91
+ whereNone: <K extends keyof DB[TTable]['columns'] & string>(columns: K[], op: WhereOperator, value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
92
+ whereNested: (fragment: { toSQL: () => string } | SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
93
+ orWhereNested: (fragment: { toSQL: () => string } | SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
89
94
  whereDate: (column: string, op: WhereOperator, date: string | Date) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
90
- whereBetween: (column: string, start: any, end: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
91
- whereNotBetween: (column: string, start: any, end: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
95
+ whereBetween: <K extends keyof DB[TTable]['columns'] & string>(column: K, start: DB[TTable]['columns'][K], end: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
96
+ whereNotBetween: <K extends keyof DB[TTable]['columns'] & string>(column: K, start: DB[TTable]['columns'][K], end: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
92
97
  whereJsonContains: (column: string, json: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
93
98
  whereJsonPath?: (path: string, op: WhereOperator, value: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
94
- andWhere: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => SelectQueryBuilder<DB, TTable, TSelected>
95
- orWhere: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => SelectQueryBuilder<DB, TTable, TSelected>
99
+ andWhere: <K extends keyof DB[TTable]['columns'] & string>(
100
+ expr: WhereExpression<DB[TTable]['columns']> | K,
101
+ op?: WhereOperator,
102
+ value?: WhereValue<DB[TTable]['columns'][K]>,
103
+ ) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
104
+ orWhere: <K extends keyof DB[TTable]['columns'] & string>(
105
+ expr: WhereExpression<DB[TTable]['columns']> | K,
106
+ op?: WhereOperator,
107
+ value?: WhereValue<DB[TTable]['columns'][K]>,
108
+ ) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
96
109
  orderBy: (column: ColumnName<DB, TTable>, direction?: SortDirection) => SelectQueryBuilder<DB, TTable, TSelected>
97
110
  orderByDesc: (column: ColumnName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected>
98
111
  inRandomOrder: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
@@ -102,14 +115,14 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
102
115
  limit: (n: number) => SelectQueryBuilder<DB, TTable, TSelected>
103
116
  offset: (n: number) => SelectQueryBuilder<DB, TTable, TSelected>
104
117
  withTimeout?: (ms: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
105
- abort?: (signal: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
118
+ abort?: (signal: AbortSignal) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
106
119
  join: <T2 extends keyof DB & string>(
107
120
  table: T2,
108
121
  onLeft: JoinColumn<DB, TJoined | T2>,
109
122
  operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',
110
123
  onRight: JoinColumn<DB, TJoined | T2>,
111
124
  ) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
112
- joinSub: (sub: { toSQL: () => any }, alias: string, onLeft: string, operator: WhereOperator, onRight: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
125
+ joinSub: (sub: { toSQL: () => string }, alias: string, onLeft: string, operator: WhereOperator, onRight: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
113
126
  innerJoin: <T2 extends keyof DB & string>(
114
127
  table: T2,
115
128
  onLeft: JoinColumn<DB, TJoined | T2>,
@@ -122,7 +135,7 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
122
135
  operator: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',
123
136
  onRight: JoinColumn<DB, TJoined | T2>,
124
137
  ) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
125
- leftJoinSub: (sub: { toSQL: () => any }, alias: string, onLeft: string, operator: WhereOperator, onRight: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
138
+ leftJoinSub: (sub: { toSQL: () => string }, alias: string, onLeft: string, operator: WhereOperator, onRight: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
126
139
  rightJoin: <T2 extends keyof DB & string>(
127
140
  table: T2,
128
141
  onLeft: JoinColumn<DB, TJoined | T2>,
@@ -130,10 +143,10 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
130
143
  onRight: JoinColumn<DB, TJoined | T2>,
131
144
  ) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
132
145
  crossJoin: <T2 extends keyof DB & string>(table: T2) => SelectQueryBuilder<DB, TTable, TSelected, TJoined | T2>
133
- crossJoinSub: (sub: { toSQL: () => any }, alias: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
146
+ crossJoinSub: (sub: { toSQL: () => string }, alias: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
134
147
  groupBy: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
135
148
  groupByRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
136
- having: (expr: WhereExpression<any>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
149
+ having: (expr: WhereExpression<TSelected>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
137
150
  havingRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
138
151
  addSelect: (...columns: ((keyof DB[TTable]['columns'] & string) | string | SqlFragment)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
139
152
  select?: {
@@ -142,38 +155,38 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
142
155
  }
143
156
  selectAll?: () => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TJoined>
144
157
  orderByRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
145
- union: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
146
- unionAll: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
158
+ union: (other: { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
159
+ unionAll: (other: { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
147
160
  forPage: (page: number, perPage: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
148
- selectAllRelations?: () => SelectQueryBuilder<DB, TTable, any, TJoined>
161
+ selectAllRelations?: () => SelectQueryBuilder<DB, TTable, TSelected & Record<string, unknown>, TJoined>
149
162
  whereNull?: (column: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
150
163
  whereNotNull?: (column: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
151
- whereExists?: (subquery: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
164
+ whereExists?: (subquery: { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
152
165
  whereJsonDoesntContain?: (column: string, json: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
153
166
  whereJsonContainsKey?: (path: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
154
167
  whereJsonDoesntContainKey?: (path: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
155
168
  whereJsonLength?: (path: string, opOrLen: WhereOperator | number, len?: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
156
- with?: (...relations: WithRelationArg<DB, TTable>[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
157
- whereHas?: (relation: TableRelationName<DB, TTable>, callback?: (qb: any) => any) => SelectQueryBuilder<DB, TTable, TSelected, any>
158
- whereDoesntHave?: (relation: TableRelationName<DB, TTable>, callback?: (qb: any) => any) => SelectQueryBuilder<DB, TTable, TSelected, any>
159
- has?: (relation: TableRelationName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected, any>
160
- doesntHave?: (relation: TableRelationName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected, any>
161
- withCount?: (...relations: TableRelationName<DB, TTable>[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
162
- withSum?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, any>
163
- withAvg?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, any>
164
- withMax?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, any>
165
- withMin?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, any>
166
- withPivot?: (relation: TableRelationName<DB, TTable>, ...columns: string[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
167
- wherePivot?: (relation: TableRelationName<DB, TTable>, column: string, opOrValue: any, value?: any) => SelectQueryBuilder<DB, TTable, TSelected, any>
168
- wherePivotIn?: (relation: TableRelationName<DB, TTable>, column: string, values: any[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
169
- wherePivotNotIn?: (relation: TableRelationName<DB, TTable>, column: string, values: any[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
170
- wherePivotNull?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, any>
171
- wherePivotNotNull?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, any>
172
- applyPivotColumns?: () => SelectQueryBuilder<DB, TTable, TSelected, any>
169
+ with?: (...relations: WithRelationArg<DB, TTable>[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
170
+ whereHas?: <R extends TableRelationName<DB, TTable>>(relation: R, callback?: (qb: RelationQueryBuilder<DB, TTable, R>) => unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
171
+ whereDoesntHave?: <R extends TableRelationName<DB, TTable>>(relation: R, callback?: (qb: RelationQueryBuilder<DB, TTable, R>) => unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
172
+ has?: (relation: TableRelationName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
173
+ doesntHave?: (relation: TableRelationName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
174
+ withCount?: <R extends TableRelationName<DB, TTable>>(...relations: R[]) => SelectQueryBuilder<DB, TTable, TSelected & { [K in `${R}_count`]: number }, TJoined>
175
+ withSum?: <R extends TableRelationName<DB, TTable>, K extends keyof DB[RelatedTableName<DB, TTable, R>]['columns'] & string>(relation: R, column: K) => SelectQueryBuilder<DB, TTable, TSelected & { [P in `${R}_sum_${K}`]: number }, TJoined>
176
+ withAvg?: <R extends TableRelationName<DB, TTable>, K extends keyof DB[RelatedTableName<DB, TTable, R>]['columns'] & string>(relation: R, column: K) => SelectQueryBuilder<DB, TTable, TSelected & { [P in `${R}_avg_${K}`]: number }, TJoined>
177
+ withMax?: <R extends TableRelationName<DB, TTable>, K extends keyof DB[RelatedTableName<DB, TTable, R>]['columns'] & string>(relation: R, column: K) => SelectQueryBuilder<DB, TTable, TSelected & { [P in `${R}_max_${K}`]: DB[RelatedTableName<DB, TTable, R>]['columns'][K] | null }, TJoined>
178
+ withMin?: <R extends TableRelationName<DB, TTable>, K extends keyof DB[RelatedTableName<DB, TTable, R>]['columns'] & string>(relation: R, column: K) => SelectQueryBuilder<DB, TTable, TSelected & { [P in `${R}_min_${K}`]: DB[RelatedTableName<DB, TTable, R>]['columns'][K] | null }, TJoined>
179
+ withPivot?: (relation: TableRelationName<DB, TTable>, ...columns: string[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
180
+ wherePivot?: (relation: TableRelationName<DB, TTable>, column: string, opOrValue: unknown, value?: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
181
+ wherePivotIn?: (relation: TableRelationName<DB, TTable>, column: string, values: unknown[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
182
+ wherePivotNotIn?: (relation: TableRelationName<DB, TTable>, column: string, values: unknown[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
183
+ wherePivotNull?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
184
+ wherePivotNotNull?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
185
+ applyPivotColumns?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
173
186
  lockForUpdate: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
174
187
  sharedLock: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
175
- withCTE: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
176
- withRecursive: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
188
+ withCTE: (name: string, sub: { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
189
+ withRecursive: (name: string, sub: { toSQL: () => string }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
177
190
  value: <K extends keyof TSelected & string>(column: K) => Promise<SelectedRow<DB, TTable, TSelected>[K]>
178
191
  pluck: {
179
192
  <K extends keyof TSelected & string>(column: K): Promise<SelectedRow<DB, TTable, TSelected>[K][]>
@@ -182,17 +195,17 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
182
195
  exists: () => Promise<boolean>
183
196
  doesntExist: () => Promise<boolean>
184
197
  cursorPaginate: (perPage: number, cursor?: string | number, column?: string, direction?: 'asc' | 'desc') => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, nextCursor: string | number | null } }>
185
- chunk: (size: number, handler: (rows: any[]) => Promise<void> | void) => Promise<void>
186
- chunkById: (size: number, column?: string, handler?: (rows: any[]) => Promise<void> | void) => Promise<void>
187
- eachById: (size: number, column?: string, handler?: (row: any) => Promise<void> | void) => Promise<void>
188
- when: (condition: any, then: (qb: any) => any, otherwise?: (qb: any) => any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
189
- tap: (fn: (qb: any) => any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
198
+ chunk: (size: number, handler: (rows: SelectedRow<DB, TTable, TSelected>[]) => Promise<void> | void) => Promise<void>
199
+ chunkById: (size: number, column?: keyof DB[TTable]['columns'] & string, handler?: (rows: SelectedRow<DB, TTable, TSelected>[]) => Promise<void> | void) => Promise<void>
200
+ eachById: (size: number, column?: keyof DB[TTable]['columns'] & string, handler?: (row: SelectedRow<DB, TTable, TSelected>) => Promise<void> | void) => Promise<void>
201
+ when: (condition: unknown, then: (qb: SelectQueryBuilder<DB, TTable, TSelected, TJoined>) => unknown, otherwise?: (qb: SelectQueryBuilder<DB, TTable, TSelected, TJoined>) => unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
202
+ tap: (fn: (qb: SelectQueryBuilder<DB, TTable, TSelected, TJoined>) => unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
190
203
  dump: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
191
204
  dd: () => never
192
- explain: () => Promise<any[]>
193
- simple: () => any
205
+ explain: () => Promise<Record<string, unknown>[]>
206
+ simple: () => unknown
194
207
  toText?: () => string
195
- paginate: (perPage: number, page?: number, opts?: { tx?: { unsafe: (sql: string, params?: any[]) => any } }) => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, page: number, total: number, lastPage: number } }>
208
+ paginate: (perPage: number, page?: number, opts?: { tx?: { unsafe: (sql: string, params?: unknown[]) => unknown } }) => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, page: number, total: number, lastPage: number } }>
196
209
  simplePaginate: (perPage: number, page?: number) => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, page: number, hasMore: boolean } }>
197
210
  toSQL: () => string
198
211
  execute: () => Promise<SelectedRow<DB, TTable, TSelected>[]>
@@ -201,26 +214,26 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
201
214
  get: () => Promise<SelectedRow<DB, TTable, TSelected>[]>
202
215
  first: () => Promise<SelectedRow<DB, TTable, TSelected> | undefined>
203
216
  firstOrFail: () => Promise<SelectedRow<DB, TTable, TSelected>>
204
- find: (id: any) => Promise<SelectedRow<DB, TTable, TSelected> | undefined>
205
- findOrFail: (id: any) => Promise<SelectedRow<DB, TTable, TSelected>>
206
- findMany: (ids: any[]) => Promise<TSelected[]>
207
- lazy: () => AsyncIterable<TSelected>
208
- lazyById: () => AsyncIterable<TSelected>
217
+ find: (id: PrimaryKeyValue<DB, TTable>) => Promise<SelectedRow<DB, TTable, TSelected> | undefined>
218
+ findOrFail: (id: PrimaryKeyValue<DB, TTable>) => Promise<SelectedRow<DB, TTable, TSelected>>
219
+ findMany: (ids: PrimaryKeyValue<DB, TTable>[]) => Promise<SelectedRow<DB, TTable, TSelected>[]>
220
+ lazy: () => AsyncIterable<SelectedRow<DB, TTable, TSelected>>
221
+ lazyById: () => AsyncIterable<SelectedRow<DB, TTable, TSelected>>
209
222
  pipe: <R>(fn: (qb: SelectQueryBuilder<DB, TTable, TSelected, TJoined>) => R) => R
210
223
  count: () => Promise<number>
211
- avg: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
212
- sum: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
224
+ avg: (column: NumericColumnName<DB[TTable]['columns']>) => Promise<number>
225
+ sum: (column: NumericColumnName<DB[TTable]['columns']>) => Promise<number>
213
226
  max: <K extends keyof DB[TTable]['columns'] & string>(column: K) => Promise<DB[TTable]['columns'][K] | null>
214
227
  min: <K extends keyof DB[TTable]['columns'] & string>(column: K) => Promise<DB[TTable]['columns'][K] | null>
215
228
  readonly rows: TSelected[]
216
229
  readonly row: TSelected
217
- values: () => Promise<any[][]>
218
- toParams?: () => any[]
219
- raw: () => Promise<any[][]>
230
+ values: () => Promise<unknown[][]>
231
+ toParams?: () => unknown[]
232
+ raw: () => Promise<unknown[][]>
220
233
  cancel: () => void
221
234
  withTrashed?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
222
235
  onlyTrashed?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
223
- scope?: (name: string, value?: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
236
+ scope?: (name: string, value?: unknown) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
224
237
  clone?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
225
238
  cache?: (ttlMs?: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
226
239
  rowNumber?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
@@ -238,7 +251,11 @@ export declare interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTab
238
251
  }
239
252
  export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
240
253
  set: (values: Partial<{ [K in keyof DB[TTable]['columns']]: DB[TTable]['columns'][K] | SqlFragment }>) => UpdateQueryBuilder<DB, TTable>
241
- where: (expr: WhereExpression<DB[TTable]['columns']> | string | SqlFragment, op?: WhereOperator, value?: any) => UpdateQueryBuilder<DB, TTable>
254
+ where: <K extends keyof DB[TTable]['columns'] & string>(
255
+ expr: WhereExpression<DB[TTable]['columns']> | K | SqlFragment,
256
+ op?: WhereOperator,
257
+ value?: WhereValue<DB[TTable]['columns'][K]>,
258
+ ) => UpdateQueryBuilder<DB, TTable>
242
259
  whereNull: <K extends keyof DB[TTable]['columns'] & string>(column: K) => UpdateQueryBuilder<DB, TTable>
243
260
  whereNotNull: <K extends keyof DB[TTable]['columns'] & string>(column: K) => UpdateQueryBuilder<DB, TTable>
244
261
  returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
@@ -249,7 +266,11 @@ export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTab
249
266
  executeTakeFirstOrThrow: () => Promise<{ numUpdatedRows: number }>
250
267
  }
251
268
  export declare interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
252
- where: (expr: WhereExpression<DB[TTable]['columns']> | string, op?: WhereOperator, value?: any) => DeleteQueryBuilder<DB, TTable>
269
+ where: <K extends keyof DB[TTable]['columns'] & string>(
270
+ expr: WhereExpression<DB[TTable]['columns']> | K,
271
+ op?: WhereOperator,
272
+ value?: WhereValue<DB[TTable]['columns'][K]>,
273
+ ) => DeleteQueryBuilder<DB, TTable>
253
274
  whereNull: <K extends keyof DB[TTable]['columns'] & string>(column: K) => DeleteQueryBuilder<DB, TTable>
254
275
  whereNotNull: <K extends keyof DB[TTable]['columns'] & string>(column: K) => DeleteQueryBuilder<DB, TTable>
255
276
  returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
@@ -274,26 +295,26 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
274
295
  <TTable extends keyof DB & string>(
275
296
  table: TTable,
276
297
  ...columns: ((keyof DB[TTable]['columns'] & string) | `${string} as ${string}`)[]
277
- ): SelectQueryBuilder<DB, TTable, any>
298
+ ): SelectQueryBuilder<DB, TTable, Record<string, unknown>>
278
299
  }
279
300
  selectFrom: <TTable extends keyof DB & string>(table: TTable) => TypedSelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable, `SELECT * FROM ${TTable}`>
280
301
  insertInto: <TTable extends keyof DB & string>(table: TTable) => TypedInsertQueryBuilder<DB, TTable>
281
302
  updateTable: <TTable extends keyof DB & string>(table: TTable) => UpdateQueryBuilder<DB, TTable>
282
303
  deleteFrom: <TTable extends keyof DB & string>(table: TTable) => DeleteQueryBuilder<DB, TTable>
283
304
  table: <TTable extends keyof DB & string>(table: TTable) => TableQueryBuilder<DB, TTable>
284
- selectFromSub: (sub: { toSQL: () => any }, alias: string) => SelectQueryBuilder<DB, keyof DB & string, any>
285
- sql: any
286
- raw: (strings: TemplateStringsArray, ...values: any[]) => any
287
- simple: (strings: TemplateStringsArray, ...values: any[]) => any
288
- unsafe: (query: string, params?: any[]) => Promise<any>
289
- file: (path: string, params?: any[]) => Promise<any>
305
+ selectFromSub: (sub: { toSQL: () => string }, alias: string) => SelectQueryBuilder<DB, keyof DB & string, Record<string, unknown>>
306
+ sql: DriverConnection
307
+ raw: (strings: TemplateStringsArray, ...values: unknown[]) => SqlFragment
308
+ simple: (strings: TemplateStringsArray, ...values: unknown[]) => unknown
309
+ unsafe: <TRow extends Record<string, unknown> = Record<string, unknown>>(query: string, params?: unknown[]) => Promise<TRow[]>
310
+ file: <TRow extends Record<string, unknown> = Record<string, unknown>>(path: string, params?: unknown[]) => Promise<TRow[]>
290
311
  reserve: () => Promise<(QueryBuilder<DB> & { release: () => void })>
291
312
  close: (opts?: { timeout?: number }) => Promise<void>
292
- listen: (channel: string, handler?: (payload: any) => void) => Promise<void>
313
+ listen: (channel: string, handler?: (payload: unknown) => void) => Promise<void>
293
314
  unlisten: (channel?: string) => Promise<void>
294
- notify: (channel: string, payload?: any) => Promise<void>
295
- copyTo: (queryOrTable: string, options?: Record<string, any>) => Promise<any>
296
- copyFrom: (queryOrTable: string, source: AsyncIterable<any> | Iterable<any>, options?: Record<string, any>) => Promise<any>
315
+ notify: (channel: string, payload?: unknown) => Promise<void>
316
+ copyTo: (queryOrTable: string, options?: Record<string, unknown>) => Promise<unknown>
317
+ copyFrom: (queryOrTable: string, source: AsyncIterable<unknown> | Iterable<unknown>, options?: Record<string, unknown>) => Promise<unknown>
297
318
  ping: () => Promise<boolean>
298
319
  waitForReady: (opts?: { attempts?: number, delayMs?: number }) => Promise<void>
299
320
  transaction: <T>(fn: (tx: QueryBuilder<DB>) => Promise<T> | T, options?: TransactionOptions) => Promise<T>
@@ -303,16 +324,16 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
303
324
  rollbackDistributed: (name: string) => Promise<void>
304
325
  configure: (opts: Partial<typeof config>) => QueryBuilder<DB>
305
326
  setTransactionDefaults: (defaults: TransactionOptions) => void
306
- transactional: <TArgs extends any[], R>(fn: (tx: QueryBuilder<DB>, ...args: TArgs) => Promise<R> | R, options?: TransactionOptions) => (...args: TArgs) => Promise<R>
327
+ transactional: <TArgs extends unknown[], R>(fn: (tx: QueryBuilder<DB>, ...args: TArgs) => Promise<R> | R, options?: TransactionOptions) => (...args: TArgs) => Promise<R>
307
328
  count: <TTable extends keyof DB & string>(table: TTable, column?: keyof DB[TTable]['columns'] & string) => Promise<number>
308
329
  sum: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<number>
309
330
  avg: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<number>
310
- min: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<any>
311
- max: <TTable extends keyof DB & string>(table: TTable, column: keyof DB[TTable]['columns'] & string) => Promise<any>
312
- insertOrIgnore: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => Promise<any>
313
- insertGetId: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?: keyof DB[TTable]['columns'] & string) => Promise<any>
331
+ min: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(table: TTable, column: K) => Promise<DB[TTable]['columns'][K] | null>
332
+ max: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(table: TTable, column: K) => Promise<DB[TTable]['columns'][K] | null>
333
+ insertOrIgnore: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => Promise<number>
334
+ insertGetId: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string = DB[TTable]['primaryKey'] & keyof DB[TTable]['columns'] & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?: K) => Promise<DB[TTable]['columns'][K]>
314
335
  updateOrInsert: <TTable extends keyof DB & string>(table: TTable, match: Partial<DB[TTable]['columns']>, values: Partial<DB[TTable]['columns']>) => Promise<boolean>
315
- upsert: <TTable extends keyof DB & string>(table: TTable, rows: Partial<DB[TTable]['columns']>[], conflictColumns: (keyof DB[TTable]['columns'] & string)[], mergeColumns?: (keyof DB[TTable]['columns'] & string)[]) => Promise<any>
336
+ upsert: <TTable extends keyof DB & string>(table: TTable, rows: Partial<DB[TTable]['columns']>[], conflictColumns: (keyof DB[TTable]['columns'] & string)[], mergeColumns?: (keyof DB[TTable]['columns'] & string)[]) => Promise<number>
316
337
  create: <TTable extends keyof DB & string>(
317
338
  table: TTable,
318
339
  values: Partial<DB[TTable]['columns']>,
@@ -332,7 +353,7 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
332
353
  ) => Promise<number>
333
354
  deleteMany: <TTable extends keyof DB & string>(
334
355
  table: TTable,
335
- ids: any[],
356
+ ids: PrimaryKeyValue<DB, TTable>[],
336
357
  ) => Promise<number>
337
358
  firstOrCreate: <TTable extends keyof DB & string>(
338
359
  table: TTable,
@@ -350,19 +371,19 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
350
371
  ) => Promise<DB[TTable]['columns']>
351
372
  remove: <TTable extends keyof DB & string>(
352
373
  table: TTable,
353
- id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
354
- ) => Promise<any>
374
+ id: PrimaryKeyValue<DB, TTable>,
375
+ ) => Promise<unknown>
355
376
  find: <TTable extends keyof DB & string>(
356
377
  table: TTable,
357
- id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
378
+ id: PrimaryKeyValue<DB, TTable>,
358
379
  ) => Promise<DB[TTable]['columns'] | undefined>
359
380
  findOrFail: <TTable extends keyof DB & string>(
360
381
  table: TTable,
361
- id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
382
+ id: PrimaryKeyValue<DB, TTable>,
362
383
  ) => Promise<DB[TTable]['columns']>
363
384
  findMany: <TTable extends keyof DB & string>(
364
385
  table: TTable,
365
- ids: any[],
386
+ ids: PrimaryKeyValue<DB, TTable>[],
366
387
  ) => Promise<DB[TTable]['columns'][]>
367
388
  latest: <TTable extends keyof DB & string>(
368
389
  table: TTable,
@@ -376,13 +397,13 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
376
397
  table: TTable,
377
398
  count: number,
378
399
  ) => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable>
379
- rawQuery: (query: string) => Promise<any>
380
- id?: (name: string) => any
381
- ids?: (...names: string[]) => any
400
+ rawQuery: (query: string) => Promise<Record<string, unknown>[]>
401
+ id?: (name: string) => SqlFragment
402
+ ids?: (...names: string[]) => SqlFragment
382
403
  advisoryLock?: (key: number | string) => Promise<void>
383
404
  tryAdvisoryLock?: (key: number | string) => Promise<boolean>
384
405
  advisoryUnlock?: (key: number | string) => Promise<boolean>
385
- getRelationships?: (table: string) => Record<string, any>
406
+ getRelationships?: (table: string) => Record<string, unknown>
386
407
  hasRelationship?: (table: string, relationName: string) => boolean
387
408
  getRelationshipType?: (table: string, relationName: string) => string | null
388
409
  getRelationshipTarget?: (table: string, relationName: string) => string | null
@@ -435,10 +456,11 @@ export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in'
435
456
  * See stacksjs/stacks#1858 Q-3.
436
457
  */
437
458
  export type SqlFragment = object;
438
- export type WhereExpression<TableColumns> = | Partial<{ [K in keyof TableColumns & string]: ValueOrRef | ValueOrRef[] }>
439
- | [key: keyof TableColumns & string, op: WhereOperator, value: ValueOrRef | ValueOrRef[]]
459
+ declare type WhereValue<T> = T | T[] | SqlFragment;
460
+ export type WhereExpression<TableColumns> = | Partial<{ [K in keyof TableColumns & string]: WhereValue<TableColumns[K]> }>
461
+ | { [K in keyof TableColumns & string]: [key: K, op: WhereOperator, value: WhereValue<TableColumns[K]>] }[keyof TableColumns & string]
440
462
  | WhereRaw;
441
- export type QueryResult = any;
463
+ export type QueryResult = unknown;
442
464
  /**
443
465
  * # `SortDirection`
444
466
  *
@@ -453,6 +475,14 @@ export type SortDirection = 'asc' | 'desc';
453
475
  export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string;
454
476
  // Named row alias to improve IDE hover readability
455
477
  export type SelectedRow<DB extends DatabaseSchema<any>, _TTable extends keyof DB & string, TSelected,> = Readonly<TSelected>;
478
+ declare type PrimaryKeyValue<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = DB[TTable]['primaryKey'] extends keyof DB[TTable]['columns']
479
+ ? DB[TTable]['columns'][DB[TTable]['primaryKey']]
480
+ : unknown;
481
+ declare type NumericColumnName<Columns> = {
482
+ [K in keyof Columns & string]: unknown extends Columns[K]
483
+ ? K
484
+ : Exclude<Columns[K], null | undefined> extends number ? K : never
485
+ }[keyof Columns & string];
456
486
  declare type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
457
487
  ? `${TTables}.${keyof DB[TTables]['columns'] & string}`
458
488
  : never;
@@ -469,6 +499,19 @@ declare type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string>
469
499
  export type TableRelationName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = DB[TTable] extends { relations?: infer R }
470
500
  ? unknown extends R ? string : keyof NonNullable<R> & string
471
501
  : string;
502
+ declare type RelatedTableName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TRelation extends TableRelationName<DB, TTable>,> = DB[TTable] extends { relations?: infer Relations }
503
+ ? TRelation extends keyof NonNullable<Relations>
504
+ ? Extract<NonNullable<Relations>[TRelation], keyof DB & string>
505
+ : keyof DB & string
506
+ : keyof DB & string;
507
+ declare type RelationQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TRelation extends TableRelationName<DB, TTable>,> = SelectQueryBuilder<
508
+ DB,
509
+ RelatedTableName<DB, TTable, TRelation>,
510
+ DB[RelatedTableName<DB, TTable, TRelation>]['columns']
511
+ >;
512
+ declare type RelationConstraintRecord<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = {
513
+ [R in TableRelationName<DB, TTable>]: Partial<Record<R, (qb: RelationQueryBuilder<DB, TTable, R>) => unknown>>
514
+ }[TableRelationName<DB, TTable>];
472
515
  /**
473
516
  * # `WithRelationArg<DB, TTable>`
474
517
  *
@@ -483,7 +526,7 @@ export type WithRelationArg<DB extends DatabaseSchema<any>, TTable extends keyof
483
526
  :
484
527
  | TableRelationName<DB, TTable>
485
528
  | `${TableRelationName<DB, TTable>}.${string}`
486
- | Partial<Record<TableRelationName<DB, TTable>, (qb: any) => any>>;
529
+ | RelationConstraintRecord<DB, TTable>;
487
530
  // Convert snake_case to PascalCase at the type level (e.g. created_at -> CreatedAt)
488
531
  declare type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
489
532
  ? `${Capitalize<H>}${SnakeToPascal<T>}`
@@ -518,29 +561,29 @@ export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
518
561
  where: (<K extends keyof DB[TTable]['columns'] & string>(
519
562
  expr: Record<K, DB[TTable]['columns'][K]>,
520
563
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
521
- expr: [K, OP, any],
564
+ expr: [K, OP, WhereValue<DB[TTable]['columns'][K]>],
522
565
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
523
566
  expr: WhereExpression<DB[TTable]['columns']> | string,
524
567
  op?: WhereOperator,
525
- value?: any,
568
+ value?: WhereValue<DB[TTable]['columns'][keyof DB[TTable]['columns'] & string]>,
526
569
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${string}`>)
527
570
  andWhere: (<K extends keyof DB[TTable]['columns'] & string>(
528
571
  expr: Record<K, DB[TTable]['columns'][K]>,
529
572
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
530
- expr: [K, OP, any],
573
+ expr: [K, OP, WhereValue<DB[TTable]['columns'][K]>],
531
574
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
532
575
  expr: WhereExpression<DB[TTable]['columns']> | string,
533
576
  op?: WhereOperator,
534
- value?: any,
577
+ value?: WhereValue<DB[TTable]['columns'][keyof DB[TTable]['columns'] & string]>,
535
578
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${string}`>)
536
579
  orWhere: (<K extends keyof DB[TTable]['columns'] & string>(
537
580
  expr: Record<K, DB[TTable]['columns'][K]>,
538
581
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
539
- expr: [K, OP, any],
582
+ expr: [K, OP, WhereValue<DB[TTable]['columns'][K]>],
540
583
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
541
584
  expr: WhereExpression<DB[TTable]['columns']> | string,
542
585
  op?: WhereOperator,
543
- value?: any,
586
+ value?: WhereValue<DB[TTable]['columns'][keyof DB[TTable]['columns'] & string]>,
544
587
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${string}`>)
545
588
  orderBy: <C extends keyof DB[TTable]['columns'] & string, D extends 'asc' | 'desc' = 'asc'>(
546
589
  column: C,
package/dist/config.d.ts CHANGED
@@ -9,6 +9,54 @@ import type { QueryBuilderConfig, QueryBuilderOptions, SupportedDialect } from '
9
9
  * `SingleStoreDriver` / `VitessDriver`) diverges.
10
10
  */
11
11
  export declare function isMysqlLike(dialect?: SupportedDialect): boolean;
12
+ /**
13
+ * Recursively merge `source` over `target`, returning a NEW object. Neither
14
+ * argument is mutated.
15
+ *
16
+ * The semantics below are load-bearing — each is pinned by a test or by a
17
+ * documented promise, so do not "simplify" them:
18
+ *
19
+ * - ARRAYS REPLACE. They do not concatenate or union. `SqliteConfig.pragmas`
20
+ * says so in its own doc comment, and `sqlite-bootstrap-pragmas.test.ts`
21
+ * asserts it by checking that `foreign_keys` is still 0 after an override
22
+ * that omits it — concatenation would flip that to 1.
23
+ * `transactionDefaults.sqlStates` is the same shape: a user narrowing
24
+ * retries to `['40002']` must stop retrying on `40001`, not keep it.
25
+ *
26
+ * - FUNCTIONS REPLACE. `isPlainObject` rejects them, so `QueryHooks` members
27
+ * and `BrowserConfig.getToken` / `transformResponse` stay opaque leaves. We
28
+ * never recurse into a function's own enumerable properties.
29
+ *
30
+ * - AN EXPLICIT `undefined` ASSIGNS; AN ABSENT KEY DOES NOT. The rule is
31
+ * PRESENCE, not value — `Object.keys(source)` contains a key written as
32
+ * `undefined` and does not contain one that was never written. Not a style
33
+ * choice: `resolve-dialect.test.ts` calls `setConfig({ dialect: undefined })`
34
+ * and expects `resolveDialect()` to fall back to `'postgres'`, and
35
+ * `sqlite-bootstrap-pragmas.test.ts` uses `sqlite: undefined` as the restore
36
+ * that un-does a pragma override for the rest of a shared-process run.
37
+ * Skipping `undefined` breaks both, and now that `hooks` deep-merges, an
38
+ * explicit `undefined` is also the only way to REMOVE a hook.
39
+ *
40
+ * - `null` ASSIGNS and is never recursed into. No field in
41
+ * `QueryBuilderConfig` is nullable, so a `null` arriving here is a caller
42
+ * mistake; assigning it surfaces that at the read site instead of hiding it.
43
+ *
44
+ * Arrays are copied by REFERENCE, being leaves — `config.transactionDefaults
45
+ * .sqlStates` is the same array as `defaultConfig`'s until something replaces
46
+ * it. Nothing in `src/` mutates a config array in place (the only read is an
47
+ * `.includes`), and cloning on every merge is not worth paying for that.
48
+ *
49
+ * `seen` is the chain of source objects currently being merged, so a source
50
+ * that points back at one of its own ancestors is treated as a leaf instead of
51
+ * recursed into. An embedding framework's config slice — the case this type
52
+ * exists to serve — routinely carries a parent back-pointer, and it typechecks
53
+ * fine because an optional field of an interface can be that interface. Without
54
+ * the guard that input spins for seconds, allocates gigabytes and dies with a
55
+ * stack overflow. It is a DEPTH chain, pushed and popped around the recursion,
56
+ * not a global set: the same object legitimately appearing under two different
57
+ * keys must merge both times, and a global set would silently drop the second.
58
+ */
59
+ declare function mergeObject(target: Record<string, unknown>, source: Record<string, unknown>, seen?: Set<object>): Record<string, unknown>;
12
60
  /**
13
61
  * The dialect a command should operate on.
14
62
  *
@@ -99,4 +147,27 @@ export declare function setConfig(userConfig: QueryBuilderOptions): void;
99
147
  */
100
148
  export declare function defineConfig(userConfig: QueryBuilderOptions): QueryBuilderOptions;
101
149
  export declare const defaultConfig: QueryBuilderConfig;
150
+ // The single, process-wide config object — stored on a `globalThis` symbol so
151
+ // that EVERY copy of this module shares one object, even if Bun's bundler
152
+ // inlines `config.ts` more than once. Previously this was an `export let` that
153
+ // `setConfig` mutated in place: it worked, but relied on the bundler keeping a
154
+ // never-reassigned live binding as a single shared binding, and the build had
155
+ // to regex-patch the emitted `__esm(init_config)` wrapper to keep readers and
156
+ // writers on the same binding. A `globalThis`-keyed `export const` removes both
157
+ // hazards — there is no module-local binding to split or rename, and `const`
158
+ // makes the "never reassign config" rule unenforceable-to-break.
159
+ //
160
+ // Notes:
161
+ // - `??=` so the first-evaluated copy wins and the rest reuse it.
162
+ // - `Symbol.for` is a process-global registry key (shared across copies). It
163
+ // is also shared across package versions in one process — that's the intended
164
+ // hardening; pin a versioned key if you ever need per-version isolation.
165
+ // - Synchronous + no top-level await here, so `bun --compile` is unaffected.
166
+ // - Seeded through `mergeObject`, not `{ ...defaultConfig }`. A shallow spread
167
+ // left `config.debug === defaultConfig.debug`, so the direct writes this
168
+ // package makes to the live config — `config.debug.captureText = true` in
169
+ // `actions/sql.ts` and `computeSqlText()` — were reaching into the exported
170
+ // DEFAULTS and permanently changing them. `mergeObject` clones every plain
171
+ // object node, which closes that.
172
+ declare const CONFIG_SINGLETON_KEY: symbol;
102
173
  export declare const config: QueryBuilderConfig;