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/actions/explain.d.ts +1 -1
- package/dist/actions/file.d.ts +1 -1
- package/dist/actions/inspect.d.ts +1 -1
- package/dist/actions/introspect.d.ts +4 -1
- package/dist/actions/ping.d.ts +1 -1
- package/dist/actions/sql.d.ts +5 -1
- package/dist/actions/unsafe.d.ts +1 -1
- package/dist/actions/wait-ready.d.ts +1 -1
- package/dist/bin/cli.js +331 -262
- package/dist/browser.d.ts +14 -8
- package/dist/client.d.ts +144 -101
- package/dist/config.d.ts +71 -0
- package/dist/db.d.ts +5 -0
- package/dist/model.d.ts +1 -1
- package/dist/orm.d.ts +4 -3
- package/dist/schema.d.ts +1 -1
- package/dist/src/index.js +178 -144
- package/dist/type-inference.d.ts +11 -3
- package/dist/types.d.ts +6 -1
- package/package.json +4 -4
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):
|
|
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
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
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:
|
|
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:
|
|
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:
|
|
73
|
-
orWhereIn:
|
|
74
|
-
whereNotIn:
|
|
75
|
-
orWhereNotIn:
|
|
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:
|
|
85
|
-
whereAll:
|
|
86
|
-
whereNone:
|
|
87
|
-
whereNested: (fragment:
|
|
88
|
-
orWhereNested: (fragment:
|
|
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:
|
|
91
|
-
whereNotBetween: (column:
|
|
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:
|
|
95
|
-
|
|
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:
|
|
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: () =>
|
|
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: () =>
|
|
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: () =>
|
|
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<
|
|
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: () =>
|
|
146
|
-
unionAll: (other: { toSQL: () =>
|
|
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,
|
|
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: () =>
|
|
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,
|
|
157
|
-
whereHas?:
|
|
158
|
-
whereDoesntHave?:
|
|
159
|
-
has?: (relation: TableRelationName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected,
|
|
160
|
-
doesntHave?: (relation: TableRelationName<DB, TTable>) => SelectQueryBuilder<DB, TTable, TSelected,
|
|
161
|
-
withCount?:
|
|
162
|
-
withSum?:
|
|
163
|
-
withAvg?:
|
|
164
|
-
withMax?:
|
|
165
|
-
withMin?:
|
|
166
|
-
withPivot?: (relation: TableRelationName<DB, TTable>, ...columns: string[]) => SelectQueryBuilder<DB, TTable, TSelected,
|
|
167
|
-
wherePivot?: (relation: TableRelationName<DB, TTable>, column: string, opOrValue:
|
|
168
|
-
wherePivotIn?: (relation: TableRelationName<DB, TTable>, column: string, values:
|
|
169
|
-
wherePivotNotIn?: (relation: TableRelationName<DB, TTable>, column: string, values:
|
|
170
|
-
wherePivotNull?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected,
|
|
171
|
-
wherePivotNotNull?: (relation: TableRelationName<DB, TTable>, column: string) => SelectQueryBuilder<DB, TTable, TSelected,
|
|
172
|
-
applyPivotColumns?: () => SelectQueryBuilder<DB, TTable, TSelected,
|
|
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: () =>
|
|
176
|
-
withRecursive: (name: string, sub: { toSQL: () =>
|
|
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:
|
|
186
|
-
chunkById: (size: number, column?: string, handler?: (rows:
|
|
187
|
-
eachById: (size: number, column?: string, handler?: (row:
|
|
188
|
-
when: (condition:
|
|
189
|
-
tap: (fn: (qb:
|
|
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<
|
|
193
|
-
simple: () =>
|
|
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?:
|
|
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:
|
|
205
|
-
findOrFail: (id:
|
|
206
|
-
findMany: (ids:
|
|
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:
|
|
212
|
-
sum: (column:
|
|
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<
|
|
218
|
-
toParams?: () =>
|
|
219
|
-
raw: () => Promise<
|
|
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?:
|
|
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:
|
|
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:
|
|
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,
|
|
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: () =>
|
|
285
|
-
sql:
|
|
286
|
-
raw: (strings: TemplateStringsArray, ...values:
|
|
287
|
-
simple: (strings: TemplateStringsArray, ...values:
|
|
288
|
-
unsafe: (query: string, params?:
|
|
289
|
-
file: (path: string, params?:
|
|
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:
|
|
313
|
+
listen: (channel: string, handler?: (payload: unknown) => void) => Promise<void>
|
|
293
314
|
unlisten: (channel?: string) => Promise<void>
|
|
294
|
-
notify: (channel: string, payload?:
|
|
295
|
-
copyTo: (queryOrTable: string, options?: Record<string,
|
|
296
|
-
copyFrom: (queryOrTable: string, source: AsyncIterable<
|
|
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
|
|
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
|
|
311
|
-
max: <TTable extends keyof DB & string
|
|
312
|
-
insertOrIgnore: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => Promise<
|
|
313
|
-
insertGetId: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?:
|
|
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<
|
|
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:
|
|
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
|
|
354
|
-
) => Promise<
|
|
374
|
+
id: PrimaryKeyValue<DB, TTable>,
|
|
375
|
+
) => Promise<unknown>
|
|
355
376
|
find: <TTable extends keyof DB & string>(
|
|
356
377
|
table: TTable,
|
|
357
|
-
id: DB
|
|
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
|
|
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:
|
|
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<
|
|
380
|
-
id?: (name: string) =>
|
|
381
|
-
ids?: (...names: string[]) =>
|
|
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,
|
|
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
|
-
|
|
439
|
-
|
|
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 =
|
|
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
|
-
|
|
|
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,
|
|
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?:
|
|
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,
|
|
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?:
|
|
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,
|
|
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?:
|
|
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;
|