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 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] Keep where conditions simple in code
27
- - [x] Bulk insert
28
- - [x] Workers D1 Support
29
- - [x] Workers PostgreSQL Support
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 Usage
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.fetchOne({
52
- tableName: 'employees',
53
- fields: 'count(*) as count',
54
- where: {
55
- conditions: 'active = ?1',
56
- params: [true],
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 Usage
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.fetchOne({
95
- tableName: 'employees',
96
- fields: 'count(*) as count',
97
- where: {
98
- conditions: 'active = ?1',
99
- params: [true],
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, FetchTypes, OrderTypes } from './enums';
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(params: {
8
- query: string;
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
- }): Promise<GenericResult>;
13
+ }): Query;
17
14
  dropTable(params: {
18
15
  tableName: string;
19
16
  ifExists?: boolean;
20
- }): Promise<GenericResult>;
21
- fetchOne(params: SelectOne): Promise<GenericResultOne>;
22
- fetchAll(params: SelectAll): Promise<GenericResult>;
23
- insert(params: Insert): Promise<GenericResultOne | GenericResult>;
24
- update(params: Update): Promise<GenericResult>;
25
- delete(params: Delete): Promise<GenericResult>;
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 { FetchTypes } from '../enums';
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(params: {
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
- lastRowId?: string | number;
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
- lastRowId?: string | number;
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
+ }
@@ -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({query:`CREATE TABLE ${e.ifNotExists?"IF NOT EXISTS":""} ${e.tableName}\n (\n ${e.schema}\n )`})}async dropTable(e){return this.execute({query:`DROP TABLE ${e.ifExists?"IF EXISTS":""} ${e.tableName}`})}async fetchOne(e){const t=await this.execute({query:this._select({...e,limit:1}),arguments:e.where?e.where.params:void 0,fetchType:exports.FetchTypes.ALL});return{...t,results:t.results.length>0?t.results[0]:null}}async fetchAll(e){return this.execute({query:this._select(e),arguments:e.where?e.where.params:void 0,fetchType:exports.FetchTypes.ALL})}async 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 this.execute({query:this._insert(e),arguments:t,fetchType:r})}async update(e){let t=this._parse_arguments(e.data);return e.where&&e.where.params&&(t=e.where.params.concat(t)),this.execute({query:this._update(e),arguments:t,fetchType:exports.FetchTypes.ALL})}async delete(e){return this.execute({query:this._delete(e),arguments:e.where?e.where.params:void 0,fetchType: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,i]of Object.entries(e.data))i instanceof n?r.push(`${o} = ${i.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 o{db;constructor(e){super(),this.db=e}async execute(e){let t=this.db.prepare(e.query);if(this._debugger&&console.log({"workers-qb":e}),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.length>0?r.results[0]:r.results}}return t.run()}},exports.PGQB=class extends o{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.length>0?r.rows[0]:r.rows}:null}},exports.QueryBuilder=o,exports.Raw=n;
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;
@@ -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({query:`CREATE TABLE ${e.ifNotExists?"IF NOT EXISTS":""} ${e.tableName}\n (\n ${e.schema}\n )`})}async dropTable(e){return this.execute({query:`DROP TABLE ${e.ifExists?"IF EXISTS":""} ${e.tableName}`})}async fetchOne(e){const r=await this.execute({query:this._select({...e,limit:1}),arguments:e.where?e.where.params:void 0,fetchType:t.ALL});return{...r,results:r.results.length>0?r.results[0]:null}}async fetchAll(e){return this.execute({query:this._select(e),arguments:e.where?e.where.params:void 0,fetchType:t.ALL})}async 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 this.execute({query:this._insert(e),arguments:r,fetchType:s})}async update(e){let r=this._parse_arguments(e.data);return e.where&&e.where.params&&(r=e.where.params.concat(r)),this.execute({query:this._update(e),arguments:r,fetchType:t.ALL})}async delete(e){return this.execute({query:this._delete(e),arguments:e.where?e.where.params:void 0,fetchType: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 i extends a{db;constructor(e){super(),this.db=e}async execute(e){let r=this.db.prepare(e.query);if(this._debugger&&console.log({"workers-qb":e}),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.length>0?s.results[0]:s.results}}return r.run()}}class o 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 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.length>0?s.rows[0]:s.rows}:null}}export{r as ConflictTypes,i as D1QB,t as FetchTypes,s as JoinTypes,e as OrderTypes,o as PGQB,a as QueryBuilder,n as Raw};
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.12",
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 . --write --ignore-unknown",
27
+ "prettify": "prettier --check . || (prettier -w .; exit 1)",
29
28
  "prepare": "husky install"
30
29
  },
31
30
  "publishConfig": {
@@ -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
@@ -1,5 +0,0 @@
1
- export declare class Raw {
2
- isRaw: boolean;
3
- content: any;
4
- constructor(content: any);
5
- }
File without changes
File without changes