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 +90 -47
- package/dist/index.d.mts +28 -14
- package/dist/index.d.ts +28 -14
- package/dist/index.js +27 -7
- package/dist/index.mjs +27 -7
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,43 +1,69 @@
|
|
|
1
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>workers-qb</h1>
|
|
3
|
+
<p><em>Zero-dependency Query Builder for Cloudflare Workers</em></p>
|
|
2
4
|
|
|
3
|
-
|
|
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
|
-
|
|
18
|
+
## Overview
|
|
6
19
|
|
|
7
|
-
|
|
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
|
-
|
|
11
|
-
from code for direct SQL access using convenient wrapper methods.
|
|
22
|
+
📚 [Read the full documentation](https://workers-qb.massadas.com/)
|
|
12
23
|
|
|
13
|
-
|
|
24
|
+
### Key Differences from ORMs
|
|
14
25
|
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
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
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
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
|
-
##
|
|
62
|
+
## Usage Examples
|
|
63
|
+
|
|
64
|
+
### Cloudflare D1
|
|
39
65
|
|
|
40
|
-
```
|
|
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
|
-
//
|
|
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
|
-
//
|
|
69
|
-
const employeeListModular = await qb
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
107
|
+
### Cloudflare Durable Objects
|
|
82
108
|
|
|
83
|
-
```
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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():
|
|
206
|
-
all():
|
|
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
|
|
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():
|
|
206
|
-
all():
|
|
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(", ")}` +
|
|
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(", ")}` +
|
|
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.
|
|
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.
|
|
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",
|