workers-qb 1.7.0 → 1.9.0

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/README.md CHANGED
@@ -19,14 +19,16 @@ Currently, 3 databases are supported:
19
19
 
20
20
  ## Features
21
21
 
22
- - [x] Zero dependencies.
22
+ - [x] Zero dependencies
23
23
  - [x] Fully typed/TypeScript support
24
+ - [x] [Migrations](https://workers-qb.massadas.com/migrations/)
24
25
  - [x] [Type Checks for data read](https://workers-qb.massadas.com/type-check/)
25
26
  - [x] [Create/drop tables](https://workers-qb.massadas.com/basic-queries/#dropping-and-creating-tables)
26
27
  - [x] [Insert/Bulk Inserts/Update/Select/Delete/Join queries](https://workers-qb.massadas.com/basic-queries/)
27
- - [x] [Modular selects](https://workers-qb.massadas.com/modular-selects/)
28
+ - [x] [Modular selects](https://workers-qb.massadas.com/modular-selects/) (qb.select(...).where(...).where(...).one())
28
29
  - [x] [On Conflict for Inserts and Updates](https://workers-qb.massadas.com/advanced-queries/onConflict/)
29
30
  - [x] [Upsert](https://workers-qb.massadas.com/advanced-queries/upsert/)
31
+ - [x] Lazy Load Rows
30
32
 
31
33
  ## Installation
32
34
 
@@ -40,7 +42,7 @@ npm install workers-qb --save
40
42
  import { D1QB } from 'workers-qb'
41
43
 
42
44
  export interface Env {
43
- DB: any
45
+ DB: D1Database
44
46
  }
45
47
 
46
48
  export default {
@@ -65,7 +67,7 @@ export default {
65
67
  .execute()
66
68
 
67
69
  // Or in a modular approach
68
- const employeeList = await qb.select<Employee>('employees').where('active = ?', true).execute()
70
+ const employeeListModular = await qb.select<Employee>('employees').where('active = ?', true).execute()
69
71
 
70
72
  // You get IDE type hints on each employee data, like:
71
73
  // employeeList.results[0].name
@@ -77,6 +79,26 @@ export default {
77
79
  }
78
80
  ```
79
81
 
82
+ ## Example for Cloudflare Durable Objects
83
+
84
+ ```ts
85
+ import { DOQB } from 'workers-qb'
86
+
87
+ export class DOSRS extends DurableObject {
88
+ getEmployees() {
89
+ const qb = new DOQB(this.ctx.storage.sql)
90
+
91
+ const fetched = qb
92
+ .fetchAll({
93
+ tableName: 'employees',
94
+ })
95
+ .execute()
96
+
97
+ return fetched.results
98
+ }
99
+ }
100
+ ```
101
+
80
102
  ## Example for Cloudflare Workers with PostgreSQL
81
103
 
82
104
  Remember to close the connection using `ctx.waitUntil(qb.close());` or `await qb.close();` at the end of your request.
package/dist/index.d.mts CHANGED
@@ -95,8 +95,9 @@ type RawQueryFetchAll = Omit<RawQuery, 'fetchType'> & {
95
95
  fetchType: FetchTypes.ALL;
96
96
  };
97
97
  type RawQueryWithoutFetching = Omit<RawQuery, 'fetchType'>;
98
- type SelectAll = SelectOne & {
98
+ type SelectAll<IsLazy extends true | undefined = undefined> = SelectOne & {
99
99
  limit?: number;
100
+ lazy?: IsLazy;
100
101
  };
101
102
  type ConflictUpsert = {
102
103
  column: string | Array<string>;
@@ -165,9 +166,17 @@ type PGResult = {
165
166
  lastRowId?: string | number;
166
167
  rowCount: number;
167
168
  };
168
- type ArrayResult<ResultWrapper, Result> = Merge<ResultWrapper, {
169
+ type IterableResult<ResultWrapper, Result, IsAsync extends boolean, IsLazy extends true | undefined = undefined> = IsLazy extends true ? IsAsync extends true ? Promise<Merge<ResultWrapper, {
170
+ results?: AsyncIterable<Result>;
171
+ }>> : Merge<ResultWrapper, {
172
+ results?: Iterable<Result>;
173
+ }> : never;
174
+ type FullArrayResult<ResultWrapper, Result, IsAsync extends boolean, IsLazy extends true | undefined = undefined> = IsLazy extends undefined ? IsAsync extends true ? Promise<Merge<ResultWrapper, {
169
175
  results?: Array<Result>;
170
- }>;
176
+ }>> : Merge<ResultWrapper, {
177
+ results?: Array<Result>;
178
+ }> : never;
179
+ type ArrayResult<ResultWrapper, Result, IsAsync extends boolean, IsLazy extends true | undefined = undefined> = IterableResult<ResultWrapper, Result, IsAsync, IsLazy> | FullArrayResult<ResultWrapper, Result, IsAsync, IsLazy>;
171
180
  type OneResult<ResultWrapper, Result> = Merge<ResultWrapper, {
172
181
  results?: Result;
173
182
  }>;
@@ -182,6 +191,9 @@ declare function defaultLogger(query: RawQuery, meta: QueryLoggerMeta): any;
182
191
  declare function asyncLoggerWrapper<Async extends boolean = true>(query: Query<any, Async> | Query<any, Async>[], loggerFunction: CallableFunction | undefined, innerFunction: () => any): Promise<any>;
183
192
  declare function syncLoggerWrapper<Async extends boolean = false>(query: Query<any, Async> | Query<any, Async>[], loggerFunction: CallableFunction | undefined, innerFunction: () => any): any;
184
193
 
194
+ interface SelectExecuteOptions<IsLazy extends true | undefined> {
195
+ lazy?: IsLazy;
196
+ }
185
197
  declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnObject, IsAsync extends boolean = true> {
186
198
  _debugger: boolean;
187
199
  _options: Partial<SelectAll>;
@@ -192,6 +204,7 @@ declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnO
192
204
  tableName(tableName: SelectAll['tableName']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
193
205
  fields(fields: SelectAll['fields']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
194
206
  where(conditions: string | Array<string>, params?: Primitive | Primitive[]): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
207
+ whereIn<T extends string | Array<string>, P extends T extends Array<string> ? Primitive[][] : Primitive[]>(fields: T, values: P): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
195
208
  join(join: SelectAll['join']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
196
209
  groupBy(groupBy: SelectAll['groupBy']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
197
210
  having(having: SelectAll['having']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
@@ -199,10 +212,10 @@ declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnO
199
212
  offset(offset: SelectAll['offset']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
200
213
  limit(limit: SelectAll['limit']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
201
214
  _parseArray(fieldName: string, option: any, value: any): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
202
- getQueryAll(): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
215
+ getQueryAll<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>, IsAsync>;
203
216
  getQueryOne(): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
204
- execute(): MaybeAsync<IsAsync, ArrayResult<GenericResultWrapper, GenericResult>>;
205
- all(): MaybeAsync<IsAsync, ArrayResult<GenericResultWrapper, GenericResult>>;
217
+ execute<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>;
218
+ all<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>;
206
219
  one(): MaybeAsync<IsAsync, OneResult<GenericResultWrapper, GenericResult>>;
207
220
  count(): MaybeAsync<IsAsync, CountResult<GenericResultWrapper>>;
208
221
  }
@@ -214,27 +227,28 @@ declare class QueryBuilder<GenericResultWrapper, IsAsync extends boolean = true>
214
227
  setDebugger(state: boolean): void;
215
228
  execute(query: Query<any, IsAsync>): MaybeAsync<IsAsync, any>;
216
229
  batchExecute(queryArray: Query<any, IsAsync>[]): MaybeAsync<IsAsync, any[]>;
230
+ lazyExecute(query: Query<any, IsAsync>): IsAsync extends true ? Promise<AsyncIterable<any>> : Iterable<any>;
217
231
  createTable<GenericResult = undefined>(params: {
218
232
  tableName: string;
219
233
  schema: string;
220
234
  ifNotExists?: boolean;
221
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
235
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
222
236
  dropTable<GenericResult = undefined>(params: {
223
237
  tableName: string;
224
238
  ifExists?: boolean;
225
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
239
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
226
240
  select<GenericResult = DefaultReturnObject>(tableName: string): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
227
241
  fetchOne<GenericResult = DefaultReturnObject>(params: SelectOne): QueryWithExtra<GenericResultWrapper, OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
228
- fetchAll<GenericResult = DefaultReturnObject>(params: SelectAll): QueryWithExtra<GenericResultWrapper, ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
242
+ fetchAll<GenericResult = DefaultReturnObject, IsLazy extends true | undefined = undefined>(params: SelectAll<IsLazy>): QueryWithExtra<GenericResultWrapper, ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>, IsAsync>;
229
243
  raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
230
- raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
244
+ raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
231
245
  raw<GenericResult = DefaultReturnObject>(params: RawQueryWithoutFetching): Query<GenericResultWrapper, IsAsync>;
232
246
  insert<GenericResult = DefaultReturnObject>(params: InsertOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
233
- insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
247
+ insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
234
248
  insert<GenericResult = DefaultReturnObject>(params: InsertWithoutReturning): Query<GenericResultWrapper, IsAsync>;
235
- update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
249
+ update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
236
250
  update<GenericResult = DefaultReturnObject>(params: UpdateWithoutReturning): Query<GenericResultWrapper, IsAsync>;
237
- delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
251
+ delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
238
252
  delete<GenericResult = DefaultReturnObject>(params: DeleteWithoutReturning): Query<GenericResultWrapper, IsAsync>;
239
253
  protected _parse_arguments(row: DefaultObject): Array<any>;
240
254
  protected _onConflict(resolution?: string | ConflictTypes | ConflictUpsert): string;
@@ -311,6 +325,7 @@ declare class DOQB extends QueryBuilder<{}, false> {
311
325
  constructor(db: any, options?: QueryBuilderOptions<false>);
312
326
  migrations(options: MigrationOptions): syncMigrationsBuilder<{}>;
313
327
  execute(query: Query<any, false>): any;
328
+ lazyExecute(query: Query<any, false>): Iterable<any>;
314
329
  }
315
330
 
316
- export { type ArrayResult, type AsyncType, ConflictTypes, type ConflictUpsert, type CountResult, type D1Meta, D1QB, type D1Result, DOQB, type DefaultObject, type DefaultReturnObject, type Delete, type DeleteReturning, type DeleteWithoutReturning, FetchTypes, type Insert, type InsertMultiple, type InsertOne, type InsertWithoutReturning, type Join, JoinTypes, type MaybeAsync, type Migration, type MigrationEntry, type MigrationOptions, type OneResult, OrderTypes, PGQB, type PGResult, type Primitive, Query, QueryBuilder, type QueryBuilderOptions, type QueryLoggerMeta, QueryWithExtra, Raw, type RawQuery, type RawQueryFetchAll, type RawQueryFetchOne, type RawQueryWithoutFetching, type SelectAll, type SelectOne, type SyncType, type Update, type UpdateReturning, type UpdateWithoutReturning, type Where, asyncLoggerWrapper, asyncMigrationsBuilder, defaultLogger, syncLoggerWrapper, syncMigrationsBuilder, type test, trimQuery };
331
+ export { type ArrayResult, type AsyncType, ConflictTypes, type ConflictUpsert, type CountResult, type D1Meta, D1QB, type D1Result, DOQB, type DefaultObject, type DefaultReturnObject, type Delete, type DeleteReturning, type DeleteWithoutReturning, FetchTypes, type FullArrayResult, type Insert, type InsertMultiple, type InsertOne, type InsertWithoutReturning, type IterableResult, type Join, JoinTypes, type MaybeAsync, type Migration, type MigrationEntry, type MigrationOptions, type OneResult, OrderTypes, PGQB, type PGResult, type Primitive, Query, QueryBuilder, type QueryBuilderOptions, type QueryLoggerMeta, QueryWithExtra, Raw, type RawQuery, type RawQueryFetchAll, type RawQueryFetchOne, type RawQueryWithoutFetching, type SelectAll, type SelectOne, type SyncType, type Update, type UpdateReturning, type UpdateWithoutReturning, type Where, asyncLoggerWrapper, asyncMigrationsBuilder, defaultLogger, syncLoggerWrapper, syncMigrationsBuilder, type test, trimQuery };
package/dist/index.d.ts CHANGED
@@ -95,8 +95,9 @@ type RawQueryFetchAll = Omit<RawQuery, 'fetchType'> & {
95
95
  fetchType: FetchTypes.ALL;
96
96
  };
97
97
  type RawQueryWithoutFetching = Omit<RawQuery, 'fetchType'>;
98
- type SelectAll = SelectOne & {
98
+ type SelectAll<IsLazy extends true | undefined = undefined> = SelectOne & {
99
99
  limit?: number;
100
+ lazy?: IsLazy;
100
101
  };
101
102
  type ConflictUpsert = {
102
103
  column: string | Array<string>;
@@ -165,9 +166,17 @@ type PGResult = {
165
166
  lastRowId?: string | number;
166
167
  rowCount: number;
167
168
  };
168
- type ArrayResult<ResultWrapper, Result> = Merge<ResultWrapper, {
169
+ type IterableResult<ResultWrapper, Result, IsAsync extends boolean, IsLazy extends true | undefined = undefined> = IsLazy extends true ? IsAsync extends true ? Promise<Merge<ResultWrapper, {
170
+ results?: AsyncIterable<Result>;
171
+ }>> : Merge<ResultWrapper, {
172
+ results?: Iterable<Result>;
173
+ }> : never;
174
+ type FullArrayResult<ResultWrapper, Result, IsAsync extends boolean, IsLazy extends true | undefined = undefined> = IsLazy extends undefined ? IsAsync extends true ? Promise<Merge<ResultWrapper, {
169
175
  results?: Array<Result>;
170
- }>;
176
+ }>> : Merge<ResultWrapper, {
177
+ results?: Array<Result>;
178
+ }> : never;
179
+ type ArrayResult<ResultWrapper, Result, IsAsync extends boolean, IsLazy extends true | undefined = undefined> = IterableResult<ResultWrapper, Result, IsAsync, IsLazy> | FullArrayResult<ResultWrapper, Result, IsAsync, IsLazy>;
171
180
  type OneResult<ResultWrapper, Result> = Merge<ResultWrapper, {
172
181
  results?: Result;
173
182
  }>;
@@ -182,6 +191,9 @@ declare function defaultLogger(query: RawQuery, meta: QueryLoggerMeta): any;
182
191
  declare function asyncLoggerWrapper<Async extends boolean = true>(query: Query<any, Async> | Query<any, Async>[], loggerFunction: CallableFunction | undefined, innerFunction: () => any): Promise<any>;
183
192
  declare function syncLoggerWrapper<Async extends boolean = false>(query: Query<any, Async> | Query<any, Async>[], loggerFunction: CallableFunction | undefined, innerFunction: () => any): any;
184
193
 
194
+ interface SelectExecuteOptions<IsLazy extends true | undefined> {
195
+ lazy?: IsLazy;
196
+ }
185
197
  declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnObject, IsAsync extends boolean = true> {
186
198
  _debugger: boolean;
187
199
  _options: Partial<SelectAll>;
@@ -192,6 +204,7 @@ declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnO
192
204
  tableName(tableName: SelectAll['tableName']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
193
205
  fields(fields: SelectAll['fields']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
194
206
  where(conditions: string | Array<string>, params?: Primitive | Primitive[]): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
207
+ whereIn<T extends string | Array<string>, P extends T extends Array<string> ? Primitive[][] : Primitive[]>(fields: T, values: P): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
195
208
  join(join: SelectAll['join']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
196
209
  groupBy(groupBy: SelectAll['groupBy']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
197
210
  having(having: SelectAll['having']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
@@ -199,10 +212,10 @@ declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnO
199
212
  offset(offset: SelectAll['offset']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
200
213
  limit(limit: SelectAll['limit']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
201
214
  _parseArray(fieldName: string, option: any, value: any): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
202
- getQueryAll(): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
215
+ getQueryAll<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>, IsAsync>;
203
216
  getQueryOne(): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
204
- execute(): MaybeAsync<IsAsync, ArrayResult<GenericResultWrapper, GenericResult>>;
205
- all(): MaybeAsync<IsAsync, ArrayResult<GenericResultWrapper, GenericResult>>;
217
+ execute<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>;
218
+ all<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>;
206
219
  one(): MaybeAsync<IsAsync, OneResult<GenericResultWrapper, GenericResult>>;
207
220
  count(): MaybeAsync<IsAsync, CountResult<GenericResultWrapper>>;
208
221
  }
@@ -214,27 +227,28 @@ declare class QueryBuilder<GenericResultWrapper, IsAsync extends boolean = true>
214
227
  setDebugger(state: boolean): void;
215
228
  execute(query: Query<any, IsAsync>): MaybeAsync<IsAsync, any>;
216
229
  batchExecute(queryArray: Query<any, IsAsync>[]): MaybeAsync<IsAsync, any[]>;
230
+ lazyExecute(query: Query<any, IsAsync>): IsAsync extends true ? Promise<AsyncIterable<any>> : Iterable<any>;
217
231
  createTable<GenericResult = undefined>(params: {
218
232
  tableName: string;
219
233
  schema: string;
220
234
  ifNotExists?: boolean;
221
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
235
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
222
236
  dropTable<GenericResult = undefined>(params: {
223
237
  tableName: string;
224
238
  ifExists?: boolean;
225
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
239
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
226
240
  select<GenericResult = DefaultReturnObject>(tableName: string): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
227
241
  fetchOne<GenericResult = DefaultReturnObject>(params: SelectOne): QueryWithExtra<GenericResultWrapper, OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
228
- fetchAll<GenericResult = DefaultReturnObject>(params: SelectAll): QueryWithExtra<GenericResultWrapper, ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
242
+ fetchAll<GenericResult = DefaultReturnObject, IsLazy extends true | undefined = undefined>(params: SelectAll<IsLazy>): QueryWithExtra<GenericResultWrapper, ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>, IsAsync>;
229
243
  raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
230
- raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
244
+ raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
231
245
  raw<GenericResult = DefaultReturnObject>(params: RawQueryWithoutFetching): Query<GenericResultWrapper, IsAsync>;
232
246
  insert<GenericResult = DefaultReturnObject>(params: InsertOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
233
- insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
247
+ insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
234
248
  insert<GenericResult = DefaultReturnObject>(params: InsertWithoutReturning): Query<GenericResultWrapper, IsAsync>;
235
- update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
249
+ update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
236
250
  update<GenericResult = DefaultReturnObject>(params: UpdateWithoutReturning): Query<GenericResultWrapper, IsAsync>;
237
- delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
251
+ delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
238
252
  delete<GenericResult = DefaultReturnObject>(params: DeleteWithoutReturning): Query<GenericResultWrapper, IsAsync>;
239
253
  protected _parse_arguments(row: DefaultObject): Array<any>;
240
254
  protected _onConflict(resolution?: string | ConflictTypes | ConflictUpsert): string;
@@ -311,6 +325,7 @@ declare class DOQB extends QueryBuilder<{}, false> {
311
325
  constructor(db: any, options?: QueryBuilderOptions<false>);
312
326
  migrations(options: MigrationOptions): syncMigrationsBuilder<{}>;
313
327
  execute(query: Query<any, false>): any;
328
+ lazyExecute(query: Query<any, false>): Iterable<any>;
314
329
  }
315
330
 
316
- export { type ArrayResult, type AsyncType, ConflictTypes, type ConflictUpsert, type CountResult, type D1Meta, D1QB, type D1Result, DOQB, type DefaultObject, type DefaultReturnObject, type Delete, type DeleteReturning, type DeleteWithoutReturning, FetchTypes, type Insert, type InsertMultiple, type InsertOne, type InsertWithoutReturning, type Join, JoinTypes, type MaybeAsync, type Migration, type MigrationEntry, type MigrationOptions, type OneResult, OrderTypes, PGQB, type PGResult, type Primitive, Query, QueryBuilder, type QueryBuilderOptions, type QueryLoggerMeta, QueryWithExtra, Raw, type RawQuery, type RawQueryFetchAll, type RawQueryFetchOne, type RawQueryWithoutFetching, type SelectAll, type SelectOne, type SyncType, type Update, type UpdateReturning, type UpdateWithoutReturning, type Where, asyncLoggerWrapper, asyncMigrationsBuilder, defaultLogger, syncLoggerWrapper, syncMigrationsBuilder, type test, trimQuery };
331
+ export { type ArrayResult, type AsyncType, ConflictTypes, type ConflictUpsert, type CountResult, type D1Meta, D1QB, type D1Result, DOQB, type DefaultObject, type DefaultReturnObject, type Delete, type DeleteReturning, type DeleteWithoutReturning, FetchTypes, type FullArrayResult, type Insert, type InsertMultiple, type InsertOne, type InsertWithoutReturning, type IterableResult, type Join, JoinTypes, type MaybeAsync, type Migration, type MigrationEntry, type MigrationOptions, type OneResult, OrderTypes, PGQB, type PGResult, type Primitive, Query, QueryBuilder, type QueryBuilderOptions, type QueryLoggerMeta, QueryWithExtra, Raw, type RawQuery, type RawQueryFetchAll, type RawQueryFetchOne, type RawQueryWithoutFetching, type SelectAll, type SelectOne, type SyncType, type Update, type UpdateReturning, type UpdateWithoutReturning, type Where, asyncLoggerWrapper, asyncMigrationsBuilder, defaultLogger, syncLoggerWrapper, syncMigrationsBuilder, type test, trimQuery };
package/dist/index.js CHANGED
@@ -160,6 +160,52 @@ var SelectBuilder = class _SelectBuilder {
160
160
  this._fetchOne
161
161
  );
162
162
  }
163
+ whereIn(fields, values) {
164
+ let whereInCondition;
165
+ let whereInParams;
166
+ const seperateWithComma = (prev, next) => prev + ", " + next;
167
+ if (values.length === 0) {
168
+ return new _SelectBuilder(
169
+ {
170
+ ...this._options
171
+ },
172
+ this._fetchAll,
173
+ this._fetchOne
174
+ );
175
+ }
176
+ if (!Array.isArray(fields)) {
177
+ whereInCondition = `(${fields}) IN (VALUES `;
178
+ whereInCondition += values.map(() => "(?)").reduce(seperateWithComma);
179
+ whereInCondition += ")";
180
+ whereInParams = values;
181
+ } else {
182
+ const fieldLength = fields.length;
183
+ whereInCondition = `(${fields.map((val) => val).reduce(seperateWithComma)}) IN (VALUES `;
184
+ const valuesString = `(${[...new Array(fieldLength).keys()].map(() => "?").reduce(seperateWithComma)})`;
185
+ whereInCondition += [...new Array(fieldLength).keys()].map(() => valuesString).reduce(seperateWithComma);
186
+ whereInCondition += ")";
187
+ whereInParams = values.flat();
188
+ }
189
+ let conditions = [whereInCondition];
190
+ let params = whereInParams;
191
+ if (this._options.where?.conditions) {
192
+ conditions = this._options.where?.conditions.concat(conditions);
193
+ }
194
+ if (this._options.where?.params) {
195
+ params = this._options.where?.params.concat(params);
196
+ }
197
+ return new _SelectBuilder(
198
+ {
199
+ ...this._options,
200
+ where: {
201
+ conditions,
202
+ params
203
+ }
204
+ },
205
+ this._fetchAll,
206
+ this._fetchOne
207
+ );
208
+ }
163
209
  join(join) {
164
210
  return this._parseArray("join", this._options.join, join);
165
211
  }
@@ -211,16 +257,16 @@ var SelectBuilder = class _SelectBuilder {
211
257
  this._fetchOne
212
258
  );
213
259
  }
214
- getQueryAll() {
260
+ getQueryAll(options) {
215
261
  return this._fetchAll(this._options);
216
262
  }
217
263
  getQueryOne() {
218
264
  return this._fetchOne(this._options);
219
265
  }
220
- execute() {
266
+ execute(options) {
221
267
  return this._fetchAll(this._options).execute();
222
268
  }
223
- all() {
269
+ all(options) {
224
270
  return this._fetchAll(this._options).execute();
225
271
  }
226
272
  one() {
@@ -300,6 +346,9 @@ var QueryBuilder = class {
300
346
  batchExecute(queryArray) {
301
347
  throw new Error("Batch execute method not implemented");
302
348
  }
349
+ lazyExecute(query) {
350
+ throw new Error("Execute lazyExecute not implemented");
351
+ }
303
352
  createTable(params) {
304
353
  return new Query(
305
354
  (q) => {
@@ -350,15 +399,16 @@ var QueryBuilder = class {
350
399
  fetchAll(params) {
351
400
  return new QueryWithExtra(
352
401
  (q) => {
353
- return this.execute(q);
402
+ return params.lazy ? this.lazyExecute(q) : this.execute(q);
354
403
  },
355
- this._select(params),
404
+ this._select({ ...params, lazy: void 0 }),
356
405
  this._select({
357
406
  ...params,
358
407
  fields: "count(*) as total",
359
408
  offset: void 0,
360
409
  groupBy: void 0,
361
- limit: 1
410
+ limit: 1,
411
+ lazy: void 0
362
412
  }),
363
413
  typeof params.where === "object" && !Array.isArray(params.where) && params.where?.params ? Array.isArray(params.where?.params) ? params.where?.params : [params.where?.params] : void 0,
364
414
  "ALL" /* ALL */
@@ -853,6 +903,17 @@ var DOQB = class extends QueryBuilder {
853
903
  };
854
904
  });
855
905
  }
906
+ lazyExecute(query) {
907
+ return this.loggerWrapper(query, this.options.logger, () => {
908
+ let cursor;
909
+ if (query.arguments) {
910
+ cursor = this.db.exec(query.query, ...query.arguments);
911
+ } else {
912
+ cursor = this.db.exec(query.query);
913
+ }
914
+ return cursor;
915
+ });
916
+ }
856
917
  };
857
918
  // Annotate the CommonJS export names for ESM import in node:
858
919
  0 && (module.exports = {
package/dist/index.mjs CHANGED
@@ -118,6 +118,52 @@ var SelectBuilder = class _SelectBuilder {
118
118
  this._fetchOne
119
119
  );
120
120
  }
121
+ whereIn(fields, values) {
122
+ let whereInCondition;
123
+ let whereInParams;
124
+ const seperateWithComma = (prev, next) => prev + ", " + next;
125
+ if (values.length === 0) {
126
+ return new _SelectBuilder(
127
+ {
128
+ ...this._options
129
+ },
130
+ this._fetchAll,
131
+ this._fetchOne
132
+ );
133
+ }
134
+ if (!Array.isArray(fields)) {
135
+ whereInCondition = `(${fields}) IN (VALUES `;
136
+ whereInCondition += values.map(() => "(?)").reduce(seperateWithComma);
137
+ whereInCondition += ")";
138
+ whereInParams = values;
139
+ } else {
140
+ const fieldLength = fields.length;
141
+ whereInCondition = `(${fields.map((val) => val).reduce(seperateWithComma)}) IN (VALUES `;
142
+ const valuesString = `(${[...new Array(fieldLength).keys()].map(() => "?").reduce(seperateWithComma)})`;
143
+ whereInCondition += [...new Array(fieldLength).keys()].map(() => valuesString).reduce(seperateWithComma);
144
+ whereInCondition += ")";
145
+ whereInParams = values.flat();
146
+ }
147
+ let conditions = [whereInCondition];
148
+ let params = whereInParams;
149
+ if (this._options.where?.conditions) {
150
+ conditions = this._options.where?.conditions.concat(conditions);
151
+ }
152
+ if (this._options.where?.params) {
153
+ params = this._options.where?.params.concat(params);
154
+ }
155
+ return new _SelectBuilder(
156
+ {
157
+ ...this._options,
158
+ where: {
159
+ conditions,
160
+ params
161
+ }
162
+ },
163
+ this._fetchAll,
164
+ this._fetchOne
165
+ );
166
+ }
121
167
  join(join) {
122
168
  return this._parseArray("join", this._options.join, join);
123
169
  }
@@ -169,16 +215,16 @@ var SelectBuilder = class _SelectBuilder {
169
215
  this._fetchOne
170
216
  );
171
217
  }
172
- getQueryAll() {
218
+ getQueryAll(options) {
173
219
  return this._fetchAll(this._options);
174
220
  }
175
221
  getQueryOne() {
176
222
  return this._fetchOne(this._options);
177
223
  }
178
- execute() {
224
+ execute(options) {
179
225
  return this._fetchAll(this._options).execute();
180
226
  }
181
- all() {
227
+ all(options) {
182
228
  return this._fetchAll(this._options).execute();
183
229
  }
184
230
  one() {
@@ -258,6 +304,9 @@ var QueryBuilder = class {
258
304
  batchExecute(queryArray) {
259
305
  throw new Error("Batch execute method not implemented");
260
306
  }
307
+ lazyExecute(query) {
308
+ throw new Error("Execute lazyExecute not implemented");
309
+ }
261
310
  createTable(params) {
262
311
  return new Query(
263
312
  (q) => {
@@ -308,15 +357,16 @@ var QueryBuilder = class {
308
357
  fetchAll(params) {
309
358
  return new QueryWithExtra(
310
359
  (q) => {
311
- return this.execute(q);
360
+ return params.lazy ? this.lazyExecute(q) : this.execute(q);
312
361
  },
313
- this._select(params),
362
+ this._select({ ...params, lazy: void 0 }),
314
363
  this._select({
315
364
  ...params,
316
365
  fields: "count(*) as total",
317
366
  offset: void 0,
318
367
  groupBy: void 0,
319
- limit: 1
368
+ limit: 1,
369
+ lazy: void 0
320
370
  }),
321
371
  typeof params.where === "object" && !Array.isArray(params.where) && params.where?.params ? Array.isArray(params.where?.params) ? params.where?.params : [params.where?.params] : void 0,
322
372
  "ALL" /* ALL */
@@ -811,6 +861,17 @@ var DOQB = class extends QueryBuilder {
811
861
  };
812
862
  });
813
863
  }
864
+ lazyExecute(query) {
865
+ return this.loggerWrapper(query, this.options.logger, () => {
866
+ let cursor;
867
+ if (query.arguments) {
868
+ cursor = this.db.exec(query.query, ...query.arguments);
869
+ } else {
870
+ cursor = this.db.exec(query.query);
871
+ }
872
+ return cursor;
873
+ });
874
+ }
814
875
  };
815
876
  export {
816
877
  ConflictTypes,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workers-qb",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "Zero dependencies Query Builder for Cloudflare Workers",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -14,7 +14,7 @@
14
14
  "build": "tsup src/index.ts --format cjs,esm --dts",
15
15
  "lint": "npx @biomejs/biome check src/ tests/ || (npx @biomejs/biome check --write src/ tests/; exit 1)",
16
16
  "test": "vitest run --root tests",
17
- "prepare": "husky install"
17
+ "prepare": "husky"
18
18
  },
19
19
  "publishConfig": {
20
20
  "access": "public"
@@ -57,12 +57,12 @@
57
57
  },
58
58
  "devDependencies": {
59
59
  "@biomejs/biome": "1.9.4",
60
- "@cloudflare/vitest-pool-workers": "^0.5.26",
60
+ "@cloudflare/vitest-pool-workers": "^0.6.0",
61
61
  "@cloudflare/workers-types": "^4.20241106.0",
62
62
  "husky": "^9.1.6",
63
63
  "tsup": "^8.3.5",
64
64
  "typescript": "^5.6.3",
65
- "vitest": "2.0.5",
65
+ "vitest": "2.1.8",
66
66
  "wrangler": "^3.86.0"
67
67
  }
68
68
  }