bun-query-builder 0.1.28 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin/cli.js CHANGED
@@ -25203,7 +25203,14 @@ class ModelQueryBuilder {
25203
25203
  sql2 += ` WHERE ${whereBody}`;
25204
25204
  }
25205
25205
  const row = await exec.get(sql2, params);
25206
- return row?.v == null ? null : Number(row.v);
25206
+ const v2 = row?.v;
25207
+ if (v2 == null)
25208
+ return null;
25209
+ if (typeof v2 === "string") {
25210
+ const n2 = Number(v2);
25211
+ return v2.trim() !== "" && !Number.isNaN(n2) ? n2 : v2;
25212
+ }
25213
+ return v2;
25207
25214
  }
25208
25215
  max(column) {
25209
25216
  return this.aggregate("MAX", column);
@@ -25212,10 +25219,10 @@ class ModelQueryBuilder {
25212
25219
  return this.aggregate("MIN", column);
25213
25220
  }
25214
25221
  async avg(column) {
25215
- return await this.aggregate("AVG", column) || 0;
25222
+ return Number(await this.aggregate("AVG", column) ?? 0) || 0;
25216
25223
  }
25217
25224
  async sum(column) {
25218
- return await this.aggregate("SUM", column) || 0;
25225
+ return Number(await this.aggregate("SUM", column) ?? 0) || 0;
25219
25226
  }
25220
25227
  async delete() {
25221
25228
  const exec = getExecutor();
@@ -29929,7 +29936,7 @@ function getPrefix() {
29929
29936
  }
29930
29937
  var prefix = getPrefix();
29931
29938
  // package.json
29932
- var version2 = "0.1.28";
29939
+ var version2 = "0.1.29";
29933
29940
 
29934
29941
  // bin/cli.ts
29935
29942
  init_actions();
package/dist/client.d.ts CHANGED
@@ -104,8 +104,11 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
104
104
  having: (expr: WhereExpression<any>) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
105
105
  havingRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
106
106
  addSelect: (...columns: ((keyof DB[TTable]['columns'] & string) | string | SqlFragment)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
107
- select?: (columns: string | SqlFragment | ((keyof DB[TTable]['columns'] & string) | string | SqlFragment)[]) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
108
- selectAll?: () => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
107
+ select?: {
108
+ <K extends keyof DB[TTable]['columns'] & string>(columns: K[]): SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>, TJoined>
109
+ (columns: string | SqlFragment | (string | SqlFragment)[]): SelectQueryBuilder<DB, TTable, TSelected, TJoined>
110
+ }
111
+ selectAll?: () => SelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TJoined>
109
112
  orderByRaw: (fragment: SqlFragment) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
110
113
  union: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
111
114
  unionAll: (other: { toSQL: () => any }) => SelectQueryBuilder<DB, TTable, TSelected, TJoined>
@@ -146,7 +149,7 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
146
149
  }
147
150
  exists: () => Promise<boolean>
148
151
  doesntExist: () => Promise<boolean>
149
- cursorPaginate: (perPage: number, cursor?: string | number, column?: string, direction?: 'asc' | 'desc') => Promise<{ data: any[], meta: { perPage: number, nextCursor: string | number | null } }>
152
+ cursorPaginate: (perPage: number, cursor?: string | number, column?: string, direction?: 'asc' | 'desc') => Promise<{ data: SelectedRow<DB, TTable, TSelected>[], meta: { perPage: number, nextCursor: string | number | null } }>
150
153
  chunk: (size: number, handler: (rows: any[]) => Promise<void> | void) => Promise<void>
151
154
  chunkById: (size: number, column?: string, handler?: (rows: any[]) => Promise<void> | void) => Promise<void>
152
155
  eachById: (size: number, column?: string, handler?: (row: any) => Promise<void> | void) => Promise<void>
@@ -175,8 +178,8 @@ export declare interface BaseSelectQueryBuilder<DB extends DatabaseSchema<any>,
175
178
  count: () => Promise<number>
176
179
  avg: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
177
180
  sum: (column: keyof DB[TTable]['columns'] & string) => Promise<number>
178
- max: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
179
- min: (column: keyof DB[TTable]['columns'] & string) => Promise<any>
181
+ max: <K extends keyof DB[TTable]['columns'] & string>(column: K) => Promise<DB[TTable]['columns'][K] | null>
182
+ min: <K extends keyof DB[TTable]['columns'] & string>(column: K) => Promise<DB[TTable]['columns'][K] | null>
180
183
  readonly rows: TSelected[]
181
184
  readonly row: TSelected
182
185
  values: () => Promise<any[][]>
@@ -224,13 +227,19 @@ export declare interface TableQueryBuilder<DB extends DatabaseSchema<any>, TTabl
224
227
  insert: (data: Partial<DB[TTable]['columns']> | Partial<DB[TTable]['columns']>[]) => InsertQueryBuilder<DB, TTable>
225
228
  update: (values: Partial<DB[TTable]['columns']>) => UpdateQueryBuilder<DB, TTable>
226
229
  delete: () => DeleteQueryBuilder<DB, TTable>
227
- select: (...columns: (keyof DB[TTable]['columns'] & string)[]) => SelectQueryBuilder<DB, TTable, any>
230
+ select: <K extends keyof DB[TTable]['columns'] & string>(...columns: K[]) => SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
228
231
  }
229
232
  export declare interface QueryBuilder<DB extends DatabaseSchema<any>> {
230
- select: <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(
231
- table: TTable,
232
- ...columns: (K | `${string} as ${string}`)[]
233
- ) => SelectQueryBuilder<DB, TTable, any>
233
+ select: {
234
+ <TTable extends keyof DB & string, K extends keyof DB[TTable]['columns'] & string>(
235
+ table: TTable,
236
+ ...columns: K[]
237
+ ): SelectQueryBuilder<DB, TTable, Pick<DB[TTable]['columns'], K>>
238
+ <TTable extends keyof DB & string>(
239
+ table: TTable,
240
+ ...columns: ((keyof DB[TTable]['columns'] & string) | `${string} as ${string}`)[]
241
+ ): SelectQueryBuilder<DB, TTable, any>
242
+ }
234
243
  selectFrom: <TTable extends keyof DB & string>(table: TTable) => TypedSelectQueryBuilder<DB, TTable, DB[TTable]['columns'], TTable, `SELECT * FROM ${TTable}`>
235
244
  insertInto: <TTable extends keyof DB & string>(table: TTable) => TypedInsertQueryBuilder<DB, TTable>
236
245
  updateTable: <TTable extends keyof DB & string>(table: TTable) => UpdateQueryBuilder<DB, TTable>
@@ -456,11 +465,15 @@ declare type _TypedDynamicWhereMethods<DB extends DatabaseSchema<any>, TTable ex
456
465
  value: DB[TTable]['columns'][K],
457
466
  ) => TypedSelectQueryBuilder<DB, TTable, TSelected, TJoined, `${TSql} AND ${K} = ?`>
458
467
  }
468
+ // NOTE: TypedSelectQueryBuilder must NOT also intersect DynamicWhereMethods —
469
+ // _TypedDynamicWhereMethods declares the same `where<Column>` keys, and the
470
+ // untyped variant (returning a plain SelectQueryBuilder) would win overload
471
+ // resolution, silently downgrading `toSQL()` from the composed literal SQL
472
+ // type back to `string` after any dynamic-where call.
459
473
  export type TypedSelectQueryBuilder<DB extends DatabaseSchema<any>, TTable extends keyof DB & string, TSelected, TJoined extends string = TTable, TSql extends string = `SELECT * FROM ${TTable}`,> = Omit<
460
474
  BaseSelectQueryBuilder<DB, TTable, TSelected, TJoined>,
461
475
  'toSQL' | 'where' | 'andWhere' | 'orWhere' | 'orderBy' | 'limit'
462
- > & DynamicWhereMethods<DB, TTable, TSelected, TJoined>
463
- & _TypedDynamicWhereMethods<DB, TTable, TSelected, TJoined, TSql>
476
+ > & _TypedDynamicWhereMethods<DB, TTable, TSelected, TJoined, TSql>
464
477
  & {
465
478
  toSQL: () => TSql
466
479
  where: (<K extends keyof DB[TTable]['columns'] & string>(
package/dist/orm.d.ts CHANGED
@@ -317,8 +317,8 @@ declare class ModelInstance<TDef extends ModelDefinition, TSelected extends Colu
317
317
  getAttribute<K extends TSelected>(key: K): K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown;
318
318
  getAttributes(): Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>;
319
319
  set<K extends ColumnName<TDef>>(key: K, value: K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown): void;
320
- only<K extends TSelected>(keys: ReadonlyArray<K>): Partial<ModelAttributes<TDef>>;
321
- except<K extends TSelected>(keys: ReadonlyArray<K>): Partial<ModelAttributes<TDef>>;
320
+ only<K extends TSelected>(keys: ReadonlyArray<K>): Pick<ModelAttributes<TDef>, K & keyof ModelAttributes<TDef>>;
321
+ except<K extends TSelected>(keys: ReadonlyArray<K>): Omit<Pick<ModelAttributes<TDef>, TSelected & keyof ModelAttributes<TDef>>, K>;
322
322
  getRelation<R extends InferRelationNames<TDef> & string>(name: R): LoadedRelationValue<TDef, R>;
323
323
  setRelation(name: string, data: ModelInstance<any, any>[] | ModelInstance<any, any> | null): void;
324
324
  getLoadedRelations(): Record<string, ModelInstance<any, any>[] | ModelInstance<any, any> | null>;
@@ -440,8 +440,8 @@ declare class ModelQueryBuilder<TDef extends ModelDefinition, TSelected extends
440
440
  to: number | null
441
441
  }>;
442
442
  pluck<K extends ColumnName<TDef>>(column: K): Promise<(K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : unknown)[]>;
443
- max<K extends ColumnName<TDef>>(column: K): Promise<number | null>;
444
- min<K extends ColumnName<TDef>>(column: K): Promise<number | null>;
443
+ max<K extends ColumnName<TDef>>(column: K): Promise<(K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : number) | null>;
444
+ min<K extends ColumnName<TDef>>(column: K): Promise<(K extends keyof ModelAttributes<TDef> ? ModelAttributes<TDef>[K] : number) | null>;
445
445
  avg<K extends NumericColumns<TDef>>(column: K): Promise<number>;
446
446
  sum<K extends NumericColumns<TDef>>(column: K): Promise<number>;
447
447
  delete(): Promise<number>;
package/dist/src/index.js CHANGED
@@ -25203,7 +25203,14 @@ class ModelQueryBuilder {
25203
25203
  sql2 += ` WHERE ${whereBody}`;
25204
25204
  }
25205
25205
  const row = await exec.get(sql2, params);
25206
- return row?.v == null ? null : Number(row.v);
25206
+ const v2 = row?.v;
25207
+ if (v2 == null)
25208
+ return null;
25209
+ if (typeof v2 === "string") {
25210
+ const n2 = Number(v2);
25211
+ return v2.trim() !== "" && !Number.isNaN(n2) ? n2 : v2;
25212
+ }
25213
+ return v2;
25207
25214
  }
25208
25215
  max(column) {
25209
25216
  return this.aggregate("MAX", column);
@@ -25212,10 +25219,10 @@ class ModelQueryBuilder {
25212
25219
  return this.aggregate("MIN", column);
25213
25220
  }
25214
25221
  async avg(column) {
25215
- return await this.aggregate("AVG", column) || 0;
25222
+ return Number(await this.aggregate("AVG", column) ?? 0) || 0;
25216
25223
  }
25217
25224
  async sum(column) {
25218
- return await this.aggregate("SUM", column) || 0;
25225
+ return Number(await this.aggregate("SUM", column) ?? 0) || 0;
25219
25226
  }
25220
25227
  async delete() {
25221
25228
  const exec = getExecutor();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bun-query-builder",
3
3
  "type": "module",
4
- "version": "0.1.28",
4
+ "version": "0.1.29",
5
5
  "description": "A simple yet performant query builder for TypeScript. Built with Bun.",
6
6
  "author": "Chris Breuer <chris@stacksjs.org>",
7
7
  "license": "MIT",