bun-query-builder 0.1.5 → 0.1.7
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 +9 -5
- package/dist/actions/cache.d.ts +2 -14
- package/dist/actions/console.d.ts +0 -6
- package/dist/actions/data.d.ts +3 -13
- package/dist/actions/db-info.d.ts +4 -9
- package/dist/actions/db-optimize.d.ts +4 -5
- package/dist/actions/db-wipe.d.ts +4 -5
- package/dist/actions/file.d.ts +2 -1
- package/dist/actions/index.d.ts +25 -25
- package/dist/actions/inspect.d.ts +3 -9
- package/dist/actions/introspect.d.ts +2 -1
- package/dist/actions/make-model.d.ts +3 -5
- package/dist/actions/migrate-generate.d.ts +4 -5
- package/dist/actions/migrate-rollback.d.ts +4 -11
- package/dist/actions/migrate-status.d.ts +5 -9
- package/dist/actions/migrate.d.ts +13 -21
- package/dist/actions/model-show.d.ts +3 -5
- package/dist/actions/query-explain-all.d.ts +3 -5
- package/dist/actions/relation-diagram.d.ts +5 -5
- package/dist/actions/seed.d.ts +7 -17
- package/dist/actions/sql.d.ts +2 -1
- package/dist/actions/unsafe.d.ts +2 -1
- package/dist/actions/validate.d.ts +4 -9
- package/dist/actions/wait-ready.d.ts +2 -1
- package/dist/client.d.ts +199 -189
- package/dist/config.d.ts +2 -1
- package/dist/db.d.ts +8 -9
- package/dist/drivers/index.d.ts +8 -6
- package/dist/drivers/mysql.d.ts +169 -19
- package/dist/drivers/postgres.d.ts +155 -19
- package/dist/drivers/sqlite.d.ts +157 -19
- package/dist/factory.d.ts +3 -6
- package/dist/index.d.ts +11 -11
- package/dist/index.js +3502 -299
- package/dist/loader.d.ts +3 -2
- package/dist/meta.d.ts +3 -2
- package/dist/migrations.d.ts +42 -47
- package/dist/schema.d.ts +30 -177
- package/dist/seeder.d.ts +12 -17
- package/dist/types.d.ts +42 -143
- package/package.json +5 -4
package/dist/client.d.ts
CHANGED
|
@@ -1,33 +1,141 @@
|
|
|
1
|
-
import { config } from './config';
|
|
2
1
|
import type { DatabaseSchema } from './schema';
|
|
3
2
|
import type { SchemaMeta } from './meta';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
export
|
|
27
|
-
export declare interface WhereRaw {
|
|
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 {
|
|
28
26
|
raw: any
|
|
29
27
|
}
|
|
30
|
-
|
|
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
|
+
> {
|
|
31
139
|
distinct: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
32
140
|
distinctOn: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
33
141
|
selectRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
@@ -125,29 +233,7 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
125
233
|
withRecursive: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
126
234
|
value: <K extends keyof TSelected & string>(column: K) => Promise<SelectedRow<DB, TTable, TSelected>[K]>
|
|
127
235
|
pluck: {
|
|
128
|
-
/**
|
|
129
|
-
* # `pluck(column)`
|
|
130
|
-
*
|
|
131
|
-
* Returns an array of values for a single column.
|
|
132
|
-
*
|
|
133
|
-
* @example
|
|
134
|
-
* ```ts
|
|
135
|
-
* const names = await db.selectFrom('users').pluck('name')
|
|
136
|
-
* const ids = await db.selectFrom('users').orderBy('id').pluck('id')
|
|
137
|
-
* ```
|
|
138
|
-
*/
|
|
139
236
|
<K extends keyof TSelected & string>(column: K): Promise<SelectedRow<DB, TTable, TSelected>[K][]>
|
|
140
|
-
/**
|
|
141
|
-
* # `pluck(column, key)`
|
|
142
|
-
*
|
|
143
|
-
* Returns an object keyed by the given key column.
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* ```ts
|
|
147
|
-
* const byId = await db.selectFrom('users').pluck('email', 'id')
|
|
148
|
-
* const map = await db.selectFrom('users').pluck('name', 'email')
|
|
149
|
-
* ```
|
|
150
|
-
*/
|
|
151
237
|
<K extends keyof TSelected & string, K2 extends keyof TSelected & string>(column: K, key: K2): Promise<Record<string, SelectedRow<DB, TTable, TSelected>[K]>>
|
|
152
238
|
}
|
|
153
239
|
exists: () => Promise<boolean>
|
|
@@ -182,8 +268,8 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
182
268
|
sum: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
|
|
183
269
|
max: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
184
270
|
min: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
185
|
-
rows: TSelected[]
|
|
186
|
-
row: TSelected
|
|
271
|
+
readonly rows: TSelected[]
|
|
272
|
+
readonly row: TSelected
|
|
187
273
|
values: () => Promise<any[][]>
|
|
188
274
|
toParams?: () => any[]
|
|
189
275
|
raw: () => Promise<any[][]>
|
|
@@ -197,13 +283,22 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
|
|
|
197
283
|
denseRank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
198
284
|
rank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
199
285
|
}
|
|
200
|
-
|
|
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> {
|
|
201
295
|
values: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
|
|
202
296
|
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
203
297
|
toSQL: () => string
|
|
204
298
|
execute: () => Promise<number | DB[TTable]['columns'] | DB[TTable]['columns'][]>
|
|
205
299
|
}
|
|
206
|
-
|
|
300
|
+
|
|
301
|
+
export interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
207
302
|
set: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
208
303
|
where: (expr: WhereExpression<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
209
304
|
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
@@ -211,20 +306,23 @@ export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTab
|
|
|
211
306
|
execute: () => Promise<number>
|
|
212
307
|
executeTakeFirst?: () => Promise<{ numUpdatedRows?: number }>
|
|
213
308
|
}
|
|
214
|
-
|
|
309
|
+
|
|
310
|
+
export interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
215
311
|
where: (expr: WhereExpression<DB[TTable]['columns']>) => DeleteQueryBuilder<DB, TTable>
|
|
216
312
|
returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
|
|
217
313
|
toSQL: () => string
|
|
218
314
|
execute: () => Promise<number>
|
|
219
315
|
executeTakeFirst?: () => Promise<{ numDeletedRows?: number }>
|
|
220
316
|
}
|
|
221
|
-
|
|
317
|
+
|
|
318
|
+
export interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
|
|
222
319
|
insert: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
|
|
223
320
|
update: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
|
|
224
321
|
delete: () => DeleteQueryBuilder<DB, TTable>
|
|
225
322
|
select: (...columns: (keyof DB[TTable]['columns'] & string)[]) => SelectQueryBuilder<DB, TTable, any>
|
|
226
323
|
}
|
|
227
|
-
|
|
324
|
+
|
|
325
|
+
export interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
228
326
|
select: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(
|
|
229
327
|
table: TTable,
|
|
230
328
|
...columns: (K | `${string} as ${string}`)[]
|
|
@@ -266,69 +364,85 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
|
266
364
|
insertGetId: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?: keyof DB[TTable]['columns'] & string) => Promise<any>
|
|
267
365
|
updateOrInsert: <TTable extends keyof DB & string>(table: TTable, match: Partial<DB[TTable]['columns']>, values: Partial<DB[TTable]['columns']>) => Promise<boolean>
|
|
268
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
|
+
|
|
269
368
|
create: <TTable extends keyof DB & string>(
|
|
270
369
|
table: TTable,
|
|
271
370
|
values: Partial<DB[TTable]['columns']>,
|
|
272
371
|
) => Promise<DB[TTable]['columns']>
|
|
372
|
+
|
|
273
373
|
createMany: <TTable extends keyof DB & string>(
|
|
274
374
|
table: TTable,
|
|
275
375
|
rows: Partial<DB[TTable]['columns']>[],
|
|
276
376
|
) => Promise<void>
|
|
377
|
+
|
|
277
378
|
insertMany: <TTable extends keyof DB & string>(
|
|
278
379
|
table: TTable,
|
|
279
380
|
rows: Partial<DB[TTable]['columns']>[],
|
|
280
381
|
) => Promise<void>
|
|
382
|
+
|
|
281
383
|
updateMany: <TTable extends keyof DB & string>(
|
|
282
384
|
table: TTable,
|
|
283
385
|
conditions: WhereExpression<DB[TTable]['columns']>,
|
|
284
386
|
data: Partial<DB[TTable]['columns']>,
|
|
285
387
|
) => Promise<number>
|
|
388
|
+
|
|
286
389
|
deleteMany: <TTable extends keyof DB & string>(
|
|
287
390
|
table: TTable,
|
|
288
391
|
ids: any[],
|
|
289
392
|
) => Promise<number>
|
|
393
|
+
|
|
290
394
|
firstOrCreate: <TTable extends keyof DB & string>(
|
|
291
395
|
table: TTable,
|
|
292
396
|
match: Partial<DB[TTable]['columns']>,
|
|
293
397
|
defaults?: Partial<DB[TTable]['columns']>,
|
|
294
398
|
) => Promise<DB[TTable]['columns']>
|
|
399
|
+
|
|
295
400
|
updateOrCreate: <TTable extends keyof DB & string>(
|
|
296
401
|
table: TTable,
|
|
297
402
|
match: Partial<DB[TTable]['columns']>,
|
|
298
403
|
values: Partial<DB[TTable]['columns']>,
|
|
299
404
|
) => Promise<DB[TTable]['columns']>
|
|
405
|
+
|
|
300
406
|
save: <TTable extends keyof DB & string>(
|
|
301
407
|
table: TTable,
|
|
302
408
|
values: Partial<DB[TTable]['columns']>,
|
|
303
409
|
) => Promise<DB[TTable]['columns']>
|
|
410
|
+
|
|
304
411
|
remove: <TTable extends keyof DB & string>(
|
|
305
412
|
table: TTable,
|
|
306
413
|
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
307
414
|
) => Promise<any>
|
|
415
|
+
|
|
308
416
|
find: <TTable extends keyof DB & string>(
|
|
309
417
|
table: TTable,
|
|
310
418
|
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
311
419
|
) => Promise<DB[TTable]['columns'] | undefined>
|
|
420
|
+
|
|
312
421
|
findOrFail: <TTable extends keyof DB & string>(
|
|
313
422
|
table: TTable,
|
|
314
423
|
id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
|
|
315
424
|
) => Promise<DB[TTable]['columns']>
|
|
425
|
+
|
|
316
426
|
findMany: <TTable extends keyof DB & string>(
|
|
317
427
|
table: TTable,
|
|
318
428
|
ids: any[],
|
|
319
429
|
) => Promise<DB[TTable]['columns'][]>
|
|
430
|
+
|
|
320
431
|
latest: <TTable extends keyof DB & string>(
|
|
321
432
|
table: TTable,
|
|
322
433
|
column?: keyof DB[TTable]['columns'] & string,
|
|
323
434
|
) => Promise<DB[TTable]['columns'] | undefined>
|
|
435
|
+
|
|
324
436
|
oldest: <TTable extends keyof DB & string>(
|
|
325
437
|
table: TTable,
|
|
326
438
|
column?: keyof DB[TTable]['columns'] & string,
|
|
327
439
|
) => Promise<DB[TTable]['columns'] | undefined>
|
|
440
|
+
|
|
328
441
|
skip: <TTable extends keyof DB & string>(
|
|
329
442
|
table: TTable,
|
|
330
443
|
count: number,
|
|
331
444
|
) => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable>
|
|
445
|
+
|
|
332
446
|
rawQuery: (query: string) => Promise<any>
|
|
333
447
|
id?: (name: string) => any
|
|
334
448
|
ids?: (...names: string[]) => any
|
|
@@ -339,131 +453,12 @@ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
|
|
|
339
453
|
getRelationshipType?: (table: string, relationName: string) => string | null
|
|
340
454
|
getRelationshipTarget?: (table: string, relationName: string) => string | null
|
|
341
455
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
export declare interface TransactionOptions {
|
|
349
|
-
retries?: number
|
|
350
|
-
isolation?: TransactionIsolation
|
|
351
|
-
onRetry?: (attempt: number, error: any) => void
|
|
352
|
-
afterCommit?: () => void
|
|
353
|
-
sqlStates?: string[]
|
|
354
|
-
backoff?: TxBackoff
|
|
355
|
-
logger?: (event: TxLoggerEvent) => void
|
|
356
|
-
readOnly?: boolean
|
|
357
|
-
onRollback?: (error: any) => void
|
|
358
|
-
afterRollback?: () => void
|
|
359
|
-
}
|
|
360
|
-
declare interface TxBackoff {
|
|
361
|
-
baseMs?: number
|
|
362
|
-
maxMs?: number
|
|
363
|
-
factor?: number
|
|
364
|
-
jitter?: boolean
|
|
365
|
-
}
|
|
366
|
-
declare interface TxLoggerEvent {
|
|
367
|
-
type: 'start' | 'retry' | 'commit' | 'rollback' | 'error'
|
|
368
|
-
attempt: number
|
|
369
|
-
error?: any
|
|
370
|
-
durationMs?: number
|
|
371
|
-
}
|
|
372
|
-
// Where condition helpers
|
|
373
|
-
declare type Primitive = string | number | boolean | bigint | Date | null | undefined
|
|
374
|
-
declare type ValueOrRef = Primitive
|
|
375
|
-
export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not'
|
|
376
|
-
export type WhereExpression<TableColumns> = | Partial<{ [K in keyof TableColumns & string]: ValueOrRef | ValueOrRef[] }>
|
|
377
|
-
| [key: keyof TableColumns & string, op: WhereOperator, value: ValueOrRef | ValueOrRef[]]
|
|
378
|
-
| WhereRaw
|
|
379
|
-
export type QueryResult = any
|
|
380
|
-
/**
|
|
381
|
-
* # `SortDirection`
|
|
382
|
-
*
|
|
383
|
-
* The direction used when ordering query results.
|
|
384
|
-
*/
|
|
385
|
-
export type SortDirection = 'asc' | 'desc'
|
|
386
|
-
/**
|
|
387
|
-
* # `ColumnName<DB, TTable>`
|
|
388
|
-
*
|
|
389
|
-
* Helper type extracting a string union of column names for a given table.
|
|
390
|
-
*/
|
|
391
|
-
export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
|
|
392
|
-
// Named row alias to improve IDE hover readability
|
|
393
|
-
export type SelectedRow<DB extends DatabaseSchema<any>, _TTable extends keyof DB & string, TSelected> = Readonly<TSelected>
|
|
394
|
-
declare type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
|
|
395
|
-
? `${TTables}.${keyof DB[TTables]['columns'] & string}`
|
|
396
|
-
: never
|
|
397
|
-
// Convert snake_case to PascalCase at the type level (e.g. created_at -> CreatedAt)
|
|
398
|
-
declare type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
|
|
399
|
-
? `${Capitalize<H>}${SnakeToPascal<T>}`
|
|
400
|
-
: Capitalize<S>
|
|
401
|
-
// Typed SQL builder (type-level only). We piggy-back on the runtime builder but
|
|
402
|
-
// thread a phantom TSql string through method signatures so hovers can show the
|
|
403
|
-
// composed SQL at compile-time for common operations.
|
|
404
|
-
declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string, TSql extends string> = {
|
|
405
|
-
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (
|
|
406
|
-
value: DB[TTable]['columns'][K],
|
|
407
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>
|
|
408
|
-
} & {
|
|
409
|
-
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (
|
|
410
|
-
value: DB[TTable]['columns'][K],
|
|
411
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>
|
|
412
|
-
} & {
|
|
413
|
-
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (
|
|
414
|
-
value: DB[TTable]['columns'][K],
|
|
415
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>
|
|
416
|
-
}
|
|
417
|
-
export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable, TSql extends string = `SELECT * FROM ${TTable}`> = Omit<
|
|
418
|
-
BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined>,
|
|
419
|
-
'toSQL' | 'where' | 'andWhere' | 'orWhere' | 'orderBy' | 'limit'
|
|
420
|
-
> & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
|
|
421
|
-
& _TypedDynamicWhereMethods<DB, TTable, TSelected, TJoined, TSql>
|
|
422
|
-
& {
|
|
423
|
-
toSQL: () => TSql
|
|
424
|
-
where: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
425
|
-
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
426
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
427
|
-
expr: [K, OP, any],
|
|
428
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
429
|
-
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
430
|
-
op?: WhereOperator,
|
|
431
|
-
value?: any,
|
|
432
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${string}`>)
|
|
433
|
-
andWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
434
|
-
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
435
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
436
|
-
expr: [K, OP, any],
|
|
437
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
438
|
-
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
439
|
-
op?: WhereOperator,
|
|
440
|
-
value?: any,
|
|
441
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${string}`>)
|
|
442
|
-
orWhere: (<K extends keyof DB[TTable]['columns'] & string>(
|
|
443
|
-
expr: Record<K, DB[TTable]['columns'][K]>,
|
|
444
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} = ?`>) & (<K extends keyof DB[TTable]['columns'] & string, OP extends WhereOperator>(
|
|
445
|
-
expr: [K, OP, any],
|
|
446
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${K} ${Uppercase<OP>} ${OP extends 'in' | 'not in' ? '(?)' : '?'}`>) & ((
|
|
447
|
-
expr: WhereExpression<DB[TTable]['columns']> | string,
|
|
448
|
-
op?: WhereOperator,
|
|
449
|
-
value?: any,
|
|
450
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} OR ${string}`>)
|
|
451
|
-
orderBy: <C extends keyof DB[TTable]['columns'] & string, D extends 'asc' | 'desc' = 'asc'>(
|
|
452
|
-
column: C,
|
|
453
|
-
direction?: D,
|
|
454
|
-
) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} ORDER BY ${C} ${D}`>
|
|
455
|
-
limit: <N extends number>(n: N) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} LIMIT ${N}`>
|
|
456
|
-
}
|
|
457
|
-
declare type DynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> = {
|
|
458
|
-
[K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
459
|
-
} & {
|
|
460
|
-
[K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
461
|
-
} & {
|
|
462
|
-
[K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
|
|
463
|
-
}
|
|
464
|
-
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>
|
|
465
|
-
// Typed INSERT builder to expose a structured SQL literal in hovers
|
|
466
|
-
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'> & {
|
|
467
462
|
toSQL: () => TSql
|
|
468
463
|
values: (
|
|
469
464
|
data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[],
|
|
@@ -478,12 +473,27 @@ export type TypedInsertQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
|
|
|
478
473
|
`${TSql} RETURNING ${string}`
|
|
479
474
|
>
|
|
480
475
|
}
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
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
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
import type { DatabaseConfig, SupportedDialect } from './types';
|
|
1
2
|
import { SQL } from 'bun';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Handles connection errors gracefully by falling back to in-memory SQLite.
|
|
5
|
-
*/
|
|
3
|
+
|
|
4
|
+
declare function createConnectionString(dialect: SupportedDialect, dbConfig: DatabaseConfig): string;
|
|
6
5
|
export declare function getBunSql(): SQL;
|
|
7
|
-
export declare function getOrCreateBunSql(forceNew?:
|
|
8
|
-
|
|
9
|
-
export declare
|
|
10
|
-
|
|
11
|
-
export { SQL } from 'bun'
|
|
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'
|
package/dist/drivers/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import type { DialectDriver } from './postgres';
|
|
2
|
+
import type { SupportedDialect } from '../types';
|
|
1
3
|
import { MySQLDriver } from './mysql';
|
|
2
4
|
import { PostgresDriver } from './postgres';
|
|
3
5
|
import { SQLiteDriver } from './sqlite';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export type { DialectDriver } from './postgres';
|
|
6
|
+
|
|
7
|
+
export type { DialectDriver } from './postgres'
|
|
7
8
|
export declare function getDialectDriver(dialect: SupportedDialect): DialectDriver;
|
|
8
|
-
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
9
|
+
|
|
10
|
+
export { MySQLDriver } from './mysql'
|
|
11
|
+
export { PostgresDriver } from './postgres'
|
|
12
|
+
export { SQLiteDriver } from './sqlite'
|