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.
Files changed (41) hide show
  1. package/dist/actions/benchmark.d.ts +9 -5
  2. package/dist/actions/cache.d.ts +2 -14
  3. package/dist/actions/console.d.ts +0 -6
  4. package/dist/actions/data.d.ts +3 -13
  5. package/dist/actions/db-info.d.ts +4 -9
  6. package/dist/actions/db-optimize.d.ts +4 -5
  7. package/dist/actions/db-wipe.d.ts +4 -5
  8. package/dist/actions/file.d.ts +2 -1
  9. package/dist/actions/index.d.ts +25 -25
  10. package/dist/actions/inspect.d.ts +3 -9
  11. package/dist/actions/introspect.d.ts +2 -1
  12. package/dist/actions/make-model.d.ts +3 -5
  13. package/dist/actions/migrate-generate.d.ts +4 -5
  14. package/dist/actions/migrate-rollback.d.ts +4 -11
  15. package/dist/actions/migrate-status.d.ts +5 -9
  16. package/dist/actions/migrate.d.ts +13 -21
  17. package/dist/actions/model-show.d.ts +3 -5
  18. package/dist/actions/query-explain-all.d.ts +3 -5
  19. package/dist/actions/relation-diagram.d.ts +5 -5
  20. package/dist/actions/seed.d.ts +7 -17
  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 +4 -9
  24. package/dist/actions/wait-ready.d.ts +2 -1
  25. package/dist/client.d.ts +199 -189
  26. package/dist/config.d.ts +2 -1
  27. package/dist/db.d.ts +8 -9
  28. package/dist/drivers/index.d.ts +8 -6
  29. package/dist/drivers/mysql.d.ts +169 -19
  30. package/dist/drivers/postgres.d.ts +155 -19
  31. package/dist/drivers/sqlite.d.ts +157 -19
  32. package/dist/factory.d.ts +3 -6
  33. package/dist/index.d.ts +11 -11
  34. package/dist/index.js +3502 -299
  35. package/dist/loader.d.ts +3 -2
  36. package/dist/meta.d.ts +3 -2
  37. package/dist/migrations.d.ts +42 -47
  38. package/dist/schema.d.ts +30 -177
  39. package/dist/seeder.d.ts +12 -17
  40. package/dist/types.d.ts +42 -143
  41. 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
- 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 {
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
- 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
+ > {
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
- 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> {
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
- 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> {
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
- 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> {
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
- export declare interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> {
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
- export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
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
- 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'> & {
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
- 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
- }
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 CHANGED
@@ -1,11 +1,10 @@
1
+ import type { DatabaseConfig, SupportedDialect } from './types';
1
2
  import { SQL } from 'bun';
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
- */
3
+
4
+ declare function createConnectionString(dialect: SupportedDialect, dbConfig: DatabaseConfig): string;
6
5
  export declare function getBunSql(): SQL;
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';
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'
@@ -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
- import type { DialectDriver } from './postgres';
5
- import type { SupportedDialect } from '../types';
6
- export type { DialectDriver } from './postgres';
6
+
7
+ export type { DialectDriver } from './postgres'
7
8
  export declare function getDialectDriver(dialect: SupportedDialect): DialectDriver;
8
- export { MySQLDriver } from './mysql';
9
- export { PostgresDriver } from './postgres';
10
- export { SQLiteDriver } from './sqlite';
9
+
10
+ export { MySQLDriver } from './mysql'
11
+ export { PostgresDriver } from './postgres'
12
+ export { SQLiteDriver } from './sqlite'