bun-query-builder 0.1.12 → 0.1.15

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 (63) hide show
  1. package/README.md +45 -468
  2. package/dist/__tests__/type-narrowing-compile.d.ts +1 -0
  3. package/dist/__tests__/type-narrowing.test.d.ts +1 -0
  4. package/dist/actions/benchmark.d.ts +1 -1
  5. package/dist/actions/cache.d.ts +1 -1
  6. package/dist/actions/console.d.ts +1 -1
  7. package/dist/actions/data.d.ts +2 -1
  8. package/dist/actions/db-info.d.ts +1 -1
  9. package/dist/actions/db-optimize.d.ts +1 -1
  10. package/dist/actions/db-wipe.d.ts +1 -1
  11. package/dist/actions/explain.d.ts +1 -1
  12. package/dist/actions/file.d.ts +1 -1
  13. package/dist/actions/index.d.ts +1 -1
  14. package/dist/actions/inspect.d.ts +1 -1
  15. package/dist/actions/introspect.d.ts +1 -1
  16. package/dist/actions/make-model.d.ts +1 -1
  17. package/dist/actions/migrate-generate.d.ts +1 -1
  18. package/dist/actions/migrate-rollback.d.ts +1 -1
  19. package/dist/actions/migrate-status.d.ts +1 -1
  20. package/dist/actions/migrate.d.ts +1 -1
  21. package/dist/actions/model-show.d.ts +1 -1
  22. package/dist/actions/ping.d.ts +1 -1
  23. package/dist/actions/query-explain-all.d.ts +1 -1
  24. package/dist/actions/relation-diagram.d.ts +1 -1
  25. package/dist/actions/seed.d.ts +1 -1
  26. package/dist/actions/sql.d.ts +1 -1
  27. package/dist/actions/unsafe.d.ts +1 -1
  28. package/dist/actions/validate.d.ts +1 -1
  29. package/dist/actions/wait-ready.d.ts +1 -1
  30. package/dist/bin/cli.js +25785 -0
  31. package/dist/browser.d.ts +118 -44
  32. package/dist/client.d.ts +22 -56
  33. package/dist/config.d.ts +16 -3
  34. package/dist/db.d.ts +5 -4
  35. package/dist/drivers/dynamodb.d.ts +3 -13
  36. package/dist/drivers/index.d.ts +2 -1
  37. package/dist/drivers/mysql.d.ts +3 -9
  38. package/dist/drivers/postgres.d.ts +3 -9
  39. package/dist/drivers/sqlite.d.ts +3 -9
  40. package/dist/dynamodb/client.d.ts +1 -5
  41. package/dist/dynamodb/index.d.ts +7 -28
  42. package/dist/dynamodb/migration-driver.d.ts +2 -23
  43. package/dist/dynamodb/migration-tracker.d.ts +4 -6
  44. package/dist/dynamodb/migrations.d.ts +4 -1
  45. package/dist/dynamodb/model.d.ts +5 -13
  46. package/dist/dynamodb-client.d.ts +3 -23
  47. package/dist/dynamodb-single-table.d.ts +22 -26
  48. package/dist/dynamodb-tooling-adapter.d.ts +2 -33
  49. package/dist/factory.d.ts +3 -3
  50. package/dist/index.d.ts +24 -1
  51. package/dist/loader.d.ts +1 -1
  52. package/dist/meta.d.ts +1 -1
  53. package/dist/migrations.d.ts +4 -4
  54. package/dist/model.d.ts +61 -3
  55. package/dist/orm.d.ts +130 -82
  56. package/dist/schema.d.ts +32 -25
  57. package/dist/seeder.d.ts +3 -1
  58. package/dist/src/browser.js +824 -0
  59. package/dist/src/dynamodb/index.js +2301 -0
  60. package/dist/{index.js → src/index.js} +21466 -20710
  61. package/dist/type-inference.d.ts +326 -0
  62. package/dist/types.d.ts +1 -5
  63. package/package.json +3 -7
package/dist/browser.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { BrowserConfig } from './types';
2
2
  import type { Faker } from 'ts-mocker';
3
+ // Export types for external use
3
4
  export type { BrowserModelInstance, BrowserModelQueryBuilder };
4
5
  /**
5
6
  * Configure the browser query client
@@ -55,28 +56,38 @@ export declare function createBrowserDb<Tables extends Record<string, any>>(): {
55
56
  export declare function createBrowserModel<const TDef extends BrowserModelDefinition>(definition: TDef): void;
56
57
  /**
57
58
  * Auth helpers for browser
59
+ * @defaultValue
60
+ * ```ts
61
+ * {
62
+ * async login: (credentials: { email: string, password: string }) => unknown,
63
+ * async register: (data: { name: string, email: string, password: string }) => unknown,
64
+ * async logout: () => unknown,
65
+ * async user: () => unknown,
66
+ * async check: () => unknown
67
+ * }
68
+ * ```
58
69
  */
59
70
  export declare const browserAuth: {
60
71
  /**
61
72
  * Login and store token
62
73
  */
63
- async login(credentials: { email: string, password: string }): () => unknown;
74
+ async login: (credentials: { email: string, password: string }) => unknown;
64
75
  /**
65
76
  * Register a new user
66
77
  */
67
- async register(data: { name: string, email: string, password: string }): () => unknown;
78
+ async register: (data: { name: string, email: string, password: string }) => unknown;
68
79
  /**
69
80
  * Logout and clear token
70
81
  */
71
- async logout(): unknown;
82
+ async logout: () => unknown;
72
83
  /**
73
84
  * Get current authenticated user
74
85
  */
75
- async user(): unknown;
86
+ async user: () => unknown;
76
87
  /**
77
88
  * Check if user is authenticated
78
89
  */
79
- async check(): unknown;
90
+ async check: () => unknown;
80
91
  /**
81
92
  * Get the current token
82
93
  */
@@ -100,22 +111,54 @@ export declare interface BrowserTypedAttribute<T = unknown> {
100
111
  }
101
112
  // Base model definition for browser
102
113
  export declare interface BrowserModelDefinition {
103
- name: string
104
- table: string
105
- primaryKey?: string
106
- traits?: {
114
+ readonly name: string
115
+ readonly table: string
116
+ readonly primaryKey?: string
117
+ readonly traits?: {
107
118
  readonly useUuid?: boolean
108
- readonly useTimestamps?: boolean
109
- readonly useSoftDeletes?: boolean
110
- readonly useApi?: {
111
- readonly uri: string
119
+ readonly useTimestamps?: boolean | object
120
+ readonly timestampable?: boolean | object
121
+ readonly useSoftDeletes?: boolean | object
122
+ readonly softDeletable?: boolean | object
123
+ readonly useApi?: boolean | {
124
+ readonly uri?: string
112
125
  readonly routes?: readonly string[]
126
+ readonly middleware?: readonly string[]
113
127
  }
128
+ readonly useAuth?: boolean | object
129
+ readonly billable?: boolean | object
130
+ readonly useSearch?: boolean | object
131
+ readonly useSeeder?: boolean | object
132
+ readonly seedable?: boolean | object
133
+ readonly authenticatable?: boolean | object
134
+ readonly observe?: boolean | readonly string[]
135
+ readonly likeable?: boolean | object
136
+ readonly taggable?: boolean
137
+ readonly categorizable?: boolean
138
+ readonly commentables?: boolean
139
+ readonly useActivityLog?: boolean | object
140
+ readonly useSocials?: readonly string[]
114
141
  }
115
- attributes: {
142
+ readonly belongsTo?: readonly string[] | Readonly<Record<string, string>>
143
+ readonly hasMany?: readonly string[] | Readonly<Record<string, string>>
144
+ readonly hasOne?: readonly string[] | Readonly<Record<string, string>>
145
+ readonly belongsToMany?: readonly (string | object)[] | Readonly<Record<string, string | object>>
146
+ readonly hasOneThrough?: readonly (string | object)[] | Readonly<Record<string, string | object>>
147
+ readonly hasManyThrough?: readonly (string | object)[] | Readonly<Record<string, string | object>>
148
+ readonly attributes: {
116
149
  readonly [key: string]: BrowserTypedAttribute<unknown>
117
150
  }
118
151
  }
152
+ declare interface WhereClause {
153
+ column: string
154
+ operator: WhereOperator
155
+ value: unknown
156
+ boolean: 'and' | 'or'
157
+ }
158
+ declare interface OrderByClause {
159
+ column: string
160
+ direction: 'asc' | 'desc'
161
+ }
119
162
  declare interface QueryState {
120
163
  table: string
121
164
  wheres: WhereClause[]
@@ -137,13 +180,13 @@ declare type PrimitiveTypeMap = {
137
180
  declare type InferType<T> = T extends keyof PrimitiveTypeMap ? PrimitiveTypeMap[T] :
138
181
  T extends readonly (infer U)[] ? U :
139
182
  T extends (infer U)[] ? U :
140
- unknown
183
+ unknown;
141
184
  // Extract attribute keys from definition
142
- declare type BrowserAttributeKeys<TDef extends BrowserModelDefinition> = keyof TDef['attributes'] & string
185
+ declare type BrowserAttributeKeys<TDef extends BrowserModelDefinition> = keyof TDef['attributes'] & string;
143
186
  // Infer single attribute type
144
187
  declare type InferBrowserAttributeType<TAttr> = TAttr extends { type: infer T } ? InferType<T> :
145
188
  TAttr extends { factory: (faker: unknown) => infer R } ? R :
146
- unknown
189
+ unknown;
147
190
  // Build the full attributes type from definition
148
191
  declare type InferBrowserModelAttributes<TDef extends BrowserModelDefinition> = {
149
192
  [K in BrowserAttributeKeys<TDef>]: InferBrowserAttributeType<TDef['attributes'][K]>
@@ -151,26 +194,69 @@ declare type InferBrowserModelAttributes<TDef extends BrowserModelDefinition> =
151
194
  // System fields added by traits
152
195
  declare type BrowserSystemFields<TDef extends BrowserModelDefinition> = { id: number } &
153
196
  (TDef['traits'] extends { useUuid: true } ? { uuid: string } : {}) &
154
- (TDef['traits'] extends { useTimestamps: true } ? { created_at: string; updated_at: string } : {}) &
155
- (TDef['traits'] extends { useSoftDeletes: true } ? { deleted_at: string | null } : {})
197
+ (TDef['traits'] extends { useTimestamps: true } ? { created_at: string; updated_at: string | null } : {}) &
198
+ (TDef['traits'] extends { timestampable: true | object } ? { created_at: string; updated_at: string | null } : {}) &
199
+ (TDef['traits'] extends { useSoftDeletes: true } ? { deleted_at: string | null } : {}) &
200
+ (TDef['traits'] extends { softDeletable: true | object } ? { deleted_at: string | null } : {}) &
201
+ (TDef['traits'] extends { useAuth: true | object } ? { two_factor_secret: string | null; public_key: string | null } : {}) &
202
+ (TDef['traits'] extends { billable: true | object } ? { stripe_id: string | null } : {});
156
203
  // Complete model type
157
- declare type BrowserModelAttributes<TDef extends BrowserModelDefinition> = InferBrowserModelAttributes<TDef> & BrowserSystemFields<TDef>
204
+ declare type BrowserModelAttributes<TDef extends BrowserModelDefinition> = InferBrowserModelAttributes<TDef> & BrowserSystemFields<TDef>;
158
205
  // All valid column names
159
206
  declare type BrowserColumnName<TDef extends BrowserModelDefinition> = | BrowserAttributeKeys<TDef>
160
207
  | 'id'
161
208
  | (TDef['traits'] extends { useUuid: true } ? 'uuid' : never)
162
209
  | (TDef['traits'] extends { useTimestamps: true } ? 'created_at' | 'updated_at' : never)
210
+ | (TDef['traits'] extends { timestampable: true | object } ? 'created_at' | 'updated_at' : never)
163
211
  | (TDef['traits'] extends { useSoftDeletes: true } ? 'deleted_at' : never)
212
+ | (TDef['traits'] extends { softDeletable: true | object } ? 'deleted_at' : never)
213
+ | (TDef['traits'] extends { useAuth: true | object } ? 'two_factor_secret' | 'public_key' : never)
214
+ | (TDef['traits'] extends { billable: true | object } ? 'stripe_id' : never);
164
215
  // Hidden fields
165
216
  declare type BrowserHiddenKeys<TDef extends BrowserModelDefinition> = {
166
217
  [K in BrowserAttributeKeys<TDef>]: TDef['attributes'][K] extends { hidden: true } ? K : never
167
- }[BrowserAttributeKeys<TDef>]
218
+ }[BrowserAttributeKeys<TDef>];
168
219
  // Fillable fields
169
220
  declare type BrowserFillableKeys<TDef extends BrowserModelDefinition> = {
170
221
  [K in BrowserAttributeKeys<TDef>]: TDef['attributes'][K] extends { fillable: true } ? K : never
171
- }[BrowserAttributeKeys<TDef>]
222
+ }[BrowserAttributeKeys<TDef>];
223
+ // Numeric columns — constrains aggregate-like column parameters
224
+ declare type BrowserNumericColumns<TDef extends BrowserModelDefinition> = {
225
+ [K in BrowserAttributeKeys<TDef>]: TDef['attributes'][K] extends { type: 'number' } ? K : never
226
+ }[BrowserAttributeKeys<TDef>];
227
+ // Relation name inference for browser models (supports both array and object syntax)
228
+ declare type BrowserBelongsToNames<TDef> = (TDef extends { belongsTo: readonly (infer R)[] }
229
+ ? R extends string ? Lowercase<R> : never : never)
230
+ | (TDef extends { belongsTo: Readonly<Record<infer K, unknown>> }
231
+ ? K extends string ? K : never : never);
232
+ declare type BrowserHasManyNames<TDef> = (TDef extends { hasMany: readonly (infer R)[] }
233
+ ? R extends string ? Lowercase<R> : never : never)
234
+ | (TDef extends { hasMany: Readonly<Record<infer K, unknown>> }
235
+ ? K extends string ? K : never : never);
236
+ declare type BrowserHasOneNames<TDef> = (TDef extends { hasOne: readonly (infer R)[] }
237
+ ? R extends string ? Lowercase<R> : never : never)
238
+ | (TDef extends { hasOne: Readonly<Record<infer K, unknown>> }
239
+ ? K extends string ? K : never : never);
240
+ declare type BrowserBelongsToManyNames<TDef> = (TDef extends { belongsToMany: readonly (infer R)[] }
241
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
242
+ | (TDef extends { belongsToMany: Readonly<Record<infer K, unknown>> }
243
+ ? K extends string ? K : never : never);
244
+ declare type BrowserHasOneThroughNames<TDef> = (TDef extends { hasOneThrough: readonly (infer R)[] }
245
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
246
+ | (TDef extends { hasOneThrough: Readonly<Record<infer K, unknown>> }
247
+ ? K extends string ? K : never : never);
248
+ declare type BrowserHasManyThroughNames<TDef> = (TDef extends { hasManyThrough: readonly (infer R)[] }
249
+ ? R extends string ? Lowercase<R> : R extends { model: infer M extends string } ? Lowercase<M> : never : never)
250
+ | (TDef extends { hasManyThrough: Readonly<Record<infer K, unknown>> }
251
+ ? K extends string ? K : never : never);
252
+ declare type BrowserRelationNames<TDef> = | BrowserBelongsToNames<TDef>
253
+ | BrowserHasManyNames<TDef>
254
+ | BrowserHasOneNames<TDef>
255
+ | BrowserBelongsToManyNames<TDef>
256
+ | BrowserHasOneThroughNames<TDef>
257
+ | BrowserHasManyThroughNames<TDef>;
172
258
  // Types for query building
173
- export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not'
259
+ export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not';
174
260
  /**
175
261
  * Custom error class for browser query errors
176
262
  */
@@ -183,9 +269,8 @@ export declare class BrowserQueryError extends Error {
183
269
  * Fluent API that builds queries and executes them via fetch
184
270
  */
185
271
  export declare class BrowserQueryBuilder<T = any> {
186
- private state: QueryState;
187
272
  constructor(table: string);
188
- select(columns: string[]): this;
273
+ select(...columns: string[]): this;
189
274
  where(column: string, operatorOrValue: WhereOperator | any, value?: any): this;
190
275
  orWhere(column: string, operatorOrValue: WhereOperator | any, value?: any): this;
191
276
  andWhere(column: string, operatorOrValue: WhereOperator | any, value?: any): this;
@@ -201,9 +286,7 @@ export declare class BrowserQueryBuilder<T = any> {
201
286
  offset(count: number): this;
202
287
  skip(count: number): this;
203
288
  take(count: number): this;
204
- with(relations: string[]): this;
205
- private buildQueryParams(): URLSearchParams;
206
- private buildUrl(path?: string | number): string;
289
+ with(...relations: string[]): this;
207
290
  get(): Promise<T[]>;
208
291
  first(): Promise<T | null>;
209
292
  firstOrFail(): Promise<T>;
@@ -229,26 +312,18 @@ export declare class BrowserQueryBuilder<T = any> {
229
312
  * Browser Model Instance - represents a single record with type-safe access
230
313
  */
231
314
  declare class BrowserModelInstance<TDef extends BrowserModelDefinition, TSelected extends BrowserColumnName<TDef> = BrowserColumnName<TDef>> {
232
- private _attributes: Record<string, unknown>;
233
- private _definition: TDef;
234
315
  constructor(definition: TDef, attributes?: Partial<BrowserModelAttributes<TDef>>);
235
316
  get<K extends TSelected>(key: K): K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : never;
236
317
  set<K extends BrowserAttributeKeys<TDef>>(key: K, value: BrowserModelAttributes<TDef>[K]): void;
318
+ get attributes(): Pick<BrowserModelAttributes<TDef>, TSelected & keyof BrowserModelAttributes<TDef>>;
319
+ get id(): number;
237
320
  toJSON(): Omit<Pick<BrowserModelAttributes<TDef>, TSelected & keyof BrowserModelAttributes<TDef>>, BrowserHiddenKeys<TDef>>;
238
321
  }
239
322
  /**
240
323
  * Typed Browser Query Builder with precise type narrowing
241
324
  */
242
325
  declare class BrowserModelQueryBuilder<TDef extends BrowserModelDefinition, TSelected extends BrowserColumnName<TDef> = BrowserColumnName<TDef>> {
243
- private _definition: TDef;
244
- private _wheres: { column: string; operator: WhereOperator; value: unknown; boolean: 'and' | 'or' }[];
245
- private _orderBy: { column: string; direction: 'asc' | 'desc' }[];
246
- private _limit?: number;
247
- private _offset?: number;
248
- private _select: string[];
249
- private _withRelations: string[];
250
326
  constructor(definition: TDef);
251
- private getTablePath(): string;
252
327
  where<K extends BrowserColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | (K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : unknown), value?: K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : unknown): BrowserModelQueryBuilder<TDef, TSelected>;
253
328
  orWhere<K extends BrowserColumnName<TDef>>(column: K, operatorOrValue: WhereOperator | (K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : unknown), value?: K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : unknown): BrowserModelQueryBuilder<TDef, TSelected>;
254
329
  whereIn<K extends BrowserColumnName<TDef>>(column: K, values: (K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : unknown)[]): BrowserModelQueryBuilder<TDef, TSelected>;
@@ -263,12 +338,10 @@ declare class BrowserModelQueryBuilder<TDef extends BrowserModelDefinition, TSel
263
338
  take(count: number): BrowserModelQueryBuilder<TDef, TSelected>;
264
339
  offset(count: number): BrowserModelQueryBuilder<TDef, TSelected>;
265
340
  skip(count: number): BrowserModelQueryBuilder<TDef, TSelected>;
266
- select<K extends BrowserColumnName<TDef>>(columns: K[]): BrowserModelQueryBuilder<TDef, K>;
267
- with(relations: string[]): BrowserModelQueryBuilder<TDef, TSelected>;
341
+ select<K extends BrowserColumnName<TDef>>(...columns: K[]): BrowserModelQueryBuilder<TDef, K>;
342
+ with<R extends BrowserRelationNames<TDef> extends never ? string : BrowserRelationNames<TDef>>(...relations: R[]): BrowserModelQueryBuilder<TDef, TSelected>;
268
343
  latest(column?: BrowserColumnName<TDef>): BrowserModelQueryBuilder<TDef, TSelected>;
269
344
  oldest(column?: BrowserColumnName<TDef>): BrowserModelQueryBuilder<TDef, TSelected>;
270
- private buildQueryParams(): URLSearchParams;
271
- private buildUrl(path?: string | number): string;
272
345
  get(): Promise<BrowserModelInstance<TDef, TSelected>[]>;
273
346
  first(): Promise<BrowserModelInstance<TDef, TSelected> | null>;
274
347
  firstOrFail(): Promise<BrowserModelInstance<TDef, TSelected>>;
@@ -277,7 +350,7 @@ declare class BrowserModelQueryBuilder<TDef extends BrowserModelDefinition, TSel
277
350
  count(): Promise<number>;
278
351
  exists(): Promise<boolean>;
279
352
  pluck<K extends BrowserColumnName<TDef>>(column: K): Promise<(K extends keyof BrowserModelAttributes<TDef> ? BrowserModelAttributes<TDef>[K] : unknown)[]>;
280
- paginate(page?: any, perPage?: any): Promise<{
353
+ paginate(page?: number, perPage?: number): Promise<{
281
354
  data: BrowserModelInstance<TDef, TSelected>[]
282
355
  total: number
283
356
  page: number
@@ -285,4 +358,5 @@ declare class BrowserModelQueryBuilder<TDef extends BrowserModelDefinition, TSel
285
358
  lastPage: number
286
359
  }>;
287
360
  }
288
- export default browserQuery;
361
+ // Export for convenience
362
+ export default browserQuery;
package/dist/client.d.ts CHANGED
@@ -28,7 +28,7 @@ export declare function setQueryCacheMaxSize(size: number): void;
28
28
  export declare interface WhereRaw {
29
29
  raw: any
30
30
  }
31
- export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> {
31
+ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable,> {
32
32
  distinct: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
33
33
  distinctOn: (...columns: (keyof DB[TTable]['columns'] & string | string)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
34
34
  selectRaw: (fragment: any) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
@@ -126,29 +126,7 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
126
126
  withRecursive: (name: string, sub: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
127
127
  value: <K extends keyof TSelected & string>(column: K) => Promise<SelectedRow<DB, TTable, TSelected>[K]>
128
128
  pluck: {
129
- /**
130
- * # `pluck(column)`
131
- *
132
- * Returns an array of values for a single column.
133
- *
134
- * @example
135
- * ```ts
136
- * const names = await db.selectFrom('users').pluck('name')
137
- * const ids = await db.selectFrom('users').orderBy('id').pluck('id')
138
- * ```
139
- */
140
129
  <K extends keyof TSelected & string>(column: K): Promise<SelectedRow<DB, TTable, TSelected>[K][]>
141
- /**
142
- * # `pluck(column, key)`
143
- *
144
- * Returns an object keyed by the given key column.
145
- *
146
- * @example
147
- * ```ts
148
- * const byId = await db.selectFrom('users').pluck('email', 'id')
149
- * const map = await db.selectFrom('users').pluck('name', 'email')
150
- * ```
151
- */
152
130
  <K extends keyof TSelected & string, K2 extends keyof TSelected & string>(column: K, key: K2): Promise<Record<string, SelectedRow<DB, TTable, TSelected>[K]>>
153
131
  }
154
132
  exists: () => Promise<boolean>
@@ -184,8 +162,8 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
184
162
  sum: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
185
163
  max: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
186
164
  min: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
187
- rows: TSelected[]
188
- row: TSelected
165
+ readonly rows: TSelected[]
166
+ readonly row: TSelected
189
167
  values: () => Promise<any[][]>
190
168
  toParams?: () => any[]
191
169
  raw: () => Promise<any[][]>
@@ -354,6 +332,8 @@ declare interface InternalState {
354
332
  schema?: any
355
333
  txDefaults?: TransactionOptions
356
334
  }
335
+ declare interface TxBackoff { baseMs?: number, maxMs?: number, factor?: number, jitter?: boolean }
336
+ declare interface TxLoggerEvent { type: 'start' | 'retry' | 'commit' | 'rollback' | 'error', attempt: number, error?: any, durationMs?: number }
357
337
  export declare interface TransactionOptions {
358
338
  retries?: number
359
339
  isolation?: TransactionIsolation
@@ -366,51 +346,39 @@ export declare interface TransactionOptions {
366
346
  onRollback?: (error: any) => void
367
347
  afterRollback?: () => void
368
348
  }
369
- declare interface TxBackoff {
370
- baseMs?: number
371
- maxMs?: number
372
- factor?: number
373
- jitter?: boolean
374
- }
375
- declare interface TxLoggerEvent {
376
- type: 'start' | 'retry' | 'commit' | 'rollback' | 'error'
377
- attempt: number
378
- error?: any
379
- durationMs?: number
380
- }
381
349
  // Where condition helpers
382
- declare type Primitive = string | number | boolean | bigint | Date | null | undefined
383
- declare type ValueOrRef = Primitive
384
- export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not'
350
+ declare type Primitive = string | number | boolean | bigint | Date | null | undefined;
351
+ declare type ValueOrRef = Primitive;
352
+ export type WhereOperator = '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like' | 'in' | 'not in' | 'is' | 'is not';
385
353
  export type WhereExpression<TableColumns> = | Partial<{ [K in keyof TableColumns & string]: ValueOrRef | ValueOrRef[] }>
386
354
  | [key: keyof TableColumns & string, op: WhereOperator, value: ValueOrRef | ValueOrRef[]]
387
- | WhereRaw
388
- export type QueryResult = any
355
+ | WhereRaw;
356
+ export type QueryResult = any;
389
357
  /**
390
358
  * # `SortDirection`
391
359
  *
392
360
  * The direction used when ordering query results.
393
361
  */
394
- export type SortDirection = 'asc' | 'desc'
362
+ export type SortDirection = 'asc' | 'desc';
395
363
  /**
396
364
  * # `ColumnName<DB, TTable>`
397
365
  *
398
366
  * Helper type extracting a string union of column names for a given table.
399
367
  */
400
- export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string
368
+ export type ColumnName<DB extends DatabaseSchema<any>, TTable extends keyof DB & string> = keyof DB[TTable]['columns'] & string;
401
369
  // Named row alias to improve IDE hover readability
402
- export type SelectedRow<DB extends DatabaseSchema<any>, _TTable extends keyof DB & string, TSelected> = Readonly<TSelected>
370
+ export type SelectedRow<DB extends DatabaseSchema<any>, _TTable extends keyof DB & string, TSelected,> = Readonly<TSelected>;
403
371
  declare type JoinColumn<DB extends DatabaseSchema<any>, TTables extends string> = TTables extends any
404
372
  ? `${TTables}.${keyof DB[TTables]['columns'] & string}`
405
- : never
373
+ : never;
406
374
  // Convert snake_case to PascalCase at the type level (e.g. created_at -> CreatedAt)
407
375
  declare type SnakeToPascal<S extends string> = S extends `${infer H}_${infer T}`
408
376
  ? `${Capitalize<H>}${SnakeToPascal<T>}`
409
- : Capitalize<S>
377
+ : Capitalize<S>;
410
378
  // Typed SQL builder (type-level only). We piggy-back on the runtime builder but
411
379
  // thread a phantom TSql string through method signatures so hovers can show the
412
380
  // composed SQL at compile-time for common operations.
413
- declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string, TSql extends string> = {
381
+ declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string, TSql extends string,> = {
414
382
  [K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (
415
383
  value: DB[TTable]['columns'][K],
416
384
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} WHERE ${K} = ?`>
@@ -423,7 +391,7 @@ declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable ex
423
391
  value: DB[TTable]['columns'][K],
424
392
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>
425
393
  }
426
- export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable, TSql extends string = `SELECT * FROM ${TTable}`> = Omit<
394
+ export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable, TSql extends string = `SELECT * FROM ${TTable}`,> = Omit<
427
395
  BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined>,
428
396
  'toSQL' | 'where' | 'andWhere' | 'orWhere' | 'orderBy' | 'limit'
429
397
  > & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
@@ -463,16 +431,16 @@ export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
463
431
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} ORDER BY ${C} ${D}`>
464
432
  limit: <N extends number>(n: N) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} LIMIT ${N}`>
465
433
  }
466
- declare type DynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable> = {
434
+ declare type DynamicWhereMethods<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable,> = {
467
435
  [K in keyof DB[TTable]['columns'] & string as `where${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
468
436
  } & {
469
437
  [K in keyof DB[TTable]['columns'] & string as `orWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
470
438
  } & {
471
439
  [K in keyof DB[TTable]['columns'] & string as `andWhere${SnakeToPascal<K>}`]: (value: DB[TTable]['columns'][K]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
472
440
  }
473
- 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>
441
+ 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>;
474
442
  // Typed INSERT builder to expose a structured SQL literal in hovers
475
- 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'> & {
443
+ 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'> & {
476
444
  toSQL: () => TSql
477
445
  values: (
478
446
  data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[],
@@ -487,13 +455,11 @@ export type TypedInsertQueryBuilder<DB extends DatabaseSchema<any>, TTable exten
487
455
  `${TSql} RETURNING ${string}`
488
456
  >
489
457
  }
490
- declare type TransactionIsolation = 'read committed' | 'repeatable read' | 'serializable'
458
+ declare type TransactionIsolation = 'read committed' | 'repeatable read' | 'serializable';
491
459
  declare class QueryCache {
492
- private cache: any;
493
- private maxSize: any;
494
460
  get(key: string): any | null;
495
461
  set(key: string, data: any, ttlMs: number): void;
496
462
  clear(): void;
497
463
  setMaxSize(size: number): void;
498
464
  }
499
- export { resetConnection };
465
+ export { resetConnection };
package/dist/config.d.ts CHANGED
@@ -9,7 +9,7 @@ export declare function getPlaceholder(index: number): string;
9
9
  * PostgreSQL: $1, $2, $3
10
10
  * MySQL/SQLite: ?, ?, ?
11
11
  */
12
- export declare function getPlaceholders(count: number, startIndex?: any): string;
12
+ export declare function getPlaceholders(count: number, startIndex?: number): string;
13
13
  export declare function getConfig(): Promise<QueryBuilderConfig>;
14
14
  /**
15
15
  * Programmatically set/override the query builder configuration.
@@ -18,5 +18,18 @@ export declare function getConfig(): Promise<QueryBuilderConfig>;
18
18
  */
19
19
  export declare function setConfig(userConfig: Partial<QueryBuilderConfig>): void;
20
20
  export declare const defaultConfig: QueryBuilderConfig;
21
- // For backwards compatibility - synchronous access with default fallback
22
- export declare const config: QueryBuilderConfig;
21
+ // For backwards compatibility synchronous access with default fallback.
22
+ //
23
+ // Why `let` + an explicit `Object.assign(config, defaultConfig)` instead of
24
+ // the obvious `export const config = defaultConfig`: when downstream code
25
+ // (e.g. `bunfig`, our config loader) introduces a top-level `await`, Bun's
26
+ // bundler may wrap this module's initializer in `__esm(async () => {...})`.
27
+ // Static `const x = y` exports inside such a wrapper are reassigned only
28
+ // once the async init runs, so callers that reach `setConfig(...)` before
29
+ // that init (e.g. another module's top-level `setConfig` call mid-graph)
30
+ // see `config` as `undefined` and `Object.assign(undefined, ...)` throws.
31
+ // Initializing as `let config = {...defaultConfig}` outside the wrapper, and
32
+ // having `setConfig` re-hydrate from defaults if it's somehow still empty,
33
+ // keeps the surface synchronous for every consumer regardless of how the
34
+ // module ends up bundled.
35
+ export declare let config: QueryBuilderConfig;
package/dist/db.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import { SQL } from 'bun';
2
1
  import { Database } from 'bun:sqlite';
2
+ import { SQL } from 'bun';
3
3
  /**
4
4
  * Returns a Bun SQL instance configured for the current dialect and database settings.
5
5
  * For SQLite, uses bun:sqlite directly for better compiled binary support.
6
6
  * Handles connection errors gracefully by falling back to in-memory SQLite.
7
7
  */
8
8
  export declare function getBunSql(): SQL;
9
- export declare function getOrCreateBunSql(forceNew?: any): SQL;
9
+ export declare function getOrCreateBunSql(forceNew?: boolean): SQL;
10
10
  /**
11
11
  * Resets the cached database connection.
12
12
  * Call this after changing config via setConfig() to ensure the new config is used.
@@ -21,10 +21,11 @@ export declare const bunSql: SQL;
21
21
  * using bun:sqlite's Database class for better compiled binary support.
22
22
  */
23
23
  declare class SQLiteWrapper {
24
- private db: Database;
25
24
  constructor(filename: string);
26
25
  query(sql: string, params?: any[]): any[];
27
26
  run(sql: string, params?: any[]): any;
28
27
  close(): void;
28
+ get database(): Database;
29
29
  }
30
- export { SQL } from 'bun';
30
+ // Also export the SQL class for advanced usage
31
+ export { SQL } from 'bun';
@@ -273,7 +273,7 @@ export declare interface DynamoDBConfig {
273
273
  /**
274
274
  * DynamoDB attribute type mapping
275
275
  */
276
- export type DynamoDBAttributeType = 'S' | 'N' | 'B' | 'SS' | 'NS' | 'BS' | 'M' | 'L' | 'BOOL' | 'NULL'
276
+ export type DynamoDBAttributeType = 'S' | 'N' | 'B' | 'SS' | 'NS' | 'BS' | 'M' | 'L' | 'BOOL' | 'NULL';
277
277
  /**
278
278
  * DynamoDB query condition operators
279
279
  */
@@ -283,13 +283,11 @@ export type DynamoDBComparisonOperator = | '='
283
283
  | '>'
284
284
  | '>='
285
285
  | 'BETWEEN'
286
- | 'begins_with'
286
+ | 'begins_with';
287
287
  /**
288
288
  * DynamoDB Driver Implementation
289
289
  */
290
290
  export declare class DynamoDBDriverImpl implements DynamoDBDriver {
291
- private config: DynamoDBConfig;
292
- private entityMappings: Map<string, SingleTableEntityMapping>;
293
291
  constructor(config: DynamoDBConfig);
294
292
  createTable(definition: DynamoDBTableDefinition): DynamoDBTableDefinition;
295
293
  deleteTable(tableName: string): { tableName: string };
@@ -327,12 +325,4 @@ export declare class DynamoDBDriverImpl implements DynamoDBDriver {
327
325
  };
328
326
  marshall(item: Record<string, any>): Record<string, any>;
329
327
  unmarshall(item: Record<string, any>): Record<string, any>;
330
- private interpolatePattern(pattern: string, values: Record<string, any>): string;
331
- private buildExpression(conditions: DynamoDBCondition[], joiner: 'AND' | 'OR'): {
332
- expression: string
333
- expressionAttributeNames: Record<string, string>
334
- expressionAttributeValues: Record<string, any>
335
- };
336
- private marshallValue(value: any): any;
337
- private unmarshallValue(value: any): any;
338
- }
328
+ }
@@ -30,7 +30,8 @@ export declare function getDialectDriver(dialect: SupportedDialect): DialectDriv
30
30
  export { MySQLDriver } from './mysql';
31
31
  export { PostgresDriver } from './postgres';
32
32
  export { SQLiteDriver } from './sqlite';
33
+ // DynamoDB driver (NoSQL)
33
34
  export {
34
35
  createDynamoDBDriver,
35
36
  DynamoDBDriverImpl,
36
- } from './dynamodb';
37
+ } from './dynamodb';
@@ -3,7 +3,7 @@ export declare interface DialectDriver {
3
3
  createEnumType: (enumTypeName: string, values: string[]) => string
4
4
  createTable: (table: TablePlan) => string
5
5
  createIndex: (tableName: string, index: IndexPlan) => string
6
- addForeignKey: (tableName: string, columnName: string, refTable: string, refColumn: string) => string
6
+ addForeignKey: (tableName: string, columnName: string, refTable: string, refColumn: string, onDelete?: string, onUpdate?: string) => string
7
7
  addColumn: (tableName: string, column: ColumnPlan) => string
8
8
  modifyColumn: (tableName: string, column: ColumnPlan) => string
9
9
  dropTable: (tableName: string) => string
@@ -15,15 +15,10 @@ export declare interface DialectDriver {
15
15
  recordMigrationQuery: () => string
16
16
  }
17
17
  export declare class MySQLDriver implements DialectDriver {
18
- private quoteIdentifier(id: string): string;
19
- private getColumnType(column: ColumnPlan): string;
20
- private getPrimaryKeyType(column: ColumnPlan): string;
21
- private getAutoIncrementClause(column: ColumnPlan): string;
22
- private getDefaultValue(column: ColumnPlan): string;
23
18
  createEnumType(_enumTypeName: string, _values: string[]): string;
24
19
  createTable(table: TablePlan): string;
25
20
  createIndex(tableName: string, index: IndexPlan): string;
26
- addForeignKey(tableName: string, columnName: string, refTable: string, refColumn: string): string;
21
+ addForeignKey(tableName: string, columnName: string, refTable: string, refColumn: string, onDelete?: string, onUpdate?: string): string;
27
22
  addColumn(tableName: string, column: ColumnPlan): string;
28
23
  modifyColumn(tableName: string, column: ColumnPlan): string;
29
24
  dropTable(tableName: string): string;
@@ -33,5 +28,4 @@ export declare class MySQLDriver implements DialectDriver {
33
28
  createMigrationsTable(): string;
34
29
  getExecutedMigrationsQuery(): string;
35
30
  recordMigrationQuery(): string;
36
- private renderColumn(column: ColumnPlan): string;
37
- }
31
+ }
@@ -3,7 +3,7 @@ export declare interface DialectDriver {
3
3
  createEnumType: (enumTypeName: string, values: string[]) => string
4
4
  createTable: (table: TablePlan) => string
5
5
  createIndex: (tableName: string, index: IndexPlan) => string
6
- addForeignKey: (tableName: string, columnName: string, refTable: string, refColumn: string) => string
6
+ addForeignKey: (tableName: string, columnName: string, refTable: string, refColumn: string, onDelete?: string, onUpdate?: string) => string
7
7
  addColumn: (tableName: string, column: ColumnPlan) => string
8
8
  modifyColumn: (tableName: string, column: ColumnPlan) => string
9
9
  dropTable: (tableName: string) => string
@@ -15,15 +15,10 @@ export declare interface DialectDriver {
15
15
  recordMigrationQuery: () => string
16
16
  }
17
17
  export declare class PostgresDriver implements DialectDriver {
18
- private quoteIdentifier(id: string): string;
19
- private getColumnType(column: ColumnPlan): string;
20
- private getPrimaryKeyType(column: ColumnPlan): string;
21
- private getAutoIncrementClause(_column: ColumnPlan): string;
22
- private getDefaultValue(column: ColumnPlan): string;
23
18
  createEnumType(enumTypeName: string, values: string[]): string;
24
19
  createTable(table: TablePlan): string;
25
20
  createIndex(tableName: string, index: IndexPlan): string;
26
- addForeignKey(tableName: string, columnName: string, refTable: string, refColumn: string): string;
21
+ addForeignKey(tableName: string, columnName: string, refTable: string, refColumn: string, onDelete?: string, onUpdate?: string): string;
27
22
  addColumn(tableName: string, column: ColumnPlan): string;
28
23
  modifyColumn(tableName: string, column: ColumnPlan): string;
29
24
  dropTable(tableName: string): string;
@@ -33,5 +28,4 @@ export declare class PostgresDriver implements DialectDriver {
33
28
  createMigrationsTable(): string;
34
29
  getExecutedMigrationsQuery(): string;
35
30
  recordMigrationQuery(): string;
36
- private renderColumn(column: ColumnPlan): string;
37
- }
31
+ }