bun-query-builder 0.1.8 → 0.1.9

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 (41) hide show
  1. package/dist/actions/benchmark.d.ts +5 -9
  2. package/dist/actions/cache.d.ts +14 -2
  3. package/dist/actions/console.d.ts +6 -0
  4. package/dist/actions/data.d.ts +13 -3
  5. package/dist/actions/db-info.d.ts +9 -4
  6. package/dist/actions/db-optimize.d.ts +5 -4
  7. package/dist/actions/db-wipe.d.ts +5 -4
  8. package/dist/actions/file.d.ts +1 -2
  9. package/dist/actions/index.d.ts +25 -25
  10. package/dist/actions/inspect.d.ts +9 -3
  11. package/dist/actions/introspect.d.ts +1 -2
  12. package/dist/actions/make-model.d.ts +5 -3
  13. package/dist/actions/migrate-generate.d.ts +5 -4
  14. package/dist/actions/migrate-rollback.d.ts +11 -4
  15. package/dist/actions/migrate-status.d.ts +9 -5
  16. package/dist/actions/migrate.d.ts +20 -12
  17. package/dist/actions/model-show.d.ts +5 -3
  18. package/dist/actions/query-explain-all.d.ts +5 -3
  19. package/dist/actions/relation-diagram.d.ts +5 -5
  20. package/dist/actions/seed.d.ts +17 -7
  21. package/dist/actions/sql.d.ts +1 -2
  22. package/dist/actions/unsafe.d.ts +1 -2
  23. package/dist/actions/validate.d.ts +9 -4
  24. package/dist/actions/wait-ready.d.ts +1 -2
  25. package/dist/client.d.ts +189 -199
  26. package/dist/config.d.ts +1 -2
  27. package/dist/db.d.ts +9 -8
  28. package/dist/drivers/index.d.ts +6 -8
  29. package/dist/drivers/mysql.d.ts +19 -169
  30. package/dist/drivers/postgres.d.ts +19 -155
  31. package/dist/drivers/sqlite.d.ts +19 -157
  32. package/dist/factory.d.ts +6 -3
  33. package/dist/index.d.ts +11 -11
  34. package/dist/index.js +1 -1
  35. package/dist/loader.d.ts +2 -3
  36. package/dist/meta.d.ts +2 -3
  37. package/dist/migrations.d.ts +47 -42
  38. package/dist/schema.d.ts +177 -30
  39. package/dist/seeder.d.ts +17 -12
  40. package/dist/types.d.ts +143 -42
  41. package/package.json +1 -1
package/dist/client.d.ts CHANGED
@@ -1,141 +1,33 @@
1
+ import { config } from './config';
1
2
  import type { DatabaseSchema } from './schema';
2
3
  import type { SchemaMeta } from './meta';
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 {
4
+ export declare function createQueryBuilder<DB extends DatabaseSchema<any>>(state?: Partial<InternalState>): QueryBuilder<DB>;
5
+ /**
6
+ * # `clearQueryCache()`
7
+ *
8
+ * Clears all cached query results.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * clearQueryCache()
13
+ * ```
14
+ */
15
+ export declare function clearQueryCache(): void;
16
+ /**
17
+ * # `setQueryCacheMaxSize(size)`
18
+ *
19
+ * Sets the maximum number of cached queries (default 100).
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * setQueryCacheMaxSize(500)
24
+ * ```
25
+ */
26
+ export declare function setQueryCacheMaxSize(size: number): void;
27
+ export declare interface WhereRaw {
26
28
  raw: any
27
29
  }
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
- > {
30
+ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> {
139
31
  distinct: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
140
32
  distinctOn: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
141
33
  selectRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
@@ -233,7 +125,29 @@ export interface BaseSelectQueryBuilder<
233
125
  withRecursive: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
234
126
  value: <K extends keyof TSelected & string>(column: K) => Promise<SelectedRow<DB, TTable, TSelected>[K]>
235
127
  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
+ */
236
139
  <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
+ */
237
151
  <K extends keyof TSelected & string, K2 extends keyof TSelected & string>(column: K, key: K2): Promise<Record<string, SelectedRow<DB, TTable, TSelected>[K]>>
238
152
  }
239
153
  exists: () => Promise<boolean>
@@ -268,8 +182,8 @@ export interface BaseSelectQueryBuilder<
268
182
  sum: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
269
183
  max: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
270
184
  min: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
271
- readonly rows: TSelected[]
272
- readonly row: TSelected
185
+ rows: TSelected[]
186
+ row: TSelected
273
187
  values: () => Promise<any[][]>
274
188
  toParams?: () => any[]
275
189
  raw: () => Promise<any[][]>
@@ -283,22 +197,13 @@ export interface BaseSelectQueryBuilder<
283
197
  denseRank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
284
198
  rank?: (alias?: string, partitionBy?: string | string[], orderBy?: [string, 'asc' | 'desc'][]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
285
199
  }
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> {
200
+ export declare interface InsertQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
295
201
  values: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
296
202
  returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
297
203
  toSQL: () => string
298
204
  execute: () => Promise<number | DB[TTable]['columns'] | DB[TTable]['columns'][]>
299
205
  }
300
-
301
- export interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
206
+ export declare interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
302
207
  set: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
303
208
  where: (expr: WhereExpression<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
304
209
  returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
@@ -306,23 +211,20 @@ export interface UpdateQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
306
211
  execute: () => Promise<number>
307
212
  executeTakeFirst?: () => Promise<{ numUpdatedRows?: number }>
308
213
  }
309
-
310
- export interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
214
+ export declare interface DeleteQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
311
215
  where: (expr: WhereExpression<DB[TTable]['columns']>) => DeleteQueryBuilder<DB, TTable>
312
216
  returning: <K extends keyof DB[TTable]['columns'] & string>(...cols: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
313
217
  toSQL: () => string
314
218
  execute: () => Promise<number>
315
219
  executeTakeFirst?: () => Promise<{ numDeletedRows?: number }>
316
220
  }
317
-
318
- export interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
221
+ export declare interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
319
222
  insert: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
320
223
  update: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
321
224
  delete: () => DeleteQueryBuilder<DB, TTable>
322
225
  select: (...columns: (keyof DB[TTable]['columns'] & string)[]) => SelectQueryBuilder<DB, TTable, any>
323
226
  }
324
-
325
- export interface QueryBuilder<DB extends DatabaseSchema<any>> {
227
+ export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
326
228
  select: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(
327
229
  table: TTable,
328
230
  ...columns: (K | `${string} as ${string}`)[]
@@ -364,85 +266,69 @@ export interface QueryBuilder<DB extends DatabaseSchema<any>> {
364
266
  insertGetId: <TTable extends keyof DB & string>(table: TTable, values: Partial<DB[TTable]['columns']>, idColumn?: keyof DB[TTable]['columns'] & string) => Promise<any>
365
267
  updateOrInsert: <TTable extends keyof DB & string>(table: TTable, match: Partial<DB[TTable]['columns']>, values: Partial<DB[TTable]['columns']>) => Promise<boolean>
366
268
  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
-
368
269
  create: <TTable extends keyof DB & string>(
369
270
  table: TTable,
370
271
  values: Partial<DB[TTable]['columns']>,
371
272
  ) => Promise<DB[TTable]['columns']>
372
-
373
273
  createMany: <TTable extends keyof DB & string>(
374
274
  table: TTable,
375
275
  rows: Partial<DB[TTable]['columns']>[],
376
276
  ) => Promise<void>
377
-
378
277
  insertMany: <TTable extends keyof DB & string>(
379
278
  table: TTable,
380
279
  rows: Partial<DB[TTable]['columns']>[],
381
280
  ) => Promise<void>
382
-
383
281
  updateMany: <TTable extends keyof DB & string>(
384
282
  table: TTable,
385
283
  conditions: WhereExpression<DB[TTable]['columns']>,
386
284
  data: Partial<DB[TTable]['columns']>,
387
285
  ) => Promise<number>
388
-
389
286
  deleteMany: <TTable extends keyof DB & string>(
390
287
  table: TTable,
391
288
  ids: any[],
392
289
  ) => Promise<number>
393
-
394
290
  firstOrCreate: <TTable extends keyof DB & string>(
395
291
  table: TTable,
396
292
  match: Partial<DB[TTable]['columns']>,
397
293
  defaults?: Partial<DB[TTable]['columns']>,
398
294
  ) => Promise<DB[TTable]['columns']>
399
-
400
295
  updateOrCreate: <TTable extends keyof DB & string>(
401
296
  table: TTable,
402
297
  match: Partial<DB[TTable]['columns']>,
403
298
  values: Partial<DB[TTable]['columns']>,
404
299
  ) => Promise<DB[TTable]['columns']>
405
-
406
300
  save: <TTable extends keyof DB & string>(
407
301
  table: TTable,
408
302
  values: Partial<DB[TTable]['columns']>,
409
303
  ) => Promise<DB[TTable]['columns']>
410
-
411
304
  remove: <TTable extends keyof DB & string>(
412
305
  table: TTable,
413
306
  id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
414
307
  ) => Promise<any>
415
-
416
308
  find: <TTable extends keyof DB & string>(
417
309
  table: TTable,
418
310
  id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
419
311
  ) => Promise<DB[TTable]['columns'] | undefined>
420
-
421
312
  findOrFail: <TTable extends keyof DB & string>(
422
313
  table: TTable,
423
314
  id: DB[TTable]['columns'][DB[TTable]['primaryKey'] & keyof DB[TTable]['columns']] | any,
424
315
  ) => Promise<DB[TTable]['columns']>
425
-
426
316
  findMany: <TTable extends keyof DB & string>(
427
317
  table: TTable,
428
318
  ids: any[],
429
319
  ) => Promise<DB[TTable]['columns'][]>
430
-
431
320
  latest: <TTable extends keyof DB & string>(
432
321
  table: TTable,
433
322
  column?: keyof DB[TTable]['columns'] & string,
434
323
  ) => Promise<DB[TTable]['columns'] | undefined>
435
-
436
324
  oldest: <TTable extends keyof DB & string>(
437
325
  table: TTable,
438
326
  column?: keyof DB[TTable]['columns'] & string,
439
327
  ) => Promise<DB[TTable]['columns'] | undefined>
440
-
441
328
  skip: <TTable extends keyof DB & string>(
442
329
  table: TTable,
443
330
  count: number,
444
331
  ) => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable>
445
-
446
332
  rawQuery: (query: string) => Promise<any>
447
333
  id?: (name: string) => any
448
334
  ids?: (...names: string[]) => any
@@ -453,12 +339,131 @@ export interface QueryBuilder<DB extends DatabaseSchema<any>> {
453
339
  getRelationshipType?: (table: string, relationName: string) => string | null
454
340
  getRelationshipTarget?: (table: string, relationName: string) => string | null
455
341
  }
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'> & {
342
+ declare interface InternalState {
343
+ sql: any
344
+ meta?: SchemaMeta
345
+ schema?: any
346
+ txDefaults?: TransactionOptions
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'> & {
462
467
  toSQL: () => TSql
463
468
  values: (
464
469
  data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[],
@@ -473,27 +478,12 @@ export type TypedInsertQueryBuilder<
473
478
  `${TSql} RETURNING ${string}`
474
479
  >
475
480
  }
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;
481
+ declare type TransactionIsolation = 'read committed' | 'repeatable read' | 'serializable'
482
+ declare class QueryCache {
483
+ private cache: any;
484
+ private maxSize: any;
485
+ get(key: string): any | null;
486
+ set(key: string, data: any, ttlMs: number): void;
487
+ clear(): void;
488
+ setMaxSize(size: number): void;
489
+ }
package/dist/config.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import type { QueryBuilderConfig } from './types';
2
-
3
1
  export declare const defaultConfig: QueryBuilderConfig;
2
+ // eslint-disable-next-line antfu/no-top-level-await
4
3
  export declare const config: QueryBuilderConfig;
package/dist/db.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import type { DatabaseConfig, SupportedDialect } from './types';
2
1
  import { SQL } from 'bun';
3
-
4
- declare function createConnectionString(dialect: SupportedDialect, dbConfig: DatabaseConfig): string;
2
+ /**
3
+ * Returns a Bun SQL instance configured for the current dialect and database settings.
4
+ * Handles connection errors gracefully by falling back to in-memory SQLite.
5
+ */
5
6
  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'
7
+ export declare function getOrCreateBunSql(forceNew?: any): SQL;
8
+ // Wrapper that catches "Connection closed" errors and retries with a fresh connection
9
+ export declare function withFreshConnection<T>(fn: (sql: SQL) => Promise<T>): Promise<T>;
10
+ export declare const bunSql: unknown;
11
+ export { SQL } from 'bun';
@@ -1,12 +1,10 @@
1
- import type { DialectDriver } from './postgres';
2
- import type { SupportedDialect } from '../types';
3
1
  import { MySQLDriver } from './mysql';
4
2
  import { PostgresDriver } from './postgres';
5
3
  import { SQLiteDriver } from './sqlite';
6
-
7
- export type { DialectDriver } from './postgres'
4
+ import type { DialectDriver } from './postgres';
5
+ import type { SupportedDialect } from '../types';
6
+ export type { DialectDriver } from './postgres';
8
7
  export declare function getDialectDriver(dialect: SupportedDialect): DialectDriver;
9
-
10
- export { MySQLDriver } from './mysql'
11
- export { PostgresDriver } from './postgres'
12
- export { SQLiteDriver } from './sqlite'
8
+ export { MySQLDriver } from './mysql';
9
+ export { PostgresDriver } from './postgres';
10
+ export { SQLiteDriver } from './sqlite';