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.
Files changed (43) hide show
  1. package/dist/actions/benchmark.d.ts +12 -0
  2. package/dist/actions/cache.d.ts +6 -0
  3. package/dist/actions/console.d.ts +2 -0
  4. package/dist/actions/data.d.ts +15 -0
  5. package/dist/actions/db-info.d.ts +17 -0
  6. package/dist/actions/db-optimize.d.ts +11 -0
  7. package/dist/actions/db-wipe.d.ts +10 -0
  8. package/dist/actions/file.d.ts +2 -1
  9. package/dist/actions/index.d.ts +25 -8
  10. package/dist/actions/inspect.d.ts +24 -0
  11. package/dist/actions/introspect.d.ts +2 -1
  12. package/dist/actions/make-model.d.ts +7 -0
  13. package/dist/actions/migrate-generate.d.ts +5 -0
  14. package/dist/actions/migrate-rollback.d.ts +6 -0
  15. package/dist/actions/migrate-status.d.ts +9 -0
  16. package/dist/actions/migrate.d.ts +13 -3
  17. package/dist/actions/model-show.d.ts +20 -0
  18. package/dist/actions/query-explain-all.d.ts +14 -0
  19. package/dist/actions/relation-diagram.d.ts +11 -0
  20. package/dist/actions/seed.d.ts +8 -0
  21. package/dist/actions/sql.d.ts +2 -1
  22. package/dist/actions/unsafe.d.ts +2 -1
  23. package/dist/actions/validate.d.ts +16 -0
  24. package/dist/actions/wait-ready.d.ts +2 -1
  25. package/dist/client.d.ts +230 -158
  26. package/dist/config.d.ts +2 -1
  27. package/dist/db.d.ts +10 -0
  28. package/dist/drivers/index.d.ts +12 -0
  29. package/dist/drivers/mysql.d.ts +187 -0
  30. package/dist/drivers/postgres.d.ts +173 -0
  31. package/dist/drivers/sqlite.d.ts +175 -0
  32. package/dist/factory.d.ts +3 -6
  33. package/dist/index.d.ts +11 -9
  34. package/dist/index.js +5444 -869
  35. package/dist/loader.d.ts +3 -2
  36. package/dist/meta.d.ts +10 -2
  37. package/dist/migrations.d.ts +43 -43
  38. package/dist/schema.d.ts +36 -177
  39. package/dist/seeder.d.ts +21 -0
  40. package/dist/types.d.ts +60 -143
  41. package/package.json +18 -27
  42. package/LICENSE.md +0 -21
  43. 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
- export declare function createQueryBuilder<DB extends DatabaseSchema<any>>(state?: Partial<InternalState>): QueryBuilder<DB>;
5
- 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 {
6
26
  raw: any
7
27
  }
8
- export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> {
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
- rows: TSelected[]
157
- row: TSelected
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
- export declare interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
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
- export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
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
- export declare interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
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
- export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
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
- declare interface InternalState {
289
- sql: any
290
- meta?: SchemaMeta
291
- schema?: any
292
- txDefaults?: TransactionOptions
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
- declare type TransactionIsolation = 'read committed' | 'repeatable read' | 'serializable'
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
@@ -1,3 +1,4 @@
1
+ import type { QueryBuilderConfig } from './types';
2
+
1
3
  export declare const defaultConfig: QueryBuilderConfig;
2
- // eslint-disable-next-line antfu/no-top-level-await
3
4
  export declare const config: QueryBuilderConfig;
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'