bun-query-builder 0.1.2 → 0.1.6
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/benchmark.d.ts +12 -0
- package/dist/actions/cache.d.ts +6 -0
- package/dist/actions/console.d.ts +2 -0
- package/dist/actions/data.d.ts +15 -0
- package/dist/actions/db-info.d.ts +17 -0
- package/dist/actions/db-optimize.d.ts +11 -0
- package/dist/actions/db-wipe.d.ts +10 -0
- package/dist/actions/file.d.ts +2 -1
- package/dist/actions/index.d.ts +25 -8
- package/dist/actions/inspect.d.ts +24 -0
- package/dist/actions/introspect.d.ts +2 -1
- package/dist/actions/make-model.d.ts +7 -0
- package/dist/actions/migrate-generate.d.ts +5 -0
- package/dist/actions/migrate-rollback.d.ts +6 -0
- package/dist/actions/migrate-status.d.ts +9 -0
- package/dist/actions/migrate.d.ts +13 -3
- package/dist/actions/model-show.d.ts +20 -0
- package/dist/actions/query-explain-all.d.ts +14 -0
- package/dist/actions/relation-diagram.d.ts +11 -0
- package/dist/actions/seed.d.ts +8 -0
- package/dist/actions/sql.d.ts +2 -1
- package/dist/actions/unsafe.d.ts +2 -1
- package/dist/actions/validate.d.ts +16 -0
- package/dist/actions/wait-ready.d.ts +2 -1
- package/dist/client.d.ts +230 -158
- package/dist/config.d.ts +2 -1
- package/dist/db.d.ts +10 -0
- package/dist/drivers/index.d.ts +12 -0
- package/dist/drivers/mysql.d.ts +187 -0
- package/dist/drivers/postgres.d.ts +173 -0
- package/dist/drivers/sqlite.d.ts +175 -0
- package/dist/factory.d.ts +3 -6
- package/dist/index.d.ts +11 -9
- package/dist/index.js +5444 -869
- package/dist/loader.d.ts +3 -2
- package/dist/meta.d.ts +10 -2
- package/dist/migrations.d.ts +43 -43
- package/dist/schema.d.ts +36 -177
- package/dist/seeder.d.ts +21 -0
- package/dist/types.d.ts +60 -143
- package/package.json +18 -27
- package/LICENSE.md +0 -21
- package/README.md +0 -150
package/dist/client.d.ts
CHANGED
|
@@ -1,11 +1,141 @@
|
|
|
1
|
-
import { config } from './config';
|
|
2
1
|
import type { DatabaseSchema } from './schema';
|
|
3
2
|
import type { SchemaMeta } from './meta';
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
|
|
4
|
+
declare interface RawExpression {
|
|
5
|
+
raw: string
|
|
6
|
+
}
|
|
7
|
+
declare function isRawExpression(expr: unknown): expr is RawExpression;
|
|
8
|
+
declare const SQL_PATTERNS: {
|
|
9
|
+
SELECT_STAR: unknown;
|
|
10
|
+
SELECT: unknown;
|
|
11
|
+
SELECT_FROM: unknown;
|
|
12
|
+
WHERE: unknown;
|
|
13
|
+
IDENTIFIER: unknown;
|
|
14
|
+
DELETED_AT: unknown
|
|
15
|
+
};
|
|
16
|
+
declare interface CacheEntry {
|
|
17
|
+
data: any
|
|
18
|
+
expiresAt: number
|
|
19
|
+
}
|
|
20
|
+
declare const entry: unknown;
|
|
21
|
+
declare const firstKey: unknown;
|
|
22
|
+
declare const queryCache: unknown;
|
|
23
|
+
export declare type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not'
|
|
24
|
+
|
|
25
|
+
export interface WhereRaw {
|
|
6
26
|
raw: any
|
|
7
27
|
}
|
|
8
|
-
|
|
28
|
+
|
|
29
|
+
export type WhereExpression<TableColumns> =
|
|
30
|
+
| Partial<{ [K in keyof TableColumns & string]: ValueOrRef | ValueOrRef[] }>
|
|
31
|
+
| [key: keyof TableColumns & string, op: WhereOperator, value: ValueOrRef | ValueOrRef[]]
|
|
32
|
+
| WhereRaw
|
|
33
|
+
|
|
34
|
+
export type QueryResult = any
|
|
35
|
+
|
|
36
|
+
export type SortDirection = 'asc' | 'desc'
|
|
37
|
+
|
|
38
|
+
export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
|
|
39
|
+
export type SelectedRow<
|
|
40
|
+
DB extends DatabaseSchema<any>,
|
|
41
|
+
_TTable extends keyof DB & string,
|
|
42
|
+
TSelected,
|
|
43
|
+
> = Readonly<TSelected>
|
|
44
|
+
|
|
45
|
+
type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
|
|
46
|
+
? `${TTables}.${keyof DB[TTables]['columns'] & string}`
|
|
47
|
+
: never
|
|
48
|
+
|
|
49
|
+
type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
|
|
50
|
+
? `${Capitalize<H>}${SnakeToPascal<T>}`
|
|
51
|
+
: Capitalize<S>
|
|
52
|
+
|
|
53
|
+
type _TypedDynamicWhereMethods<
|
|
54
|
+
DB extends DatabaseSchema<any>,
|
|
55
|
+
TTable extends keyof DB & string,
|
|
56
|
+
TSelected,
|
|
57
|
+
TJoined extends string,
|
|
58
|
+
TSql extends string,
|
|
59
|
+
> = {
|
|
60
|
+
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (
|
|
61
|
+
value: DB[TTable]['columns'][K],
|
|
62
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>
|
|
63
|
+
} & {
|
|
64
|
+
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (
|
|
65
|
+
value: DB[TTable]['columns'][K],
|
|
66
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>
|
|
67
|
+
} & {
|
|
68
|
+
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (
|
|
69
|
+
value: DB[TTable]['columns'][K],
|
|
70
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export type TypedSelectQueryBuilder<
|
|
74
|
+
DB extends DatabaseSchema<any>,
|
|
75
|
+
TTable extends keyof DB & string,
|
|
76
|
+
TSelected,
|
|
77
|
+
TJoined extends string = TTable,
|
|
78
|
+
TSql extends string = `SELECT * FROM ${TTable}`,
|
|
79
|
+
> = Omit<
|
|
80
|
+
BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined>,
|
|
81
|
+
'toSQL' | 'where' | 'andWhere' | 'orWhere' | 'orderBy' | 'limit'
|
|
82
|
+
> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
83
|
+
& _TypedDynamicWhereMethods<DB, TTable, TSelected, TJoined, TSql>
|
|
84
|
+
& {
|
|
85
|
+
toSQL: () => TSql
|
|
86
|
+
where: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
87
|
+
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
88
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
89
|
+
expr: [K, OP, any],
|
|
90
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
91
|
+
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
92
|
+
op?: WhereOperator,
|
|
93
|
+
value?: any,
|
|
94
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${string}`>)
|
|
95
|
+
andWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
96
|
+
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
97
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
98
|
+
expr: [K, OP, any],
|
|
99
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
100
|
+
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
101
|
+
op?: WhereOperator,
|
|
102
|
+
value?: any,
|
|
103
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${string}`>)
|
|
104
|
+
orWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
105
|
+
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
106
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
107
|
+
expr: [K, OP, any],
|
|
108
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
109
|
+
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
110
|
+
op?: WhereOperator,
|
|
111
|
+
value?: any,
|
|
112
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${string}`>)
|
|
113
|
+
orderBy: <C extends keyof DB[TTable]['columns'] & string, D extends 'asc' | 'desc' = 'asc'>(
|
|
114
|
+
column: C,
|
|
115
|
+
direction?: D,
|
|
116
|
+
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} ORDER BY ${C} ${D}`>
|
|
117
|
+
limit: <N extends number>(n: N) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} LIMIT ${N}`>
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
type DynamicWhereMethods<
|
|
121
|
+
DB extends DatabaseSchema<any>,
|
|
122
|
+
TTable extends keyof DB & string,
|
|
123
|
+
TSelected,
|
|
124
|
+
TJoined extends string = TTable,
|
|
125
|
+
> = {
|
|
126
|
+
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
127
|
+
} & {
|
|
128
|
+
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
129
|
+
} & {
|
|
130
|
+
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface BaseSelectQueryBuilder<
|
|
134
|
+
DB extends DatabaseSchema<any>,
|
|
135
|
+
TTable extends keyof DB & string,
|
|
136
|
+
TSelected,
|
|
137
|
+
TJoined extends string = TTable,
|
|
138
|
+
> {
|
|
9
139
|
distinct: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
10
140
|
distinctOn: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
11
141
|
selectRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
@@ -80,6 +210,7 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
80
210
|
having: (expr: WhereExpression<any>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
81
211
|
havingRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
82
212
|
addSelect: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
213
|
+
select?: (columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
83
214
|
selectAll?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
84
215
|
orderByRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
85
216
|
union: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
@@ -94,35 +225,15 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
94
225
|
whereJsonDoesntContainKey?: (path: string) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
95
226
|
whereJsonLength?: (path: string, opOrLen: WhereOperator | number, len?: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
96
227
|
with?: (...relations: string[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
|
|
228
|
+
withPivot?: (relation: string, ...columns: string[]) => SelectQueryBuilder<DB, TTable, TSelected, any>
|
|
229
|
+
applyPivotColumns?: () => SelectQueryBuilder<DB, TTable, TSelected, any>
|
|
97
230
|
lockForUpdate: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
98
231
|
sharedLock: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
99
232
|
withCTE: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
100
233
|
withRecursive: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
101
234
|
value: <K extends keyof TSelected & string>(column: K) => Promise<SelectedRow<DB, TTable, TSelected>[K]>
|
|
102
235
|
pluck: {
|
|
103
|
-
/**
|
|
104
|
-
* # `pluck(column)`
|
|
105
|
-
*
|
|
106
|
-
* Returns an array of values for a single column.
|
|
107
|
-
*
|
|
108
|
-
* @example
|
|
109
|
-
* ```ts
|
|
110
|
-
* const names = await db.selectFrom('users').pluck('name')
|
|
111
|
-
* const ids = await db.selectFrom('users').orderBy('id').pluck('id')
|
|
112
|
-
* ```
|
|
113
|
-
*/
|
|
114
236
|
<K extends keyof TSelected & string>(column: K): Promise<SelectedRow<DB, TTable, TSelected>[K][]>
|
|
115
|
-
/**
|
|
116
|
-
* # `pluck(column, key)`
|
|
117
|
-
*
|
|
118
|
-
* Returns an object keyed by the given key column.
|
|
119
|
-
*
|
|
120
|
-
* @example
|
|
121
|
-
* ```ts
|
|
122
|
-
* const byId = await db.selectFrom('users').pluck('email', 'id')
|
|
123
|
-
* const map = await db.selectFrom('users').pluck('name', 'email')
|
|
124
|
-
* ```
|
|
125
|
-
*/
|
|
126
237
|
<K extends keyof TSelected & string, K2 extends keyof TSelected & string>(column: K, key: K2): Promise<Record<string, SelectedRow<DB, TTable, TSelected>[K]>>
|
|
127
238
|
}
|
|
128
239
|
exists: () => Promise<boolean>
|
|
@@ -153,8 +264,12 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
153
264
|
lazyById: () => AsyncIterable<TSelected>
|
|
154
265
|
pipe: <R>(fn: (qb: SelectQueryBuilder<DB, TTable, TSelected, TJoined>) => R) => R
|
|
155
266
|
count: () => Promise<number>
|
|
156
|
-
|
|
157
|
-
|
|
267
|
+
avg: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
|
|
268
|
+
sum: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
|
|
269
|
+
max: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
270
|
+
min: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
271
|
+
readonly rows: TSelected[]
|
|
272
|
+
readonly row: TSelected
|
|
158
273
|
values: () => Promise<any[][]>
|
|
159
274
|
toParams?: () => any[]
|
|
160
275
|
raw: () => Promise<any[][]>
|
|
@@ -163,17 +278,27 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
163
278
|
onlyTrashed?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
164
279
|
scope?: (name: string, value?: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
165
280
|
clone?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
281
|
+
cache?: (ttlMs?: number) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
166
282
|
rowNumber?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
167
283
|
denseRank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
168
284
|
rank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
169
285
|
}
|
|
170
|
-
|
|
286
|
+
|
|
287
|
+
export type SelectQueryBuilder<
|
|
288
|
+
DB extends DatabaseSchema<any>,
|
|
289
|
+
TTable extends keyof DB & string,
|
|
290
|
+
TSelected,
|
|
291
|
+
TJoined extends string = TTable,
|
|
292
|
+
> = BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
293
|
+
|
|
294
|
+
export interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
171
295
|
values: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
|
|
172
296
|
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
173
297
|
toSQL: () => string
|
|
174
298
|
execute: () => Promise<number | DB[TTable]['columns'] | DB[TTable]['columns'][]>
|
|
175
299
|
}
|
|
176
|
-
|
|
300
|
+
|
|
301
|
+
export interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
177
302
|
set: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
178
303
|
where: (expr: WhereExpression<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
179
304
|
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
@@ -181,14 +306,23 @@ export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTab
|
|
|
181
306
|
execute: () => Promise<number>
|
|
182
307
|
executeTakeFirst?: () => Promise<{ numUpdatedRows?: number }>
|
|
183
308
|
}
|
|
184
|
-
|
|
309
|
+
|
|
310
|
+
export interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
185
311
|
where: (expr: WhereExpression<DB[TTable]['columns']>) => DeleteQueryBuilder<DB, TTable>
|
|
186
312
|
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
187
313
|
toSQL: () => string
|
|
188
314
|
execute: () => Promise<number>
|
|
189
315
|
executeTakeFirst?: () => Promise<{ numDeletedRows?: number }>
|
|
190
316
|
}
|
|
191
|
-
|
|
317
|
+
|
|
318
|
+
export interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
319
|
+
insert: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
|
|
320
|
+
update: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
321
|
+
delete: () => DeleteQueryBuilder<DB, TTable>
|
|
322
|
+
select: (...columns: (keyof DB[TTable]['columns'] & string)[]) => SelectQueryBuilder<DB, TTable, any>
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
192
326
|
select: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(
|
|
193
327
|
table: TTable,
|
|
194
328
|
...columns: (K | `${string} as ${string}`)[]
|
|
@@ -197,6 +331,7 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
|
197
331
|
insertInto: <TTable extends keyof DB & string>(table: TTable) => TypedInsertQueryBuilder<DB, TTable>
|
|
198
332
|
updateTable: <TTable extends keyof DB & string>(table: TTable) => UpdateQueryBuilder<DB, TTable>
|
|
199
333
|
deleteFrom: <TTable extends keyof DB & string>(table: TTable) => DeleteQueryBuilder<DB, TTable>
|
|
334
|
+
table: <TTable extends keyof DB & string>(table: TTable) => TableQueryBuilder<DB, TTable>
|
|
200
335
|
selectFromSub: (sub: { toSQL: () => any }, alias: string) => SelectQueryBuilder<DB, keyof DB & string, any>
|
|
201
336
|
sql: any
|
|
202
337
|
raw: (strings: TemplateStringsArray, ...values: any[]) => any
|
|
@@ -229,187 +364,101 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
|
229
364
|
insertGetId: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
230
365
|
updateOrInsert: <TTable extends keyof DB & string>(table: TTable, match: Partial<DB[TTable]['columns']>, values: Partial<DB[TTable]['columns']>) => Promise<boolean>
|
|
231
366
|
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>
|
|
367
|
+
|
|
232
368
|
create: <TTable extends keyof DB & string>(
|
|
233
369
|
table: TTable,
|
|
234
370
|
values: Partial<DB[TTable]['columns']>,
|
|
235
371
|
) => Promise<DB[TTable]['columns']>
|
|
372
|
+
|
|
236
373
|
createMany: <TTable extends keyof DB & string>(
|
|
237
374
|
table: TTable,
|
|
238
375
|
rows: Partial<DB[TTable]['columns']>[],
|
|
239
376
|
) => Promise<void>
|
|
377
|
+
|
|
378
|
+
insertMany: <TTable extends keyof DB & string>(
|
|
379
|
+
table: TTable,
|
|
380
|
+
rows: Partial<DB[TTable]['columns']>[],
|
|
381
|
+
) => Promise<void>
|
|
382
|
+
|
|
383
|
+
updateMany: <TTable extends keyof DB & string>(
|
|
384
|
+
table: TTable,
|
|
385
|
+
conditions: WhereExpression<DB[TTable]['columns']>,
|
|
386
|
+
data: Partial<DB[TTable]['columns']>,
|
|
387
|
+
) => Promise<number>
|
|
388
|
+
|
|
389
|
+
deleteMany: <TTable extends keyof DB & string>(
|
|
390
|
+
table: TTable,
|
|
391
|
+
ids: any[],
|
|
392
|
+
) => Promise<number>
|
|
393
|
+
|
|
240
394
|
firstOrCreate: <TTable extends keyof DB & string>(
|
|
241
395
|
table: TTable,
|
|
242
396
|
match: Partial<DB[TTable]['columns']>,
|
|
243
397
|
defaults?: Partial<DB[TTable]['columns']>,
|
|
244
398
|
) => Promise<DB[TTable]['columns']>
|
|
399
|
+
|
|
245
400
|
updateOrCreate: <TTable extends keyof DB & string>(
|
|
246
401
|
table: TTable,
|
|
247
402
|
match: Partial<DB[TTable]['columns']>,
|
|
248
403
|
values: Partial<DB[TTable]['columns']>,
|
|
249
404
|
) => Promise<DB[TTable]['columns']>
|
|
405
|
+
|
|
250
406
|
save: <TTable extends keyof DB & string>(
|
|
251
407
|
table: TTable,
|
|
252
408
|
values: Partial<DB[TTable]['columns']>,
|
|
253
409
|
) => Promise<DB[TTable]['columns']>
|
|
410
|
+
|
|
254
411
|
remove: <TTable extends keyof DB & string>(
|
|
255
412
|
table: TTable,
|
|
256
413
|
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
257
414
|
) => Promise<any>
|
|
415
|
+
|
|
258
416
|
find: <TTable extends keyof DB & string>(
|
|
259
417
|
table: TTable,
|
|
260
418
|
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
261
419
|
) => Promise<DB[TTable]['columns'] | undefined>
|
|
420
|
+
|
|
262
421
|
findOrFail: <TTable extends keyof DB & string>(
|
|
263
422
|
table: TTable,
|
|
264
423
|
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
265
424
|
) => Promise<DB[TTable]['columns']>
|
|
425
|
+
|
|
266
426
|
findMany: <TTable extends keyof DB & string>(
|
|
267
427
|
table: TTable,
|
|
268
428
|
ids: any[],
|
|
269
429
|
) => Promise<DB[TTable]['columns'][]>
|
|
430
|
+
|
|
270
431
|
latest: <TTable extends keyof DB & string>(
|
|
271
432
|
table: TTable,
|
|
272
433
|
column?: keyof DB[TTable]['columns'] & string,
|
|
273
434
|
) => Promise<DB[TTable]['columns'] | undefined>
|
|
435
|
+
|
|
274
436
|
oldest: <TTable extends keyof DB & string>(
|
|
275
437
|
table: TTable,
|
|
276
438
|
column?: keyof DB[TTable]['columns'] & string,
|
|
277
439
|
) => Promise<DB[TTable]['columns'] | undefined>
|
|
440
|
+
|
|
278
441
|
skip: <TTable extends keyof DB & string>(
|
|
279
442
|
table: TTable,
|
|
280
443
|
count: number,
|
|
281
444
|
) => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable>
|
|
445
|
+
|
|
282
446
|
rawQuery: (query: string) => Promise<any>
|
|
283
447
|
id?: (name: string) => any
|
|
284
448
|
ids?: (...names: string[]) => any
|
|
285
449
|
advisoryLock?: (key: number | string) => Promise<void>
|
|
286
450
|
tryAdvisoryLock?: (key: number | string) => Promise<boolean>
|
|
451
|
+
getRelationships?: (table: string) => Record<string, any>
|
|
452
|
+
hasRelationship?: (table: string, relationName: string) => boolean
|
|
453
|
+
getRelationshipType?: (table: string, relationName: string) => string | null
|
|
454
|
+
getRelationshipTarget?: (table: string, relationName: string) => string | null
|
|
287
455
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
export declare interface TransactionOptions {
|
|
295
|
-
retries?: number
|
|
296
|
-
isolation?: TransactionIsolation
|
|
297
|
-
onRetry?: (attempt: number, error: any) => void
|
|
298
|
-
afterCommit?: () => void
|
|
299
|
-
sqlStates?: string[]
|
|
300
|
-
backoff?: TxBackoff
|
|
301
|
-
logger?: (event: TxLoggerEvent) => void
|
|
302
|
-
readOnly?: boolean
|
|
303
|
-
onRollback?: (error: any) => void
|
|
304
|
-
afterRollback?: () => void
|
|
305
|
-
}
|
|
306
|
-
declare interface TxBackoff {
|
|
307
|
-
baseMs?: number
|
|
308
|
-
maxMs?: number
|
|
309
|
-
factor?: number
|
|
310
|
-
jitter?: boolean
|
|
311
|
-
}
|
|
312
|
-
declare interface TxLoggerEvent {
|
|
313
|
-
type: 'start' | 'retry' | 'commit' | 'rollback' | 'error'
|
|
314
|
-
attempt: number
|
|
315
|
-
error?: any
|
|
316
|
-
durationMs?: number
|
|
317
|
-
}
|
|
318
|
-
// Where condition helpers
|
|
319
|
-
declare type Primitive = string | number | boolean | bigint | Date | null | undefined
|
|
320
|
-
declare type ValueOrRef = Primitive
|
|
321
|
-
export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not'
|
|
322
|
-
export type WhereExpression<TableColumns> = | Partial<{ [K in keyof TableColumns & string]: ValueOrRef | ValueOrRef[] }>
|
|
323
|
-
| [key: keyof TableColumns & string, op: WhereOperator, value: ValueOrRef | ValueOrRef[]]
|
|
324
|
-
| WhereRaw
|
|
325
|
-
export type QueryResult = any
|
|
326
|
-
/**
|
|
327
|
-
* # `SortDirection`
|
|
328
|
-
*
|
|
329
|
-
* The direction used when ordering query results.
|
|
330
|
-
*/
|
|
331
|
-
export type SortDirection = 'asc' | 'desc'
|
|
332
|
-
/**
|
|
333
|
-
* # `ColumnName<DB, TTable>`
|
|
334
|
-
*
|
|
335
|
-
* Helper type extracting a string union of column names for a given table.
|
|
336
|
-
*/
|
|
337
|
-
export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
|
|
338
|
-
// Named row alias to improve IDE hover readability
|
|
339
|
-
export type SelectedRow<DB extends DatabaseSchema<any>, _TTable extends keyof DB & string, TSelected> = Readonly<TSelected>
|
|
340
|
-
declare type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
|
|
341
|
-
? `${TTables}.${keyof DB[TTables]['columns'] & string}`
|
|
342
|
-
: never
|
|
343
|
-
// Convert snake_case to PascalCase at the type level (e.g. created_at -> CreatedAt)
|
|
344
|
-
declare type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
|
|
345
|
-
? `${Capitalize<H>}${SnakeToPascal<T>}`
|
|
346
|
-
: Capitalize<S>
|
|
347
|
-
// Typed SQL builder (type-level only). We piggy-back on the runtime builder but
|
|
348
|
-
// thread a phantom TSql string through method signatures so hovers can show the
|
|
349
|
-
// composed SQL at compile-time for common operations.
|
|
350
|
-
declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string, TSql extends string> = {
|
|
351
|
-
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (
|
|
352
|
-
value: DB[TTable]['columns'][K],
|
|
353
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>
|
|
354
|
-
} & {
|
|
355
|
-
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (
|
|
356
|
-
value: DB[TTable]['columns'][K],
|
|
357
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>
|
|
358
|
-
} & {
|
|
359
|
-
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (
|
|
360
|
-
value: DB[TTable]['columns'][K],
|
|
361
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>
|
|
362
|
-
}
|
|
363
|
-
export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable, TSql extends string = `SELECT * FROM ${TTable}`> = Omit<
|
|
364
|
-
BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined>,
|
|
365
|
-
'toSQL' | 'where' | 'andWhere' | 'orWhere' | 'orderBy' | 'limit'
|
|
366
|
-
> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
367
|
-
& _TypedDynamicWhereMethods<DB, TTable, TSelected, TJoined, TSql>
|
|
368
|
-
& {
|
|
369
|
-
toSQL: () => TSql
|
|
370
|
-
where: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
371
|
-
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
372
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
373
|
-
expr: [K, OP, any],
|
|
374
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
375
|
-
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
376
|
-
op?: WhereOperator,
|
|
377
|
-
value?: any,
|
|
378
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${string}`>)
|
|
379
|
-
andWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
380
|
-
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
381
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
382
|
-
expr: [K, OP, any],
|
|
383
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
384
|
-
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
385
|
-
op?: WhereOperator,
|
|
386
|
-
value?: any,
|
|
387
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${string}`>)
|
|
388
|
-
orWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
389
|
-
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
390
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
391
|
-
expr: [K, OP, any],
|
|
392
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
393
|
-
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
394
|
-
op?: WhereOperator,
|
|
395
|
-
value?: any,
|
|
396
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${string}`>)
|
|
397
|
-
orderBy: <C extends keyof DB[TTable]['columns'] & string, D extends 'asc' | 'desc' = 'asc'>(
|
|
398
|
-
column: C,
|
|
399
|
-
direction?: D,
|
|
400
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} ORDER BY ${C} ${D}`>
|
|
401
|
-
limit: <N extends number>(n: N) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} LIMIT ${N}`>
|
|
402
|
-
}
|
|
403
|
-
declare type DynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> = {
|
|
404
|
-
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
405
|
-
} & {
|
|
406
|
-
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
407
|
-
} & {
|
|
408
|
-
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
409
|
-
}
|
|
410
|
-
export type SelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> = BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
411
|
-
// Typed INSERT builder to expose a structured SQL literal in hovers
|
|
412
|
-
export type TypedInsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSql extends string = `INSERT INTO ${TTable}`> = Omit<InsertQueryBuilder<DB, TTable>, 'toSQL' | 'values' | 'returning'> & {
|
|
456
|
+
|
|
457
|
+
export type TypedInsertQueryBuilder<
|
|
458
|
+
DB extends DatabaseSchema<any>,
|
|
459
|
+
TTable extends keyof DB & string,
|
|
460
|
+
TSql extends string = `INSERT INTO ${TTable}`,
|
|
461
|
+
> = Omit<InsertQueryBuilder<DB, TTable>, 'toSQL' | 'values' | 'returning'> & {
|
|
413
462
|
toSQL: () => TSql
|
|
414
463
|
values: (
|
|
415
464
|
data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[],
|
|
@@ -424,4 +473,27 @@ export type TypedInsertQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
|
|
|
424
473
|
`${TSql} RETURNING ${string}`
|
|
425
474
|
>
|
|
426
475
|
}
|
|
427
|
-
|
|
476
|
+
|
|
477
|
+
interface InternalState {
|
|
478
|
+
sql: any
|
|
479
|
+
meta?: SchemaMeta
|
|
480
|
+
schema?: any
|
|
481
|
+
txDefaults?: TransactionOptions
|
|
482
|
+
}
|
|
483
|
+
declare function isRetriableTxError(err: any): boolean;
|
|
484
|
+
declare function matchesSqlState(err: any, states?: string[]): boolean;
|
|
485
|
+
declare function sleep(ms: number): Promise<void>;
|
|
486
|
+
declare function computeBackoffMs(attempt: number, cfg?: TxBackoff): number;
|
|
487
|
+
export declare function createQueryBuilder<DB extends DatabaseSchema<any>>(state?: Partial<InternalState>): QueryBuilder<DB>;
|
|
488
|
+
declare function applyCondition(expr: WhereExpression<any>): any;
|
|
489
|
+
declare function applyWhere(columns: Record<string, unknown>, q: any, expr?: WhereExpression<any>): void;
|
|
490
|
+
declare function computeSqlText(q: any): string;
|
|
491
|
+
declare function runWithHooks<T = any>(q: any, kind: 'select' | 'insert' | 'update' | 'delete' | 'raw', opts?: { signal?: AbortSignal, timeoutMs?: number }): Promise<T>;
|
|
492
|
+
declare function makeExecutableQuery(q: any, text?: string): void;
|
|
493
|
+
declare function makeSelect<TTable extends keyof DB & string>(table: TTable): TypedSelectQueryBuilder<DB, TTable, any, TTable, `SELECT * FROM $;
|
|
494
|
+
declare function makeSelect<TTable extends keyof DB & string>(table: TTable, columns: string[]): TypedSelectQueryBuilder<DB, TTable, any, TTable, `SELECT $;
|
|
495
|
+
declare function makeSelect<TTable extends keyof DB & string>(table: TTable, columns?: string[]): any;
|
|
496
|
+
declare function createSubQueryBuilder(newQ: any): void;
|
|
497
|
+
declare function applyWhereCondition(query: any, expr: any, op?: WhereOperator, value?: any, prefix?: 'WHERE' | 'AND' | 'OR'): void;
|
|
498
|
+
export declare function clearQueryCache(): void;
|
|
499
|
+
export declare function setQueryCacheMaxSize(size: number): void;
|
package/dist/config.d.ts
CHANGED
package/dist/db.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DatabaseConfig, SupportedDialect } from './types';
|
|
2
|
+
import { SQL } from 'bun';
|
|
3
|
+
|
|
4
|
+
declare function createConnectionString(dialect: SupportedDialect, dbConfig: DatabaseConfig): string;
|
|
5
|
+
export declare function getBunSql(): SQL;
|
|
6
|
+
export declare function getOrCreateBunSql(forceNew?: boolean): SQL;
|
|
7
|
+
export declare function withFreshConnection<T>(fn?: (sql): Promise<T>;
|
|
8
|
+
export declare const bunSql: (...args: any[]) => unknown;
|
|
9
|
+
|
|
10
|
+
export { SQL } from 'bun'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DialectDriver } from './postgres';
|
|
2
|
+
import type { SupportedDialect } from '../types';
|
|
3
|
+
import { MySQLDriver } from './mysql';
|
|
4
|
+
import { PostgresDriver } from './postgres';
|
|
5
|
+
import { SQLiteDriver } from './sqlite';
|
|
6
|
+
|
|
7
|
+
export type { DialectDriver } from './postgres'
|
|
8
|
+
export declare function getDialectDriver(dialect: SupportedDialect): DialectDriver;
|
|
9
|
+
|
|
10
|
+
export { MySQLDriver } from './mysql'
|
|
11
|
+
export { PostgresDriver } from './postgres'
|
|
12
|
+
export { SQLiteDriver } from './sqlite'
|