workers-qb 0.1.12 → 1.0.1
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 +28 -171
- package/dist/{Builder.d.ts → src/Builder.d.ts} +11 -14
- package/dist/src/databases/d1.d.ts +9 -0
- package/dist/{databases → src/databases}/pg.d.ts +2 -7
- package/dist/{interfaces.d.ts → src/interfaces.d.ts} +2 -2
- package/dist/src/tools.d.ts +14 -0
- package/dist/workers-qb.js +1 -1
- package/dist/workers-qb.mjs +1 -1
- package/package.json +3 -4
- package/dist/databases/d1.d.ts +0 -13
- package/dist/tools.d.ts +0 -5
- /package/dist/{enums.d.ts → src/enums.d.ts} +0 -0
- /package/dist/{workers-qb.d.ts → src/workers-qb.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# workers-qb
|
|
2
2
|
|
|
3
|
+
### [Read the documentation here!](https://workers-qb.massadas.com/)
|
|
4
|
+
|
|
3
5
|
Zero dependencies Query Builder for [Cloudflare Workers](https://developers.cloudflare.com/workers/)
|
|
4
6
|
|
|
5
7
|
This module provides a simple standardized interface while keeping the benefits and speed of using raw queries over a
|
|
@@ -13,20 +15,16 @@ Currently, 2 databases are supported:
|
|
|
13
15
|
- [Cloudflare D1](https://developers.cloudflare.com/d1/)
|
|
14
16
|
- [PostgreSQL (using node-postgres)](https://developers.cloudflare.com/workers/databases/connect-to-postgres/)
|
|
15
17
|
|
|
16
|
-
Read the documentation [workers-qb.massadas.com](https://workers-qb.massadas.com/)!
|
|
17
|
-
|
|
18
18
|
## Features
|
|
19
19
|
|
|
20
20
|
- [x] Zero dependencies.
|
|
21
21
|
- [x] Fully typed/TypeScript support
|
|
22
22
|
- [x] SQL Type checking with compatible IDE's
|
|
23
|
-
- [x] Insert/Update/Select/Delete/Join queries
|
|
24
|
-
- [x] On Conflict for Inserts and Updates
|
|
25
23
|
- [x] Create/drop tables
|
|
26
|
-
- [x]
|
|
27
|
-
- [x]
|
|
28
|
-
- [x] Workers D1
|
|
29
|
-
- [x] Workers PostgreSQL
|
|
24
|
+
- [x] [Insert/Bulk Inserts/Update/Select/Delete/Join queries](https://workers-qb.massadas.com/basic-queries/)
|
|
25
|
+
- [x] [On Conflict for Inserts and Updates](https://workers-qb.massadas.com/advanced-queries/onConflict/)
|
|
26
|
+
- [x] [Support for Cloudflare Workers D1](https://workers-qb.massadas.com/databases/cloudflare-d1/)
|
|
27
|
+
- [x] [Support for Cloudflare Workers PostgreSQL (using node-postgres)](https://workers-qb.massadas.com/databases/postgresql/)
|
|
30
28
|
- [ ] Named parameters (waiting for full support in D1)
|
|
31
29
|
|
|
32
30
|
## Installation
|
|
@@ -35,7 +33,7 @@ Read the documentation [workers-qb.massadas.com](https://workers-qb.massadas.com
|
|
|
35
33
|
npm install workers-qb --save
|
|
36
34
|
```
|
|
37
35
|
|
|
38
|
-
## Example Cloudflare D1
|
|
36
|
+
## Example for Cloudflare Workers D1
|
|
39
37
|
|
|
40
38
|
```ts
|
|
41
39
|
import { D1QB } from 'workers-qb'
|
|
@@ -48,14 +46,16 @@ export default {
|
|
|
48
46
|
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
49
47
|
const qb = new D1QB(env.DB)
|
|
50
48
|
|
|
51
|
-
const fetched = await qb
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
49
|
+
const fetched = await qb
|
|
50
|
+
.fetchOne({
|
|
51
|
+
tableName: 'employees',
|
|
52
|
+
fields: 'count(*) as count',
|
|
53
|
+
where: {
|
|
54
|
+
conditions: 'active = ?1',
|
|
55
|
+
params: [true],
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
.execute()
|
|
59
59
|
|
|
60
60
|
return Response.json({
|
|
61
61
|
activeEmployees: fetched.results?.count || 0,
|
|
@@ -64,7 +64,7 @@ export default {
|
|
|
64
64
|
}
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
## Example Cloudflare Workers with PostgreSQL
|
|
67
|
+
## Example for Cloudflare Workers with PostgreSQL
|
|
68
68
|
|
|
69
69
|
Remember to close the connection using `ctx.waitUntil(qb.close());` or `await qb.close();` at the end of your request.
|
|
70
70
|
You may also reuse this connection to execute multiple queries, or share it between multiple requests if you are using
|
|
@@ -91,14 +91,16 @@ export default {
|
|
|
91
91
|
const qb = new PGQB(new Client(env.DB_URL))
|
|
92
92
|
await qb.connect()
|
|
93
93
|
|
|
94
|
-
const fetched = await qb
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
94
|
+
const fetched = await qb
|
|
95
|
+
.fetchOne({
|
|
96
|
+
tableName: 'employees',
|
|
97
|
+
fields: 'count(*) as count',
|
|
98
|
+
where: {
|
|
99
|
+
conditions: 'active = ?1',
|
|
100
|
+
params: [true],
|
|
101
|
+
},
|
|
102
|
+
})
|
|
103
|
+
.execute()
|
|
102
104
|
|
|
103
105
|
ctx.waitUntil(qb.close())
|
|
104
106
|
return Response.json({
|
|
@@ -107,148 +109,3 @@ export default {
|
|
|
107
109
|
},
|
|
108
110
|
}
|
|
109
111
|
```
|
|
110
|
-
|
|
111
|
-
## Basic queries
|
|
112
|
-
|
|
113
|
-
#### Fetching a single record
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
const qb = new D1QB(env.DB)
|
|
117
|
-
|
|
118
|
-
const fetched = await qb.fetchOne({
|
|
119
|
-
tableName: 'employees',
|
|
120
|
-
fields: 'count(*) as count',
|
|
121
|
-
where: {
|
|
122
|
-
conditions: 'department = ?1',
|
|
123
|
-
params: ['HQ'],
|
|
124
|
-
},
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
console.log(`There are ${fetched.results.count} employees in the HR department`)
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
#### Fetching multiple records
|
|
131
|
-
|
|
132
|
-
```ts
|
|
133
|
-
import { OrderTypes } from 'workers-qb'
|
|
134
|
-
const qb = new D1QB(env.DB)
|
|
135
|
-
|
|
136
|
-
const fetched = await qb.fetchAll({
|
|
137
|
-
tableName: 'employees',
|
|
138
|
-
fields: ['role', 'count(*) as count'],
|
|
139
|
-
where: {
|
|
140
|
-
conditions: 'department = ?1',
|
|
141
|
-
params: ['HR'],
|
|
142
|
-
},
|
|
143
|
-
groupBy: 'role',
|
|
144
|
-
orderBy: {
|
|
145
|
-
count: OrderTypes.DESC,
|
|
146
|
-
},
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
console.log(`Roles in the HR department:`)
|
|
150
|
-
|
|
151
|
-
fetched.results.forEach((employee) => {
|
|
152
|
-
console.log(`${employee.role} has ${employee.count} employees`)
|
|
153
|
-
})
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
#### Inserting rows
|
|
157
|
-
|
|
158
|
-
```ts
|
|
159
|
-
import { Raw } from 'workers-qb'
|
|
160
|
-
const qb = new D1QB(env.DB)
|
|
161
|
-
|
|
162
|
-
const inserted = await qb.insert({
|
|
163
|
-
tableName: 'employees',
|
|
164
|
-
data: {
|
|
165
|
-
name: 'Joe',
|
|
166
|
-
role: 'manager',
|
|
167
|
-
department: 'store',
|
|
168
|
-
created_at: new Raw('CURRENT_TIMESTAMP'),
|
|
169
|
-
},
|
|
170
|
-
returning: '*',
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
console.log(inserted) // This will contain the data after SQL triggers and primary keys that are automated
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## Bulk Inserting rows
|
|
177
|
-
|
|
178
|
-
```ts
|
|
179
|
-
import { Raw } from 'workers-qb'
|
|
180
|
-
const qb = new D1QB(env.DB)
|
|
181
|
-
|
|
182
|
-
const inserted = await qb.insert({
|
|
183
|
-
tableName: 'employees',
|
|
184
|
-
data: [
|
|
185
|
-
{
|
|
186
|
-
name: 'Joe',
|
|
187
|
-
role: 'manager',
|
|
188
|
-
department: 'store',
|
|
189
|
-
created_at: new Raw('CURRENT_TIMESTAMP'),
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
name: 'John',
|
|
193
|
-
role: 'employee',
|
|
194
|
-
department: 'store',
|
|
195
|
-
created_at: new Raw('CURRENT_TIMESTAMP'),
|
|
196
|
-
},
|
|
197
|
-
{
|
|
198
|
-
name: 'Mickael',
|
|
199
|
-
role: 'employee',
|
|
200
|
-
department: 'store',
|
|
201
|
-
created_at: new Raw('CURRENT_TIMESTAMP'),
|
|
202
|
-
},
|
|
203
|
-
],
|
|
204
|
-
})
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
#### Updating rows
|
|
208
|
-
|
|
209
|
-
```ts
|
|
210
|
-
const updated = await qb.update({
|
|
211
|
-
tableName: 'employees',
|
|
212
|
-
data: {
|
|
213
|
-
role: 'CEO',
|
|
214
|
-
department: 'HQ',
|
|
215
|
-
},
|
|
216
|
-
where: {
|
|
217
|
-
conditions: 'id = ?1',
|
|
218
|
-
params: [123],
|
|
219
|
-
},
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
console.log(`Lines affected in this query: ${updated.changes}`)
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
#### Deleting rows
|
|
226
|
-
|
|
227
|
-
```ts
|
|
228
|
-
const deleted = await qb.delete({
|
|
229
|
-
tableName: 'employees',
|
|
230
|
-
where: {
|
|
231
|
-
conditions: 'id = ?1',
|
|
232
|
-
params: [123],
|
|
233
|
-
},
|
|
234
|
-
})
|
|
235
|
-
|
|
236
|
-
console.log(`Lines affected in this query: ${deleted.changes}`)
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
#### Dropping and creating tables
|
|
240
|
-
|
|
241
|
-
```ts
|
|
242
|
-
const created = await qb.createTable({
|
|
243
|
-
tableName: 'testTable',
|
|
244
|
-
schema: `
|
|
245
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
246
|
-
name TEXT NOT NULL
|
|
247
|
-
`,
|
|
248
|
-
ifNotExists: true,
|
|
249
|
-
})
|
|
250
|
-
|
|
251
|
-
const dropped = await qb.dropTable({
|
|
252
|
-
tableName: 'testTable',
|
|
253
|
-
})
|
|
254
|
-
```
|
|
@@ -1,28 +1,25 @@
|
|
|
1
1
|
import { Delete, Insert, Join, SelectAll, SelectOne, Update } from './interfaces';
|
|
2
|
-
import { ConflictTypes,
|
|
3
|
-
import { Raw } from './tools';
|
|
2
|
+
import { ConflictTypes, OrderTypes } from './enums';
|
|
3
|
+
import { Query, Raw } from './tools';
|
|
4
4
|
export declare class QueryBuilder<GenericResult, GenericResultOne> {
|
|
5
5
|
_debugger: boolean;
|
|
6
6
|
setDebugger(state: boolean): void;
|
|
7
|
-
execute(
|
|
8
|
-
|
|
9
|
-
arguments?: (string | number | boolean | null | Raw)[];
|
|
10
|
-
fetchType?: FetchTypes;
|
|
11
|
-
}): Promise<any>;
|
|
7
|
+
execute(query: Query): Promise<GenericResultOne | GenericResult>;
|
|
8
|
+
batchExecute(queryArray: Query[]): Promise<(GenericResultOne | GenericResult)[]>;
|
|
12
9
|
createTable(params: {
|
|
13
10
|
tableName: string;
|
|
14
11
|
schema: string;
|
|
15
12
|
ifNotExists?: boolean;
|
|
16
|
-
}):
|
|
13
|
+
}): Query;
|
|
17
14
|
dropTable(params: {
|
|
18
15
|
tableName: string;
|
|
19
16
|
ifExists?: boolean;
|
|
20
|
-
}):
|
|
21
|
-
fetchOne(params: SelectOne):
|
|
22
|
-
fetchAll(params: SelectAll):
|
|
23
|
-
insert(params: Insert):
|
|
24
|
-
update(params: Update):
|
|
25
|
-
delete(params: Delete):
|
|
17
|
+
}): Query;
|
|
18
|
+
fetchOne(params: SelectOne): Query;
|
|
19
|
+
fetchAll(params: SelectAll): Query;
|
|
20
|
+
insert(params: Insert): Query;
|
|
21
|
+
update(params: Update): Query;
|
|
22
|
+
delete(params: Delete): Query;
|
|
26
23
|
_parse_arguments(row: Record<string, string | boolean | number | null | Raw>): Array<any>;
|
|
27
24
|
_onConflict(resolution?: string | ConflictTypes): string;
|
|
28
25
|
_insert(params: Insert): string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { QueryBuilder } from '../Builder';
|
|
2
|
+
import { Query } from '../tools';
|
|
3
|
+
import { D1Result, D1ResultOne } from '../interfaces';
|
|
4
|
+
export declare class D1QB extends QueryBuilder<D1Result, D1ResultOne> {
|
|
5
|
+
private db;
|
|
6
|
+
constructor(db: any);
|
|
7
|
+
execute(query: Query): Promise<D1ResultOne | D1Result>;
|
|
8
|
+
batchExecute(queryArray: Query[]): Promise<(D1ResultOne | D1Result)[]>;
|
|
9
|
+
}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import { QueryBuilder } from '../Builder';
|
|
2
|
-
import {
|
|
3
|
-
import { Raw } from '../tools';
|
|
2
|
+
import { Query } from '../tools';
|
|
4
3
|
import { PGResult, PGResultOne } from '../interfaces';
|
|
5
4
|
export declare class PGQB extends QueryBuilder<PGResult, PGResultOne> {
|
|
6
5
|
private client;
|
|
7
6
|
constructor(client: any);
|
|
8
7
|
connect(): Promise<void>;
|
|
9
8
|
close(): Promise<void>;
|
|
10
|
-
execute(
|
|
11
|
-
query: String;
|
|
12
|
-
arguments?: (string | number | boolean | null | Raw)[];
|
|
13
|
-
fetchType?: FetchTypes;
|
|
14
|
-
}): Promise<any>;
|
|
9
|
+
execute(query: Query): Promise<PGResultOne | PGResult>;
|
|
15
10
|
}
|
|
@@ -44,7 +44,7 @@ export interface Delete {
|
|
|
44
44
|
export interface D1Result {
|
|
45
45
|
changes?: number;
|
|
46
46
|
duration: number;
|
|
47
|
-
|
|
47
|
+
last_row_id?: string | number;
|
|
48
48
|
results?: Array<Record<string, string | boolean | number | null>>;
|
|
49
49
|
served_by: string;
|
|
50
50
|
success: boolean;
|
|
@@ -52,7 +52,7 @@ export interface D1Result {
|
|
|
52
52
|
export interface D1ResultOne {
|
|
53
53
|
changes?: number;
|
|
54
54
|
duration: number;
|
|
55
|
-
|
|
55
|
+
last_row_id?: string | number;
|
|
56
56
|
results?: Record<string, string | boolean | number | null>;
|
|
57
57
|
served_by: string;
|
|
58
58
|
success: boolean;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FetchTypes } from 'enums';
|
|
2
|
+
export declare class Raw {
|
|
3
|
+
isRaw: boolean;
|
|
4
|
+
content: any;
|
|
5
|
+
constructor(content: any);
|
|
6
|
+
}
|
|
7
|
+
export declare class Query {
|
|
8
|
+
executeMethod: (query: Query) => Promise<any>;
|
|
9
|
+
query: string;
|
|
10
|
+
arguments?: (string | number | boolean | null | Raw)[];
|
|
11
|
+
fetchType?: FetchTypes;
|
|
12
|
+
constructor(executeMethod: (query: Query) => Promise<any>, query: string, args?: (string | number | boolean | null | Raw)[], fetchType?: FetchTypes);
|
|
13
|
+
execute(): Promise<any>;
|
|
14
|
+
}
|
package/dist/workers-qb.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e,t,r,s;exports.OrderTypes=void 0,(e=exports.OrderTypes||(exports.OrderTypes={})).ASC="ASC",e.DESC="DESC",exports.FetchTypes=void 0,(t=exports.FetchTypes||(exports.FetchTypes={})).ONE="ONE",t.ALL="ALL",exports.ConflictTypes=void 0,(r=exports.ConflictTypes||(exports.ConflictTypes={})).ROLLBACK="ROLLBACK",r.ABORT="ABORT",r.FAIL="FAIL",r.IGNORE="IGNORE",r.REPLACE="REPLACE",exports.JoinTypes=void 0,(s=exports.JoinTypes||(exports.JoinTypes={})).INNER="INNER",s.LEFT="LEFT",s.CROSS="CROSS";class n{isRaw=!0;content;constructor(e){this.content=e}}class o{_debugger=!1;setDebugger(e){this._debugger=e}async execute(e){throw new Error("Execute method not implemented")}async createTable(e){return this.execute(
|
|
1
|
+
"use strict";var e,t,r,s;exports.OrderTypes=void 0,(e=exports.OrderTypes||(exports.OrderTypes={})).ASC="ASC",e.DESC="DESC",exports.FetchTypes=void 0,(t=exports.FetchTypes||(exports.FetchTypes={})).ONE="ONE",t.ALL="ALL",exports.ConflictTypes=void 0,(r=exports.ConflictTypes||(exports.ConflictTypes={})).ROLLBACK="ROLLBACK",r.ABORT="ABORT",r.FAIL="FAIL",r.IGNORE="IGNORE",r.REPLACE="REPLACE",exports.JoinTypes=void 0,(s=exports.JoinTypes||(exports.JoinTypes={})).INNER="INNER",s.LEFT="LEFT",s.CROSS="CROSS";class n{isRaw=!0;content;constructor(e){this.content=e}}class o{executeMethod;query;arguments;fetchType;constructor(e,t,r,s){this.executeMethod=e,this.query=t,this.arguments=r,this.fetchType=s}async execute(){return this.executeMethod(this)}}class a{_debugger=!1;setDebugger(e){this._debugger=e}async execute(e){throw new Error("Execute method not implemented")}async batchExecute(e){throw new Error("Batch execute method not implemented")}createTable(e){return new o((e=>this.execute(e)),`CREATE TABLE ${e.ifNotExists?"IF NOT EXISTS":""} ${e.tableName}\n (\n ${e.schema}\n )`)}dropTable(e){return new o((e=>this.execute(e)),`DROP TABLE ${e.ifExists?"IF EXISTS":""} ${e.tableName}`)}fetchOne(e){return new o((e=>this.execute(e)),this._select({...e,limit:1}),e.where?e.where.params:void 0,exports.FetchTypes.ONE)}fetchAll(e){return new o((e=>this.execute(e)),this._select(e),e.where?e.where.params:void 0,exports.FetchTypes.ALL)}insert(e){let t=[];if(Array.isArray(e.data))for(const r of e.data)t=t.concat(this._parse_arguments(r));else t=t.concat(this._parse_arguments(e.data));const r=Array.isArray(e.data)?exports.FetchTypes.ALL:exports.FetchTypes.ONE;return new o((e=>this.execute(e)),this._insert(e),t,r)}update(e){let t=this._parse_arguments(e.data);return e.where&&e.where.params&&(t=e.where.params.concat(t)),new o((e=>this.execute(e)),this._update(e),t,exports.FetchTypes.ALL)}delete(e){return new o((e=>this.execute(e)),this._delete(e),e.where?e.where.params:void 0,exports.FetchTypes.ALL)}_parse_arguments(e){return Object.values(e).filter((e=>!(e instanceof n)))}_onConflict(e){return e?`OR ${e} `:""}_insert(e){const t=[];Array.isArray(e.data)||(e.data=[e.data]);const r=Object.keys(e.data[0]).join(", ");let s=1;for(const r of e.data){const e=[];Object.values(r).forEach((t=>{t instanceof n?e.push(t.content):(e.push(`?${s}`),s+=1)})),t.push(`(${e.join(", ")})`)}return`INSERT ${this._onConflict(e.onConflict)}INTO ${e.tableName} (${r}) VALUES ${t.join(", ")}`+this._returning(e.returning)}_update(e){const t=e.where&&e.where.params?Object.keys(e.where.params).length:0,r=[];let s=1;for(const[o,a]of Object.entries(e.data))a instanceof n?r.push(`${o} = ${a.content}`):(r.push(`${o} = ?${t+s}`),s+=1);return`UPDATE ${this._onConflict(e.onConflict)}${e.tableName} SET ${r.join(", ")}`+this._where(e.where?.conditions)+this._returning(e.returning)}_delete(e){return`DELETE FROM ${e.tableName}`+this._where(e.where?.conditions)+this._returning(e.returning)}_select(e){return`SELECT ${this._fields(e.fields)} FROM ${e.tableName}`+this._join(e.join)+this._where(e.where?.conditions)+this._groupBy(e.groupBy)+this._having(e.having)+this._orderBy(e.orderBy)+this._limit(e.limit)+this._offset(e.offset)}_fields(e){return"string"==typeof e?e:e.join(", ")}_where(e){return e?"string"==typeof e?` WHERE ${e}`:` WHERE ${e.join(" AND ")}`:""}_join(e){if(!e)return"";Array.isArray(e)||(e=[e]);const t=[];return e.forEach((e=>{const r=e.type?`${e.type} `:"";t.push(`${r}JOIN ${"string"==typeof e.table?e.table:`(${this._select(e.table)})`}${e.alias?` AS ${e.alias}`:""} ON ${e.on}`)}))," "+t.join(" ")}_groupBy(e){return e?"string"==typeof e?` GROUP BY ${e}`:` GROUP BY ${e.join(", ")}`:""}_having(e){return e?` HAVING ${e}`:""}_orderBy(e){if(!e)return"";if("string"==typeof e)return` ORDER BY ${e}`;if(Array.isArray(e))return` ORDER BY ${e.join(", ")}`;const t=[];return Object.entries(e).forEach((([e,r])=>{t.push(`${e} ${r}`)})),` ORDER BY ${t.join(", ")}`}_limit(e){return e?` LIMIT ${e}`:""}_offset(e){return e?` OFFSET ${e}`:""}_returning(e){return e?"string"==typeof e?` RETURNING ${e}`:` RETURNING ${e.join(", ")}`:""}}exports.D1QB=class extends a{db;constructor(e){super(),this.db=e}async execute(e){let t=this.db.prepare(e.query);if(this._debugger&&console.log({"workers-qb":{query:e.query,arguments:e.arguments,fetchType:e.fetchType}}),e.arguments&&(t=t.bind(...e.arguments)),e.fetchType===exports.FetchTypes.ONE||e.fetchType===exports.FetchTypes.ALL){const r=await t.all();return{changes:r.meta?.changes,duration:r.meta?.duration,last_row_id:r.meta?.last_row_id,served_by:r.meta?.served_by,success:r.success,results:e.fetchType===exports.FetchTypes.ONE?r.results[0]:r.results}}return t.run()}async batchExecute(e){this._debugger&&console.log({"workers-qb":e});const t=e.map((e=>{let t=this.db.prepare(e.query);return e.arguments&&(t=t.bind(...e.arguments)),t}));return(await this.db.batch(t)).map(((t,r)=>e[r]?{changes:t.meta?.changes,duration:t.meta?.duration,last_row_id:t.meta?.last_row_id,served_by:t.meta?.served_by,success:t.success,results:e[r].fetchType===exports.FetchTypes.ONE?t.results?.[0]:t.results}:{changes:t.meta?.changes,duration:t.meta?.duration,last_row_id:t.meta?.last_row_id,served_by:t.meta?.served_by,success:t.success}))}},exports.PGQB=class extends a{client;constructor(e){super(),this.client=e}async connect(){await this.client.connect()}async close(){await this.client.end()}async execute(e){const t=e.query.replaceAll("?","$");let r;return this._debugger&&console.log({"workers-qb":e}),r=e.arguments?await this.client.query({values:e.arguments,text:t}):await this.client.query({text:t}),e.fetchType===exports.FetchTypes.ONE||e.fetchType===exports.FetchTypes.ALL?{command:r.command,lastRowId:r.oid,rowCount:r.rowCount,results:e.fetchType===exports.FetchTypes.ONE?r.rows[0]:r.rows}:{command:r.command,lastRowId:r.oid,rowCount:r.rowCount}}},exports.Query=o,exports.QueryBuilder=a,exports.Raw=n;
|
package/dist/workers-qb.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t,r,s;!function(e){e.ASC="ASC",e.DESC="DESC"}(e||(e={})),function(e){e.ONE="ONE",e.ALL="ALL"}(t||(t={})),function(e){e.ROLLBACK="ROLLBACK",e.ABORT="ABORT",e.FAIL="FAIL",e.IGNORE="IGNORE",e.REPLACE="REPLACE"}(r||(r={})),function(e){e.INNER="INNER",e.LEFT="LEFT",e.CROSS="CROSS"}(s||(s={}));class n{isRaw=!0;content;constructor(e){this.content=e}}class a{_debugger=!1;setDebugger(e){this._debugger=e}async execute(e){throw new Error("Execute method not implemented")}async createTable(e){return this.execute(
|
|
1
|
+
var e,t,r,s;!function(e){e.ASC="ASC",e.DESC="DESC"}(e||(e={})),function(e){e.ONE="ONE",e.ALL="ALL"}(t||(t={})),function(e){e.ROLLBACK="ROLLBACK",e.ABORT="ABORT",e.FAIL="FAIL",e.IGNORE="IGNORE",e.REPLACE="REPLACE"}(r||(r={})),function(e){e.INNER="INNER",e.LEFT="LEFT",e.CROSS="CROSS"}(s||(s={}));class n{isRaw=!0;content;constructor(e){this.content=e}}class a{executeMethod;query;arguments;fetchType;constructor(e,t,r,s){this.executeMethod=e,this.query=t,this.arguments=r,this.fetchType=s}async execute(){return this.executeMethod(this)}}class i{_debugger=!1;setDebugger(e){this._debugger=e}async execute(e){throw new Error("Execute method not implemented")}async batchExecute(e){throw new Error("Batch execute method not implemented")}createTable(e){return new a((e=>this.execute(e)),`CREATE TABLE ${e.ifNotExists?"IF NOT EXISTS":""} ${e.tableName}\n (\n ${e.schema}\n )`)}dropTable(e){return new a((e=>this.execute(e)),`DROP TABLE ${e.ifExists?"IF EXISTS":""} ${e.tableName}`)}fetchOne(e){return new a((e=>this.execute(e)),this._select({...e,limit:1}),e.where?e.where.params:void 0,t.ONE)}fetchAll(e){return new a((e=>this.execute(e)),this._select(e),e.where?e.where.params:void 0,t.ALL)}insert(e){let r=[];if(Array.isArray(e.data))for(const t of e.data)r=r.concat(this._parse_arguments(t));else r=r.concat(this._parse_arguments(e.data));const s=Array.isArray(e.data)?t.ALL:t.ONE;return new a((e=>this.execute(e)),this._insert(e),r,s)}update(e){let r=this._parse_arguments(e.data);return e.where&&e.where.params&&(r=e.where.params.concat(r)),new a((e=>this.execute(e)),this._update(e),r,t.ALL)}delete(e){return new a((e=>this.execute(e)),this._delete(e),e.where?e.where.params:void 0,t.ALL)}_parse_arguments(e){return Object.values(e).filter((e=>!(e instanceof n)))}_onConflict(e){return e?`OR ${e} `:""}_insert(e){const t=[];Array.isArray(e.data)||(e.data=[e.data]);const r=Object.keys(e.data[0]).join(", ");let s=1;for(const r of e.data){const e=[];Object.values(r).forEach((t=>{t instanceof n?e.push(t.content):(e.push(`?${s}`),s+=1)})),t.push(`(${e.join(", ")})`)}return`INSERT ${this._onConflict(e.onConflict)}INTO ${e.tableName} (${r}) VALUES ${t.join(", ")}`+this._returning(e.returning)}_update(e){const t=e.where&&e.where.params?Object.keys(e.where.params).length:0,r=[];let s=1;for(const[a,i]of Object.entries(e.data))i instanceof n?r.push(`${a} = ${i.content}`):(r.push(`${a} = ?${t+s}`),s+=1);return`UPDATE ${this._onConflict(e.onConflict)}${e.tableName} SET ${r.join(", ")}`+this._where(e.where?.conditions)+this._returning(e.returning)}_delete(e){return`DELETE FROM ${e.tableName}`+this._where(e.where?.conditions)+this._returning(e.returning)}_select(e){return`SELECT ${this._fields(e.fields)} FROM ${e.tableName}`+this._join(e.join)+this._where(e.where?.conditions)+this._groupBy(e.groupBy)+this._having(e.having)+this._orderBy(e.orderBy)+this._limit(e.limit)+this._offset(e.offset)}_fields(e){return"string"==typeof e?e:e.join(", ")}_where(e){return e?"string"==typeof e?` WHERE ${e}`:` WHERE ${e.join(" AND ")}`:""}_join(e){if(!e)return"";Array.isArray(e)||(e=[e]);const t=[];return e.forEach((e=>{const r=e.type?`${e.type} `:"";t.push(`${r}JOIN ${"string"==typeof e.table?e.table:`(${this._select(e.table)})`}${e.alias?` AS ${e.alias}`:""} ON ${e.on}`)}))," "+t.join(" ")}_groupBy(e){return e?"string"==typeof e?` GROUP BY ${e}`:` GROUP BY ${e.join(", ")}`:""}_having(e){return e?` HAVING ${e}`:""}_orderBy(e){if(!e)return"";if("string"==typeof e)return` ORDER BY ${e}`;if(Array.isArray(e))return` ORDER BY ${e.join(", ")}`;const t=[];return Object.entries(e).forEach((([e,r])=>{t.push(`${e} ${r}`)})),` ORDER BY ${t.join(", ")}`}_limit(e){return e?` LIMIT ${e}`:""}_offset(e){return e?` OFFSET ${e}`:""}_returning(e){return e?"string"==typeof e?` RETURNING ${e}`:` RETURNING ${e.join(", ")}`:""}}class o extends i{db;constructor(e){super(),this.db=e}async execute(e){let r=this.db.prepare(e.query);if(this._debugger&&console.log({"workers-qb":{query:e.query,arguments:e.arguments,fetchType:e.fetchType}}),e.arguments&&(r=r.bind(...e.arguments)),e.fetchType===t.ONE||e.fetchType===t.ALL){const s=await r.all();return{changes:s.meta?.changes,duration:s.meta?.duration,last_row_id:s.meta?.last_row_id,served_by:s.meta?.served_by,success:s.success,results:e.fetchType===t.ONE?s.results[0]:s.results}}return r.run()}async batchExecute(e){this._debugger&&console.log({"workers-qb":e});const r=e.map((e=>{let t=this.db.prepare(e.query);return e.arguments&&(t=t.bind(...e.arguments)),t}));return(await this.db.batch(r)).map(((r,s)=>e[s]?{changes:r.meta?.changes,duration:r.meta?.duration,last_row_id:r.meta?.last_row_id,served_by:r.meta?.served_by,success:r.success,results:e[s].fetchType===t.ONE?r.results?.[0]:r.results}:{changes:r.meta?.changes,duration:r.meta?.duration,last_row_id:r.meta?.last_row_id,served_by:r.meta?.served_by,success:r.success}))}}class c extends i{client;constructor(e){super(),this.client=e}async connect(){await this.client.connect()}async close(){await this.client.end()}async execute(e){const r=e.query.replaceAll("?","$");let s;return this._debugger&&console.log({"workers-qb":e}),s=e.arguments?await this.client.query({values:e.arguments,text:r}):await this.client.query({text:r}),e.fetchType===t.ONE||e.fetchType===t.ALL?{command:s.command,lastRowId:s.oid,rowCount:s.rowCount,results:e.fetchType===t.ONE?s.rows[0]:s.rows}:{command:s.command,lastRowId:s.oid,rowCount:s.rowCount}}}export{r as ConflictTypes,o as D1QB,t as FetchTypes,s as JoinTypes,e as OrderTypes,c as PGQB,a as Query,i as QueryBuilder,n as Raw};
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "workers-qb",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Zero dependencies Query Builder for Cloudflare Workers",
|
|
5
5
|
"main": "./dist/workers-qb.js",
|
|
6
6
|
"types": "./dist/workers-qb.d.ts",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
|
-
"types": "./dist/workers-qb.d.ts",
|
|
9
|
+
"types": "./dist/src/workers-qb.d.ts",
|
|
10
10
|
"import": "./dist/workers-qb.mjs",
|
|
11
11
|
"require": "./dist/workers-qb.js"
|
|
12
12
|
}
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
"README.md"
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
|
-
"_postinstall": "husky install",
|
|
21
20
|
"prepublishOnly": "pinst --disable",
|
|
22
21
|
"postpublish": "pinst --enable",
|
|
23
22
|
"build": "rollup -c",
|
|
@@ -25,7 +24,7 @@
|
|
|
25
24
|
"test": "jest --no-cache --runInBand",
|
|
26
25
|
"test:cov": "jest --coverage --no-cache --runInBand",
|
|
27
26
|
"addscope": "node tools/packagejson name @g4brym/workers-qb",
|
|
28
|
-
"prettify": "prettier .
|
|
27
|
+
"prettify": "prettier --check . || (prettier -w .; exit 1)",
|
|
29
28
|
"prepare": "husky install"
|
|
30
29
|
},
|
|
31
30
|
"publishConfig": {
|
package/dist/databases/d1.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { QueryBuilder } from '../Builder';
|
|
2
|
-
import { FetchTypes } from '../enums';
|
|
3
|
-
import { Raw } from '../tools';
|
|
4
|
-
import { D1Result, D1ResultOne } from '../interfaces';
|
|
5
|
-
export declare class D1QB extends QueryBuilder<D1Result, D1ResultOne> {
|
|
6
|
-
private db;
|
|
7
|
-
constructor(db: any);
|
|
8
|
-
execute(params: {
|
|
9
|
-
query: string;
|
|
10
|
-
arguments?: (string | number | boolean | null | Raw)[];
|
|
11
|
-
fetchType?: FetchTypes;
|
|
12
|
-
}): Promise<any>;
|
|
13
|
-
}
|
package/dist/tools.d.ts
DELETED
|
File without changes
|
|
File without changes
|