workers-qb 1.8.0 → 1.10.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
@@ -1,43 +1,69 @@
1
- # workers-qb
1
+ <div align="center">
2
+ <h1>workers-qb</h1>
3
+ <p><em>Zero-dependency Query Builder for Cloudflare Workers</em></p>
2
4
 
3
- ### [Read the documentation here!](https://workers-qb.massadas.com/)
5
+ <p>
6
+ <a href="https://workers-qb.massadas.com/" target="_blank">
7
+ <img src="https://img.shields.io/badge/docs-workers--qb-blue.svg" alt="Documentation">
8
+ </a>
9
+ <a href="https://www.npmjs.com/package/workers-qb" target="_blank">
10
+ <img src="https://img.shields.io/npm/v/workers-qb.svg" alt="npm version">
11
+ </a>
12
+ <a href="https://github.com/G4brym/workers-qb/blob/main/LICENSE" target="_blank">
13
+ <img src="https://img.shields.io/badge/license-MIT-brightgreen.svg" alt="Software License">
14
+ </a>
15
+ </p>
16
+ </div>
4
17
 
5
- Zero dependencies Query Builder for [Cloudflare Workers](https://developers.cloudflare.com/workers/)
18
+ ## Overview
6
19
 
7
- This module provides a simple standardized interface while keeping the benefits and speed of using raw queries over a
8
- traditional ORM.
20
+ workers-qb is a lightweight query builder designed specifically for Cloudflare Workers. It provides a simple, standardized interface while maintaining the performance benefits of raw queries over traditional ORMs.
9
21
 
10
- `workers-qb` is not intended to provide ORM-like functionality, rather to make it easier to interact with the database
11
- from code for direct SQL access using convenient wrapper methods.
22
+ 📚 [Read the full documentation](https://workers-qb.massadas.com/)
12
23
 
13
- Currently, 3 databases are supported:
24
+ ### Key Differences from ORMs
14
25
 
15
- - [Cloudflare D1](https://workers-qb.massadas.com/databases/cloudflare-d1/)
16
- - [Cloudflare Durable Objects](https://workers-qb.massadas.com/databases/cloudflare-do/)
17
- - [PostgreSQL (using node-postgres)](https://workers-qb.massadas.com/databases/postgresql/)
18
- - [Bring your own Database](https://workers-qb.massadas.com/databases/bring-your-own-database/)
26
+ - Focused on direct SQL access with convenient wrapper methods
27
+ - Maintains raw query performance
28
+ - Zero dependencies
29
+ - Lightweight and Worker-optimized
30
+
31
+ ## Supported Databases
32
+
33
+ - ☁️ [Cloudflare D1](https://workers-qb.massadas.com/databases/cloudflare-d1/)
34
+ - 💾 [Cloudflare Durable Objects](https://workers-qb.massadas.com/databases/cloudflare-do/)
35
+ - 🐘 [PostgreSQL (via node-postgres)](https://workers-qb.massadas.com/databases/postgresql/)
36
+ - 🔌 [Bring Your Own Database](https://workers-qb.massadas.com/databases/bring-your-own-database/)
19
37
 
20
38
  ## Features
21
39
 
22
- - [x] Zero dependencies
23
- - [x] Fully typed/TypeScript support
24
- - [x] [Migrations](https://workers-qb.massadas.com/migrations/)
25
- - [x] [Type Checks for data read](https://workers-qb.massadas.com/type-check/)
26
- - [x] [Create/drop tables](https://workers-qb.massadas.com/basic-queries/#dropping-and-creating-tables)
27
- - [x] [Insert/Bulk Inserts/Update/Select/Delete/Join queries](https://workers-qb.massadas.com/basic-queries/)
28
- - [x] [Modular selects](https://workers-qb.massadas.com/modular-selects/) (qb.select(...).where(...).where(...).one())
29
- - [x] [On Conflict for Inserts and Updates](https://workers-qb.massadas.com/advanced-queries/onConflict/)
30
- - [x] [Upsert](https://workers-qb.massadas.com/advanced-queries/upsert/)
40
+ ### Core Features
41
+ - Zero dependencies
42
+ - Full TypeScript support
43
+ - Database schema migrations
44
+ - Type checking for data reads
45
+ - Lazy row loading
46
+
47
+ ### Query Operations
48
+ - Table operations (create/drop)
49
+ - CRUD operations (insert/update/select/delete)
50
+ - Bulk inserts
51
+ - JOIN queries
52
+ - Modular SELECT queries
53
+ - ON CONFLICT handling
54
+ - UPSERT support
31
55
 
32
56
  ## Installation
33
57
 
34
- ```
58
+ ```bash
35
59
  npm install workers-qb --save
36
60
  ```
37
61
 
38
- ## Example for Cloudflare Workers D1
62
+ ## Usage Examples
63
+
64
+ ### Cloudflare D1
39
65
 
40
- ```ts
66
+ ```typescript
41
67
  import { D1QB } from 'workers-qb'
42
68
 
43
69
  export interface Env {
@@ -54,7 +80,7 @@ export default {
54
80
  level: number
55
81
  }
56
82
 
57
- // Generated query: SELECT * FROM employees WHERE active = ?1
83
+ // Using object syntax
58
84
  const employeeList = await qb
59
85
  .fetchAll<Employee>({
60
86
  tableName: 'employees',
@@ -65,11 +91,11 @@ export default {
65
91
  })
66
92
  .execute()
67
93
 
68
- // Or in a modular approach
69
- const employeeListModular = await qb.select<Employee>('employees').where('active = ?', true).execute()
70
-
71
- // You get IDE type hints on each employee data, like:
72
- // employeeList.results[0].name
94
+ // Using method chaining
95
+ const employeeListModular = await qb
96
+ .select<Employee>('employees')
97
+ .where('active = ?', true)
98
+ .execute()
73
99
 
74
100
  return Response.json({
75
101
  activeEmployees: employeeList.results?.length || 0,
@@ -78,41 +104,39 @@ export default {
78
104
  }
79
105
  ```
80
106
 
81
- ## Example for Cloudflare Durable Objects
107
+ ### Cloudflare Durable Objects
82
108
 
83
- ```ts
109
+ ```typescript
84
110
  import { DOQB } from 'workers-qb'
85
111
 
86
112
  export class DOSRS extends DurableObject {
87
113
  getEmployees() {
88
114
  const qb = new DOQB(this.ctx.storage.sql)
89
-
90
- const fetched = qb
115
+
116
+ return qb
91
117
  .fetchAll({
92
118
  tableName: 'employees',
93
119
  })
94
120
  .execute()
95
-
96
- return fetched.results
121
+ .results
97
122
  }
98
123
  }
99
124
  ```
100
125
 
101
- ## Example for Cloudflare Workers with PostgreSQL
102
-
103
- Remember to close the connection using `ctx.waitUntil(qb.close());` or `await qb.close();` at the end of your request.
104
- You may also reuse this connection to execute multiple queries, or share it between multiple requests if you are using
105
- a connection pool in front of your PostgreSQL.
106
-
107
- You must also enable `node_compat = true` in your `wrangler.toml`
108
-
109
- You need to install `node-postgres`:
126
+ ### PostgreSQL Integration
110
127
 
128
+ First, install the required PostgreSQL client:
111
129
  ```bash
112
130
  npm install pg --save
113
131
  ```
114
132
 
115
- ```ts
133
+ Enable Node compatibility in `wrangler.toml`:
134
+ ```toml
135
+ node_compat = true
136
+ ```
137
+
138
+ Example usage:
139
+ ```typescript
116
140
  import { PGQB } from 'workers-qb'
117
141
  import { Client } from 'pg'
118
142
 
@@ -125,7 +149,6 @@ export default {
125
149
  const qb = new PGQB(new Client(env.DB_URL))
126
150
  await qb.connect()
127
151
 
128
- // Generated query: SELECT count(*) as count FROM employees WHERE active = ?1 LIMIT 1
129
152
  const fetched = await qb
130
153
  .fetchOne({
131
154
  tableName: 'employees',
@@ -137,10 +160,30 @@ export default {
137
160
  })
138
161
  .execute()
139
162
 
163
+ // Important: Close the connection
140
164
  ctx.waitUntil(qb.close())
165
+
141
166
  return Response.json({
142
167
  activeEmployees: fetched.results?.count || 0,
143
168
  })
144
169
  },
145
170
  }
146
171
  ```
172
+
173
+ ## Documentation
174
+
175
+ Visit our [comprehensive documentation](https://workers-qb.massadas.com/) for detailed information about:
176
+
177
+ - [Basic Queries](https://workers-qb.massadas.com/basic-queries/)
178
+ - [Advanced Queries](https://workers-qb.massadas.com/advanced-queries/)
179
+ - [Migrations](https://workers-qb.massadas.com/migrations/)
180
+ - [Type Checking](https://workers-qb.massadas.com/type-check/)
181
+ - [Database-specific guides](https://workers-qb.massadas.com/databases/)
182
+
183
+ ## Contributing
184
+
185
+ Contributions are welcome! Please feel free to submit a Pull Request.
186
+
187
+ ## License
188
+
189
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
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>;
@@ -200,10 +212,10 @@ declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnO
200
212
  offset(offset: SelectAll['offset']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
201
213
  limit(limit: SelectAll['limit']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
202
214
  _parseArray(fieldName: string, option: any, value: any): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
203
- getQueryAll(): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
215
+ getQueryAll<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>, IsAsync>;
204
216
  getQueryOne(): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
205
- execute(): MaybeAsync<IsAsync, ArrayResult<GenericResultWrapper, GenericResult>>;
206
- 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>;
207
219
  one(): MaybeAsync<IsAsync, OneResult<GenericResultWrapper, GenericResult>>;
208
220
  count(): MaybeAsync<IsAsync, CountResult<GenericResultWrapper>>;
209
221
  }
@@ -215,27 +227,28 @@ declare class QueryBuilder<GenericResultWrapper, IsAsync extends boolean = true>
215
227
  setDebugger(state: boolean): void;
216
228
  execute(query: Query<any, IsAsync>): MaybeAsync<IsAsync, any>;
217
229
  batchExecute(queryArray: Query<any, IsAsync>[]): MaybeAsync<IsAsync, any[]>;
230
+ lazyExecute(query: Query<any, IsAsync>): IsAsync extends true ? Promise<AsyncIterable<any>> : Iterable<any>;
218
231
  createTable<GenericResult = undefined>(params: {
219
232
  tableName: string;
220
233
  schema: string;
221
234
  ifNotExists?: boolean;
222
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
235
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
223
236
  dropTable<GenericResult = undefined>(params: {
224
237
  tableName: string;
225
238
  ifExists?: boolean;
226
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
239
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
227
240
  select<GenericResult = DefaultReturnObject>(tableName: string): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
228
241
  fetchOne<GenericResult = DefaultReturnObject>(params: SelectOne): QueryWithExtra<GenericResultWrapper, OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
229
- 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>;
230
243
  raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
231
- raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
244
+ raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
232
245
  raw<GenericResult = DefaultReturnObject>(params: RawQueryWithoutFetching): Query<GenericResultWrapper, IsAsync>;
233
246
  insert<GenericResult = DefaultReturnObject>(params: InsertOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
234
- insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
247
+ insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
235
248
  insert<GenericResult = DefaultReturnObject>(params: InsertWithoutReturning): Query<GenericResultWrapper, IsAsync>;
236
- update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
249
+ update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
237
250
  update<GenericResult = DefaultReturnObject>(params: UpdateWithoutReturning): Query<GenericResultWrapper, IsAsync>;
238
- delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
251
+ delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
239
252
  delete<GenericResult = DefaultReturnObject>(params: DeleteWithoutReturning): Query<GenericResultWrapper, IsAsync>;
240
253
  protected _parse_arguments(row: DefaultObject): Array<any>;
241
254
  protected _onConflict(resolution?: string | ConflictTypes | ConflictUpsert): string;
@@ -312,6 +325,7 @@ declare class DOQB extends QueryBuilder<{}, false> {
312
325
  constructor(db: any, options?: QueryBuilderOptions<false>);
313
326
  migrations(options: MigrationOptions): syncMigrationsBuilder<{}>;
314
327
  execute(query: Query<any, false>): any;
328
+ lazyExecute(query: Query<any, false>): Iterable<any>;
315
329
  }
316
330
 
317
- 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>;
@@ -200,10 +212,10 @@ declare class SelectBuilder<GenericResultWrapper, GenericResult = DefaultReturnO
200
212
  offset(offset: SelectAll['offset']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
201
213
  limit(limit: SelectAll['limit']): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
202
214
  _parseArray(fieldName: string, option: any, value: any): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
203
- getQueryAll(): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
215
+ getQueryAll<IsLazy extends true | undefined = undefined>(options?: SelectExecuteOptions<IsLazy>): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync, IsLazy>, IsAsync>;
204
216
  getQueryOne(): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
205
- execute(): MaybeAsync<IsAsync, ArrayResult<GenericResultWrapper, GenericResult>>;
206
- 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>;
207
219
  one(): MaybeAsync<IsAsync, OneResult<GenericResultWrapper, GenericResult>>;
208
220
  count(): MaybeAsync<IsAsync, CountResult<GenericResultWrapper>>;
209
221
  }
@@ -215,27 +227,28 @@ declare class QueryBuilder<GenericResultWrapper, IsAsync extends boolean = true>
215
227
  setDebugger(state: boolean): void;
216
228
  execute(query: Query<any, IsAsync>): MaybeAsync<IsAsync, any>;
217
229
  batchExecute(queryArray: Query<any, IsAsync>[]): MaybeAsync<IsAsync, any[]>;
230
+ lazyExecute(query: Query<any, IsAsync>): IsAsync extends true ? Promise<AsyncIterable<any>> : Iterable<any>;
218
231
  createTable<GenericResult = undefined>(params: {
219
232
  tableName: string;
220
233
  schema: string;
221
234
  ifNotExists?: boolean;
222
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
235
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
223
236
  dropTable<GenericResult = undefined>(params: {
224
237
  tableName: string;
225
238
  ifExists?: boolean;
226
- }): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
239
+ }): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
227
240
  select<GenericResult = DefaultReturnObject>(tableName: string): SelectBuilder<GenericResultWrapper, GenericResult, IsAsync>;
228
241
  fetchOne<GenericResult = DefaultReturnObject>(params: SelectOne): QueryWithExtra<GenericResultWrapper, OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
229
- 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>;
230
243
  raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
231
- raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
244
+ raw<GenericResult = DefaultReturnObject>(params: RawQueryFetchAll): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
232
245
  raw<GenericResult = DefaultReturnObject>(params: RawQueryWithoutFetching): Query<GenericResultWrapper, IsAsync>;
233
246
  insert<GenericResult = DefaultReturnObject>(params: InsertOne): Query<OneResult<GenericResultWrapper, GenericResult>, IsAsync>;
234
- insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
247
+ insert<GenericResult = DefaultReturnObject>(params: InsertMultiple): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
235
248
  insert<GenericResult = DefaultReturnObject>(params: InsertWithoutReturning): Query<GenericResultWrapper, IsAsync>;
236
- update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
249
+ update<GenericResult = DefaultReturnObject>(params: UpdateReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
237
250
  update<GenericResult = DefaultReturnObject>(params: UpdateWithoutReturning): Query<GenericResultWrapper, IsAsync>;
238
- delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult>, IsAsync>;
251
+ delete<GenericResult = DefaultReturnObject>(params: DeleteReturning): Query<ArrayResult<GenericResultWrapper, GenericResult, IsAsync>, IsAsync>;
239
252
  delete<GenericResult = DefaultReturnObject>(params: DeleteWithoutReturning): Query<GenericResultWrapper, IsAsync>;
240
253
  protected _parse_arguments(row: DefaultObject): Array<any>;
241
254
  protected _onConflict(resolution?: string | ConflictTypes | ConflictUpsert): string;
@@ -312,6 +325,7 @@ declare class DOQB extends QueryBuilder<{}, false> {
312
325
  constructor(db: any, options?: QueryBuilderOptions<false>);
313
326
  migrations(options: MigrationOptions): syncMigrationsBuilder<{}>;
314
327
  execute(query: Query<any, false>): any;
328
+ lazyExecute(query: Query<any, false>): Iterable<any>;
315
329
  }
316
330
 
317
- 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
@@ -257,16 +257,16 @@ var SelectBuilder = class _SelectBuilder {
257
257
  this._fetchOne
258
258
  );
259
259
  }
260
- getQueryAll() {
260
+ getQueryAll(options) {
261
261
  return this._fetchAll(this._options);
262
262
  }
263
263
  getQueryOne() {
264
264
  return this._fetchOne(this._options);
265
265
  }
266
- execute() {
266
+ execute(options) {
267
267
  return this._fetchAll(this._options).execute();
268
268
  }
269
- all() {
269
+ all(options) {
270
270
  return this._fetchAll(this._options).execute();
271
271
  }
272
272
  one() {
@@ -346,6 +346,9 @@ var QueryBuilder = class {
346
346
  batchExecute(queryArray) {
347
347
  throw new Error("Batch execute method not implemented");
348
348
  }
349
+ lazyExecute(query) {
350
+ throw new Error("Execute lazyExecute not implemented");
351
+ }
349
352
  createTable(params) {
350
353
  return new Query(
351
354
  (q) => {
@@ -396,15 +399,16 @@ var QueryBuilder = class {
396
399
  fetchAll(params) {
397
400
  return new QueryWithExtra(
398
401
  (q) => {
399
- return this.execute(q);
402
+ return params.lazy ? this.lazyExecute(q) : this.execute(q);
400
403
  },
401
- this._select(params),
404
+ this._select({ ...params, lazy: void 0 }),
402
405
  this._select({
403
406
  ...params,
404
407
  fields: "count(*) as total",
405
408
  offset: void 0,
406
409
  groupBy: void 0,
407
- limit: 1
410
+ limit: 1,
411
+ lazy: void 0
408
412
  }),
409
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,
410
414
  "ALL" /* ALL */
@@ -542,6 +546,11 @@ var QueryBuilder = class {
542
546
  }
543
547
  _update(params) {
544
548
  const whereParamsLength = typeof params.where === "object" && !Array.isArray(params.where) && params.where?.params ? Array.isArray(params.where?.params) ? Object.keys(params.where?.params).length : 1 : 0;
549
+ let whereString = this._where(params.where);
550
+ let parameterIndex = 1;
551
+ if (whereString && whereString.match(/(?<!\d)\?(?!\d)/)) {
552
+ whereString = whereString.replace(/\?/g, () => `?${parameterIndex++}`);
553
+ }
545
554
  const set = [];
546
555
  let index = 1;
547
556
  for (const [key, value] of Object.entries(params.data)) {
@@ -553,7 +562,7 @@ var QueryBuilder = class {
553
562
  }
554
563
  }
555
564
  return `UPDATE ${this._onConflict(params.onConflict)}${params.tableName}
556
- SET ${set.join(", ")}` + this._where(params.where) + this._returning(params.returning);
565
+ SET ${set.join(", ")}` + whereString + this._returning(params.returning);
557
566
  }
558
567
  _delete(params) {
559
568
  return `DELETE
@@ -899,6 +908,17 @@ var DOQB = class extends QueryBuilder {
899
908
  };
900
909
  });
901
910
  }
911
+ lazyExecute(query) {
912
+ return this.loggerWrapper(query, this.options.logger, () => {
913
+ let cursor;
914
+ if (query.arguments) {
915
+ cursor = this.db.exec(query.query, ...query.arguments);
916
+ } else {
917
+ cursor = this.db.exec(query.query);
918
+ }
919
+ return cursor;
920
+ });
921
+ }
902
922
  };
903
923
  // Annotate the CommonJS export names for ESM import in node:
904
924
  0 && (module.exports = {
package/dist/index.mjs CHANGED
@@ -215,16 +215,16 @@ var SelectBuilder = class _SelectBuilder {
215
215
  this._fetchOne
216
216
  );
217
217
  }
218
- getQueryAll() {
218
+ getQueryAll(options) {
219
219
  return this._fetchAll(this._options);
220
220
  }
221
221
  getQueryOne() {
222
222
  return this._fetchOne(this._options);
223
223
  }
224
- execute() {
224
+ execute(options) {
225
225
  return this._fetchAll(this._options).execute();
226
226
  }
227
- all() {
227
+ all(options) {
228
228
  return this._fetchAll(this._options).execute();
229
229
  }
230
230
  one() {
@@ -304,6 +304,9 @@ var QueryBuilder = class {
304
304
  batchExecute(queryArray) {
305
305
  throw new Error("Batch execute method not implemented");
306
306
  }
307
+ lazyExecute(query) {
308
+ throw new Error("Execute lazyExecute not implemented");
309
+ }
307
310
  createTable(params) {
308
311
  return new Query(
309
312
  (q) => {
@@ -354,15 +357,16 @@ var QueryBuilder = class {
354
357
  fetchAll(params) {
355
358
  return new QueryWithExtra(
356
359
  (q) => {
357
- return this.execute(q);
360
+ return params.lazy ? this.lazyExecute(q) : this.execute(q);
358
361
  },
359
- this._select(params),
362
+ this._select({ ...params, lazy: void 0 }),
360
363
  this._select({
361
364
  ...params,
362
365
  fields: "count(*) as total",
363
366
  offset: void 0,
364
367
  groupBy: void 0,
365
- limit: 1
368
+ limit: 1,
369
+ lazy: void 0
366
370
  }),
367
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,
368
372
  "ALL" /* ALL */
@@ -500,6 +504,11 @@ var QueryBuilder = class {
500
504
  }
501
505
  _update(params) {
502
506
  const whereParamsLength = typeof params.where === "object" && !Array.isArray(params.where) && params.where?.params ? Array.isArray(params.where?.params) ? Object.keys(params.where?.params).length : 1 : 0;
507
+ let whereString = this._where(params.where);
508
+ let parameterIndex = 1;
509
+ if (whereString && whereString.match(/(?<!\d)\?(?!\d)/)) {
510
+ whereString = whereString.replace(/\?/g, () => `?${parameterIndex++}`);
511
+ }
503
512
  const set = [];
504
513
  let index = 1;
505
514
  for (const [key, value] of Object.entries(params.data)) {
@@ -511,7 +520,7 @@ var QueryBuilder = class {
511
520
  }
512
521
  }
513
522
  return `UPDATE ${this._onConflict(params.onConflict)}${params.tableName}
514
- SET ${set.join(", ")}` + this._where(params.where) + this._returning(params.returning);
523
+ SET ${set.join(", ")}` + whereString + this._returning(params.returning);
515
524
  }
516
525
  _delete(params) {
517
526
  return `DELETE
@@ -857,6 +866,17 @@ var DOQB = class extends QueryBuilder {
857
866
  };
858
867
  });
859
868
  }
869
+ lazyExecute(query) {
870
+ return this.loggerWrapper(query, this.options.logger, () => {
871
+ let cursor;
872
+ if (query.arguments) {
873
+ cursor = this.db.exec(query.query, ...query.arguments);
874
+ } else {
875
+ cursor = this.db.exec(query.query);
876
+ }
877
+ return cursor;
878
+ });
879
+ }
860
880
  };
861
881
  export {
862
882
  ConflictTypes,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "workers-qb",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "description": "Zero dependencies Query Builder for Cloudflare Workers",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -57,7 +57,7 @@
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",