@taylordb/query-builder 0.9.0 → 0.9.2
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/LICENSE +21 -0
- package/README.md +42 -0
- package/dist/cjs/__tests__/query-builder.spec.js +126 -23
- package/dist/cjs/__tests__/query-builder.spec.js.map +1 -1
- package/dist/cjs/aggregation-query-builder.d.ts +92 -0
- package/dist/cjs/aggregation-query-builder.js +92 -0
- package/dist/cjs/aggregation-query-builder.js.map +1 -1
- package/dist/cjs/batch-query-builder.d.ts +36 -0
- package/dist/cjs/batch-query-builder.js +36 -0
- package/dist/cjs/batch-query-builder.js.map +1 -1
- package/dist/cjs/delete-query-builder.d.ts +17 -0
- package/dist/cjs/delete-query-builder.js +17 -0
- package/dist/cjs/delete-query-builder.js.map +1 -1
- package/dist/cjs/executor.d.ts +4 -1
- package/dist/cjs/executor.js +20 -35
- package/dist/cjs/executor.js.map +1 -1
- package/dist/cjs/insert-query-builder.d.ts +68 -0
- package/dist/cjs/insert-query-builder.js +71 -0
- package/dist/cjs/insert-query-builder.js.map +1 -1
- package/dist/cjs/query-builder.d.ts +224 -5
- package/dist/cjs/query-builder.js +219 -5
- package/dist/cjs/query-builder.js.map +1 -1
- package/dist/cjs/selection-builder.d.ts +11 -0
- package/dist/cjs/selection-builder.js +11 -0
- package/dist/cjs/selection-builder.js.map +1 -1
- package/dist/cjs/{subscription-manager.d.ts → socket-connection.d.ts} +5 -4
- package/dist/cjs/{subscription-manager.js → socket-connection.js} +55 -9
- package/dist/cjs/socket-connection.js.map +1 -0
- package/dist/cjs/update-query-builder.d.ts +32 -0
- package/dist/cjs/update-query-builder.js +32 -0
- package/dist/cjs/update-query-builder.js.map +1 -1
- package/dist/cjs/where-query-builder.d.ts +59 -0
- package/dist/cjs/where-query-builder.js +6 -0
- package/dist/cjs/where-query-builder.js.map +1 -1
- package/dist/cjs/with-resolver.d.ts +5 -0
- package/dist/cjs/with-resolver.js +17 -0
- package/dist/cjs/with-resolver.js.map +1 -0
- package/dist/esm/__tests__/query-builder.spec.js +126 -23
- package/dist/esm/__tests__/query-builder.spec.js.map +1 -1
- package/dist/esm/aggregation-query-builder.d.ts +92 -0
- package/dist/esm/aggregation-query-builder.js +92 -0
- package/dist/esm/aggregation-query-builder.js.map +1 -1
- package/dist/esm/batch-query-builder.d.ts +36 -0
- package/dist/esm/batch-query-builder.js +36 -0
- package/dist/esm/batch-query-builder.js.map +1 -1
- package/dist/esm/delete-query-builder.d.ts +17 -0
- package/dist/esm/delete-query-builder.js +17 -0
- package/dist/esm/delete-query-builder.js.map +1 -1
- package/dist/esm/executor.d.ts +4 -1
- package/dist/esm/executor.js +20 -35
- package/dist/esm/executor.js.map +1 -1
- package/dist/esm/insert-query-builder.d.ts +68 -0
- package/dist/esm/insert-query-builder.js +71 -0
- package/dist/esm/insert-query-builder.js.map +1 -1
- package/dist/esm/query-builder.d.ts +224 -5
- package/dist/esm/query-builder.js +217 -4
- package/dist/esm/query-builder.js.map +1 -1
- package/dist/esm/selection-builder.d.ts +11 -0
- package/dist/esm/selection-builder.js +11 -0
- package/dist/esm/selection-builder.js.map +1 -1
- package/dist/esm/{subscription-manager.d.ts → socket-connection.d.ts} +5 -4
- package/dist/esm/{subscription-manager.js → socket-connection.js} +53 -7
- package/dist/esm/socket-connection.js.map +1 -0
- package/dist/esm/update-query-builder.d.ts +32 -0
- package/dist/esm/update-query-builder.js +32 -0
- package/dist/esm/update-query-builder.js.map +1 -1
- package/dist/esm/where-query-builder.d.ts +59 -0
- package/dist/esm/where-query-builder.js +6 -0
- package/dist/esm/where-query-builder.js.map +1 -1
- package/dist/esm/with-resolver.d.ts +5 -0
- package/dist/esm/with-resolver.js +14 -0
- package/dist/esm/with-resolver.js.map +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +4 -2
- package/dist/cjs/subscription-manager.js.map +0 -1
- package/dist/esm/subscription-manager.js.map +0 -1
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import
|
|
1
|
+
import EventEmitter from 'eventemitter3';
|
|
2
2
|
export type DriverSubscriptionResponse = {
|
|
3
3
|
id: string;
|
|
4
4
|
delta: object[];
|
|
5
5
|
tableName: string;
|
|
6
6
|
subscriptionId: string;
|
|
7
7
|
};
|
|
8
|
-
export declare class
|
|
8
|
+
export declare class SocketConnection extends EventEmitter {
|
|
9
9
|
#private;
|
|
10
|
-
private executor;
|
|
11
10
|
private config;
|
|
12
|
-
constructor(
|
|
11
|
+
constructor(config: {
|
|
13
12
|
baseUrl: string;
|
|
14
13
|
apiKey: string;
|
|
15
14
|
timeZone?: string;
|
|
16
15
|
clientId?: string;
|
|
17
16
|
});
|
|
17
|
+
rawRequest<T>(query: string, variables: Record<string, any>, headers?: Record<string, string>, transactionId?: string): Promise<T>;
|
|
18
18
|
subscribe<TResult>(metadatas: any[], callback: (...results: TResult[]) => void): Promise<{
|
|
19
19
|
unsubscribe: () => Promise<void>;
|
|
20
20
|
}>;
|
|
21
|
+
emit(event: string | symbol, ...args: any[]): boolean;
|
|
21
22
|
}
|
|
@@ -3,17 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.SocketConnection = void 0;
|
|
7
|
+
const eventemitter3_1 = __importDefault(require("eventemitter3"));
|
|
7
8
|
const fast_json_patch_1 = __importDefault(require("fast-json-patch"));
|
|
8
9
|
const socket_io_client_1 = require("socket.io-client");
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
const with_resolver_js_1 = require("./with-resolver.js");
|
|
11
|
+
const generateUUID = () => {
|
|
12
|
+
if (globalThis.crypto && globalThis.crypto.randomUUID) {
|
|
13
|
+
return globalThis.crypto.randomUUID();
|
|
14
|
+
}
|
|
15
|
+
// A simple fallback for environments without crypto.randomUUID
|
|
16
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
|
17
|
+
const r = (Math.random() * 16) | 0;
|
|
18
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
19
|
+
return v.toString(16);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
class SocketConnection extends eventemitter3_1.default {
|
|
11
23
|
config;
|
|
12
24
|
#socket = null;
|
|
13
25
|
#subscriptions = new Map();
|
|
14
26
|
#isConnecting = false;
|
|
15
|
-
constructor(
|
|
16
|
-
|
|
27
|
+
constructor(config) {
|
|
28
|
+
super();
|
|
17
29
|
this.config = config;
|
|
18
30
|
}
|
|
19
31
|
async #connect() {
|
|
@@ -29,6 +41,7 @@ class SubscriptionManager {
|
|
|
29
41
|
auth: {
|
|
30
42
|
token: this.config.apiKey,
|
|
31
43
|
'time-zone': this.config.timeZone || 'UTC',
|
|
44
|
+
schema: 'readable',
|
|
32
45
|
'client-id': this.config.clientId,
|
|
33
46
|
},
|
|
34
47
|
query: {},
|
|
@@ -44,6 +57,9 @@ class SubscriptionManager {
|
|
|
44
57
|
this.#socket.on('connect_error', err => {
|
|
45
58
|
reject(err);
|
|
46
59
|
});
|
|
60
|
+
this.#socket.on('query-response', (response) => {
|
|
61
|
+
this.emit(response.queryId, response.data);
|
|
62
|
+
});
|
|
47
63
|
});
|
|
48
64
|
this.#socket.emit('subscribe', { clientId: this.config.clientId });
|
|
49
65
|
}
|
|
@@ -51,6 +67,29 @@ class SubscriptionManager {
|
|
|
51
67
|
this.#isConnecting = false;
|
|
52
68
|
}
|
|
53
69
|
}
|
|
70
|
+
async rawRequest(query, variables, headers, transactionId) {
|
|
71
|
+
await this.#connect();
|
|
72
|
+
const queryId = generateUUID();
|
|
73
|
+
const { promise, resolve } = (0, with_resolver_js_1.withResolver)();
|
|
74
|
+
this.once(queryId, (response) => {
|
|
75
|
+
resolve(response);
|
|
76
|
+
});
|
|
77
|
+
if (!headers) {
|
|
78
|
+
headers = {};
|
|
79
|
+
}
|
|
80
|
+
headers = {
|
|
81
|
+
...headers,
|
|
82
|
+
schema: 'readable',
|
|
83
|
+
};
|
|
84
|
+
this.emit('query', {
|
|
85
|
+
query,
|
|
86
|
+
variables,
|
|
87
|
+
queryId,
|
|
88
|
+
...(transactionId ? { transactionId } : {}),
|
|
89
|
+
...(headers ? { options: { ...headers } } : {}),
|
|
90
|
+
});
|
|
91
|
+
return promise;
|
|
92
|
+
}
|
|
54
93
|
async subscribe(metadatas, callback) {
|
|
55
94
|
await this.#connect();
|
|
56
95
|
const param = metadatas.map(metadata => ({
|
|
@@ -59,7 +98,7 @@ class SubscriptionManager {
|
|
|
59
98
|
returns: ['patch', 'affectedFields'],
|
|
60
99
|
},
|
|
61
100
|
}));
|
|
62
|
-
const result = await this.
|
|
101
|
+
const result = await this.rawRequest(`
|
|
63
102
|
query ($param: [SubscriptionMetadataInput]!) {
|
|
64
103
|
plugins {
|
|
65
104
|
subscriptions {
|
|
@@ -94,7 +133,7 @@ class SubscriptionManager {
|
|
|
94
133
|
for (const id of subscriptionIds) {
|
|
95
134
|
this.#subscriptions.delete(id);
|
|
96
135
|
}
|
|
97
|
-
await this.
|
|
136
|
+
await this.rawRequest(`query RemoveSubscription ($subscriptionIds: [String]) {
|
|
98
137
|
plugins {
|
|
99
138
|
subscriptions {
|
|
100
139
|
unsubscribe(subscriptionIds: $subscriptionIds)
|
|
@@ -104,6 +143,13 @@ class SubscriptionManager {
|
|
|
104
143
|
},
|
|
105
144
|
};
|
|
106
145
|
}
|
|
146
|
+
emit(event, ...args) {
|
|
147
|
+
if (event === 'query') {
|
|
148
|
+
this.#socket?.emit('query', ...args);
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return super.emit(event, ...args);
|
|
152
|
+
}
|
|
107
153
|
#handlePatch(response) {
|
|
108
154
|
for (const patch of response.patches) {
|
|
109
155
|
const sub = this.#subscriptions.get(patch.subscriptionId);
|
|
@@ -116,5 +162,5 @@ class SubscriptionManager {
|
|
|
116
162
|
}
|
|
117
163
|
}
|
|
118
164
|
}
|
|
119
|
-
exports.
|
|
120
|
-
//# sourceMappingURL=
|
|
165
|
+
exports.SocketConnection = SocketConnection;
|
|
166
|
+
//# sourceMappingURL=socket-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-connection.js","sourceRoot":"","sources":["../../src/socket-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,42 @@ import type { AnyDB } from './@types/internal-types.js';
|
|
|
2
2
|
import type { Updatable, UpdateNode } from './@types/update.js';
|
|
3
3
|
import { Executor } from './executor.js';
|
|
4
4
|
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
5
|
+
/**
|
|
6
|
+
* A query builder for updating records in the database.
|
|
7
|
+
* @template DB - The database type.
|
|
8
|
+
* @template TableName - The name of the table to update.
|
|
9
|
+
*/
|
|
5
10
|
export declare class UpdateQueryBuilder<DB extends AnyDB, TableName extends keyof DB> extends FilterableQueryBuilder<DB, TableName> {
|
|
6
11
|
#private;
|
|
7
12
|
constructor(node: UpdateNode, executor: Executor);
|
|
13
|
+
/**
|
|
14
|
+
* Sets the values to update for the records that match the where clauses.
|
|
15
|
+
* @param values - An object containing the fields and their new values.
|
|
16
|
+
* @returns The `UpdateQueryBuilder` instance for chaining.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const { affectedRecords } = await qb
|
|
21
|
+
* .update('users')
|
|
22
|
+
* .set({ name: 'New Name' })
|
|
23
|
+
* .where('id', '=', 1)
|
|
24
|
+
* .execute();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
8
27
|
set(values: Updatable<DB[TableName]>): UpdateQueryBuilder<DB, TableName>;
|
|
28
|
+
/**
|
|
29
|
+
* Executes the update query.
|
|
30
|
+
* @returns A promise that resolves with the number of affected records.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const { affectedRecords } = await qb
|
|
35
|
+
* .update('users')
|
|
36
|
+
* .set({ name: 'New Name' })
|
|
37
|
+
* .where('id', '=', 1)
|
|
38
|
+
* .execute();
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
9
41
|
execute(): Promise<{
|
|
10
42
|
affectedRecords: number;
|
|
11
43
|
}>;
|
|
@@ -2,18 +2,50 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UpdateQueryBuilder = void 0;
|
|
4
4
|
const where_query_builder_js_1 = require("./where-query-builder.js");
|
|
5
|
+
/**
|
|
6
|
+
* A query builder for updating records in the database.
|
|
7
|
+
* @template DB - The database type.
|
|
8
|
+
* @template TableName - The name of the table to update.
|
|
9
|
+
*/
|
|
5
10
|
class UpdateQueryBuilder extends where_query_builder_js_1.FilterableQueryBuilder {
|
|
6
11
|
#node;
|
|
7
12
|
constructor(node, executor) {
|
|
8
13
|
super(node, executor);
|
|
9
14
|
this.#node = node;
|
|
10
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Sets the values to update for the records that match the where clauses.
|
|
18
|
+
* @param values - An object containing the fields and their new values.
|
|
19
|
+
* @returns The `UpdateQueryBuilder` instance for chaining.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const { affectedRecords } = await qb
|
|
24
|
+
* .update('users')
|
|
25
|
+
* .set({ name: 'New Name' })
|
|
26
|
+
* .where('id', '=', 1)
|
|
27
|
+
* .execute();
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
11
30
|
set(values) {
|
|
12
31
|
return new UpdateQueryBuilder({
|
|
13
32
|
...this.#node,
|
|
14
33
|
values,
|
|
15
34
|
}, this._executor);
|
|
16
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Executes the update query.
|
|
38
|
+
* @returns A promise that resolves with the number of affected records.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const { affectedRecords } = await qb
|
|
43
|
+
* .update('users')
|
|
44
|
+
* .set({ name: 'New Name' })
|
|
45
|
+
* .where('id', '=', 1)
|
|
46
|
+
* .execute();
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
17
49
|
async execute() {
|
|
18
50
|
const response = await this._executor.execute(this);
|
|
19
51
|
return response[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-query-builder.js","sourceRoot":"","sources":["../../src/update-query-builder.ts"],"names":[],"mappings":";;;AAGA,qEAAkE;AAElE,MAAa,kBAGX,SAAQ,+CAAqC;IAC7C,KAAK,CAAa;IAElB,YAAY,IAAgB,EAAE,QAAkB;QAC9C,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,MAAgC;QAClC,OAAO,IAAI,kBAAkB,CAC3B;YACE,GAAG,IAAI,CAAC,KAAK;YACb,MAAM;SACP,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAgC,IAAI,CAAC,CAAC;QAEpE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBACvC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"update-query-builder.js","sourceRoot":"","sources":["../../src/update-query-builder.ts"],"names":[],"mappings":";;;AAGA,qEAAkE;AAElE;;;;GAIG;AACH,MAAa,kBAGX,SAAQ,+CAAqC;IAC7C,KAAK,CAAa;IAElB,YAAY,IAAgB,EAAE,QAAkB;QAC9C,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,MAAgC;QAClC,OAAO,IAAI,kBAAkB,CAC3B;YACE,GAAG,IAAI,CAAC,KAAK;YACb,MAAM;SACP,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAgC,IAAI,CAAC,CAAC;QAEpE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3C,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBAC7C,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;gBACvC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;CACF;AA9ED,gDA8EC"}
|
|
@@ -2,12 +2,71 @@ import { LinkColumnType } from '@taylordb/shared';
|
|
|
2
2
|
import { AnyDB, FilterableNode } from './@types/internal-types.js';
|
|
3
3
|
import { ColumnNames } from './@types/query-builder.js';
|
|
4
4
|
import { Executor } from './executor.js';
|
|
5
|
+
/**
|
|
6
|
+
* A base class for query builders that support filtering.
|
|
7
|
+
* It provides the `where` and `orWhere` methods.
|
|
8
|
+
* @template DB - The database type.
|
|
9
|
+
* @template TableName - The name of the table to query.
|
|
10
|
+
*/
|
|
5
11
|
export declare class FilterableQueryBuilder<DB extends AnyDB, TableName extends keyof DB> {
|
|
6
12
|
_node: FilterableNode;
|
|
7
13
|
_executor: Executor;
|
|
8
14
|
constructor(node: FilterableNode, executor: Executor);
|
|
15
|
+
/**
|
|
16
|
+
* Adds a `where` clause to the query.
|
|
17
|
+
* This can be a simple condition, a nested query, or a cross-filter on a linked table.
|
|
18
|
+
*
|
|
19
|
+
* @param field - The field to filter on.
|
|
20
|
+
* @param operator - The filter operator.
|
|
21
|
+
* @param value - The value to filter by.
|
|
22
|
+
* @returns The query builder instance for chaining.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const users = await qb
|
|
27
|
+
* .selectFrom('users')
|
|
28
|
+
* .where('name', '=', 'John Doe')
|
|
29
|
+
* .execute();
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const users = await qb
|
|
35
|
+
* .selectFrom('users')
|
|
36
|
+
* .where((qb) =>
|
|
37
|
+
* qb.where('name', '=', 'John Doe').orWhere('email', '=', 'john.doe@example.com')
|
|
38
|
+
* )
|
|
39
|
+
* .execute();
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const users = await qb
|
|
45
|
+
* .selectFrom('users')
|
|
46
|
+
* .where('posts', 'hasAnyOf', (qb) => qb.where('isPublished', '=', true))
|
|
47
|
+
* .execute();
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
9
50
|
where<TField extends ColumnNames<DB[TableName]> & string, TOperator extends keyof DB[TableName][TField]['filters']>(field: TField, operator: TOperator, value: DB[TableName][TField] extends LinkColumnType<any, boolean> ? ((qb: FilterableQueryBuilder<DB, DB[TableName][TField] extends LinkColumnType<any, boolean> ? DB[TableName][TField]['linkedTo'] : never>) => FilterableQueryBuilder<DB, DB[TableName][TField] extends LinkColumnType<any, boolean> ? DB[TableName][TField]['linkedTo'] : never>) | DB[TableName][TField]['filters'][TOperator] : DB[TableName][TField]['filters'][TOperator]): this;
|
|
10
51
|
where<C extends (builder: WhereQueryBuilder<DB, TableName>) => WhereQueryBuilder<DB, TableName>>(column: C): this;
|
|
52
|
+
/**
|
|
53
|
+
* Adds an `orWhere` clause to the query.
|
|
54
|
+
* This is similar to `where`, but the condition will be joined with `OR`.
|
|
55
|
+
*
|
|
56
|
+
* @param field - The field to filter on.
|
|
57
|
+
* @param operator - The filter operator.
|
|
58
|
+
* @param value - The value to filter by.
|
|
59
|
+
* @returns The query builder instance for chaining.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const users = await qb
|
|
64
|
+
* .selectFrom('users')
|
|
65
|
+
* .where('name', '=', 'John Doe')
|
|
66
|
+
* .orWhere('name', '=', 'Jane Doe')
|
|
67
|
+
* .execute();
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
11
70
|
orWhere<TField extends ColumnNames<DB[TableName]> & string, TOperator extends keyof DB[TableName][TField]['filters']>(field: TField, operator: TOperator, value: DB[TableName][TField] extends LinkColumnType<any, boolean> ? (qb: FilterableQueryBuilder<DB, DB[TableName][TField] extends LinkColumnType<any, boolean> ? DB[TableName][TField]['linkedTo'] : never>) => FilterableQueryBuilder<DB, DB[TableName][TField] extends LinkColumnType<any, boolean> ? DB[TableName][TField]['linkedTo'] : never> | DB[TableName][TField]['filters'][TOperator] : DB[TableName][TField]['filters'][TOperator]): this;
|
|
12
71
|
orWhere<C extends (builder: WhereQueryBuilder<DB, TableName>) => WhereQueryBuilder<DB, TableName>>(column: C): this;
|
|
13
72
|
}
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WhereQueryBuilder = exports.FilterableQueryBuilder = void 0;
|
|
4
4
|
const selection_builder_js_1 = require("./selection-builder.js");
|
|
5
|
+
/**
|
|
6
|
+
* A base class for query builders that support filtering.
|
|
7
|
+
* It provides the `where` and `orWhere` methods.
|
|
8
|
+
* @template DB - The database type.
|
|
9
|
+
* @template TableName - The name of the table to query.
|
|
10
|
+
*/
|
|
5
11
|
class FilterableQueryBuilder {
|
|
6
12
|
_executor;
|
|
7
13
|
constructor(node, executor) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where-query-builder.js","sourceRoot":"","sources":["../../src/where-query-builder.ts"],"names":[],"mappings":";;;AAIA,iEAA0D;AAE1D,MAAa,sBAAsB;IAKjC,SAAS,CAAW;IAEpB,YAAY,IAAoB,EAAE,QAAkB;QAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"where-query-builder.js","sourceRoot":"","sources":["../../src/where-query-builder.ts"],"names":[],"mappings":";;;AAIA,iEAA0D;AAE1D;;;;;GAKG;AACH,MAAa,sBAAsB;IAKjC,SAAS,CAAW;IAEpB,YAAY,IAAoB,EAAE,QAAkB;QAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAkED,KAAK,CACH,SAI+C,EAC/C,QAAiB,EACjB,KAAe;QAEf,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC;gBACE,GAAG,IAAI,CAAC,KAAK;gBACb,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;aACnD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;YACF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,KAAK;gBACb,UAAU,EAAE;oBACV,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;oBACxB,UAAU,EAAE;wBACV,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;wBACnC,MAAM,CAAC,KAAK,CAAC,UAAU;qBACxB;iBACF;aACF,CAAC;YACF,wDAAwD;YACxD,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,MAAM,gBAAgB,GAAG,IAAI,uCAAgB,CAC3C,IAAI,CAAC,SAAS,CACf,CAAC;YACF,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,OAAO,CAAC,SAAgB,CAAC,CAAC;YAC1E,MAAM,yBAAyB,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAEhE,MAAM,SAAS,GAAW;gBACxB,KAAK,EAAE,SAAmB;gBAC1B,QAAQ,EAAE,QAAS;gBACnB,KAAK,EAAE,CAAC,aAAa,EAAE,yBAAyB,CAAC,KAAK,CAAC,UAAU,CAAC;aACnE,CAAC;YAEF,MAAM,OAAO,GAAmB;gBAC9B,GAAG,IAAI,CAAC,KAAK;gBACb,UAAU,EAAE;oBACV,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;oBACxB,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;iBAC7D;aACF,CAAC;YAEF,wDAAwD;YACxD,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,SAAS,GAAW;YACxB,KAAK,EAAE,SAAmB;YAC1B,QAAQ,EAAE,QAAS;YACnB,KAAK;SACN,CAAC;QAEF,MAAM,OAAO,GAAmB;YAC9B,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE;gBACV,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU;gBACxB,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC;aAC7D;SACF,CAAC;QAEF,wDAAwD;QACxD,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IAiDD,OAAO,CACL,SAAiE,EACjE,QAAiB,EACjB,KAAe;QAEf,uEAAuE;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QAEpD,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,iBAAiB,CACnC;gBACE,GAAG,IAAI,CAAC,KAAK;gBACb,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;aACnD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;YACF,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK,EAAE,SAAmB;gBAC1B,QAAQ,EAAE,QAAS;gBACnB,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,OAAO,IAAI,IAAI,CAAC,WAAW,CACzB;YACE,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE;gBACV,WAAW,EAAE,IAAI;gBACjB,UAAU,EAAE,UAAU;aACvB;SACF,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;CACF;AA5OD,wDA4OC;AAED,MAAa,iBAGX,SAAQ,sBAAqC;CAAG;AAHlD,8CAGkD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withResolver = withResolver;
|
|
4
|
+
function withResolver() {
|
|
5
|
+
let resolve;
|
|
6
|
+
let reject;
|
|
7
|
+
const promise = new Promise((res, rej) => {
|
|
8
|
+
resolve = res;
|
|
9
|
+
reject = rej;
|
|
10
|
+
});
|
|
11
|
+
return {
|
|
12
|
+
promise,
|
|
13
|
+
resolve,
|
|
14
|
+
reject,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=with-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-resolver.js","sourceRoot":"","sources":["../../src/with-resolver.ts"],"names":[],"mappings":";;AAAA,oCAcC;AAdD,SAAgB,YAAY;IAC1B,IAAI,OAA2B,CAAC;IAChC,IAAI,MAA8B,CAAC;IAEnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,OAAO,GAAG,GAAG,CAAC;QACd,MAAM,GAAG,GAAG,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
import { createQueryBuilder } from '../index.js';
|
|
2
|
+
import { SocketConnection } from '../socket-connection.js';
|
|
3
|
+
jest.mock('socket.io-client', () => {
|
|
4
|
+
const mockSocket = {
|
|
5
|
+
on: jest.fn(),
|
|
6
|
+
emit: jest.fn(),
|
|
7
|
+
once: jest.fn(),
|
|
8
|
+
};
|
|
9
|
+
return {
|
|
10
|
+
io: jest.fn(() => mockSocket),
|
|
11
|
+
};
|
|
12
|
+
});
|
|
2
13
|
describe('QueryBuilder', () => {
|
|
14
|
+
let mockRawRequest;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
mockRawRequest = jest.fn().mockResolvedValue({ execute: [] });
|
|
17
|
+
SocketConnection.prototype.rawRequest = mockRawRequest;
|
|
18
|
+
});
|
|
3
19
|
// @ts-ignore
|
|
4
20
|
const qb = createQueryBuilder({
|
|
5
21
|
baseUrl: 'http://localhost',
|
|
6
22
|
apiKey: 'test',
|
|
7
23
|
});
|
|
8
|
-
it('should compile a select query', () => {
|
|
9
|
-
|
|
24
|
+
it('should compile a select query and execute', async () => {
|
|
25
|
+
await qb
|
|
10
26
|
.selectFrom('customers')
|
|
11
27
|
.select(['firstName', 'lastName'])
|
|
12
28
|
.where('firstName', '=', 'John')
|
|
13
29
|
.orderBy('lastName', 'asc')
|
|
14
30
|
.paginate(1, 10)
|
|
15
|
-
.
|
|
31
|
+
.execute();
|
|
32
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
33
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
16
34
|
expect(variables.metadata[0]).toMatchObject({
|
|
17
35
|
type: 'select',
|
|
18
36
|
tableName: 'customers',
|
|
@@ -31,26 +49,30 @@ describe('QueryBuilder', () => {
|
|
|
31
49
|
pagination: { offset: 0, limit: 10 },
|
|
32
50
|
});
|
|
33
51
|
});
|
|
34
|
-
it('should compile an insert query', () => {
|
|
35
|
-
|
|
52
|
+
it('should compile an insert query and execute', async () => {
|
|
53
|
+
await qb
|
|
36
54
|
.insertInto('customers')
|
|
37
55
|
.values({
|
|
38
56
|
firstName: 'Jane',
|
|
39
57
|
lastName: 'Doe',
|
|
40
58
|
})
|
|
41
|
-
.
|
|
59
|
+
.execute();
|
|
60
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
61
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
42
62
|
expect(variables.metadata[0]).toMatchObject({
|
|
43
63
|
type: 'create',
|
|
44
64
|
tableName: 'customers',
|
|
45
65
|
createdRecords: [{ firstName: 'Jane', lastName: 'Doe' }],
|
|
46
66
|
});
|
|
47
67
|
});
|
|
48
|
-
it('should compile an update query', () => {
|
|
49
|
-
|
|
68
|
+
it('should compile an update query and execute', async () => {
|
|
69
|
+
await qb
|
|
50
70
|
.update('customers')
|
|
51
71
|
.set({ lastName: 'Smith' })
|
|
52
72
|
.where('id', '=', 1)
|
|
53
|
-
.
|
|
73
|
+
.execute();
|
|
74
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
75
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
54
76
|
expect(variables.metadata[0]).toMatchObject({
|
|
55
77
|
type: 'update',
|
|
56
78
|
tableName: 'customers',
|
|
@@ -67,11 +89,10 @@ describe('QueryBuilder', () => {
|
|
|
67
89
|
},
|
|
68
90
|
});
|
|
69
91
|
});
|
|
70
|
-
it('should compile a delete query', () => {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.compile();
|
|
92
|
+
it('should compile a delete query and execute', async () => {
|
|
93
|
+
await qb.deleteFrom('customers').where('id', '=', 1).execute();
|
|
94
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
95
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
75
96
|
expect(variables.metadata[0]).toMatchObject({
|
|
76
97
|
type: 'delete',
|
|
77
98
|
tableName: 'customers',
|
|
@@ -87,15 +108,17 @@ describe('QueryBuilder', () => {
|
|
|
87
108
|
},
|
|
88
109
|
});
|
|
89
110
|
});
|
|
90
|
-
it('should compile a batch query', async () => {
|
|
91
|
-
|
|
111
|
+
it('should compile a batch query and execute', async () => {
|
|
112
|
+
await qb
|
|
92
113
|
.batch([
|
|
93
114
|
qb.selectFrom('customers').select(['firstName', 'lastName']),
|
|
94
115
|
qb
|
|
95
116
|
.insertInto('customers')
|
|
96
117
|
.values({ firstName: 'John', lastName: 'Doe' }),
|
|
97
118
|
])
|
|
98
|
-
.
|
|
119
|
+
.execute();
|
|
120
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
121
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
99
122
|
expect(variables.metadata).toHaveLength(2);
|
|
100
123
|
expect(variables.metadata[0]).toMatchObject({
|
|
101
124
|
type: 'select',
|
|
@@ -106,14 +129,16 @@ describe('QueryBuilder', () => {
|
|
|
106
129
|
tableName: 'customers',
|
|
107
130
|
});
|
|
108
131
|
});
|
|
109
|
-
it('should compile an aggregate query', () => {
|
|
110
|
-
|
|
132
|
+
it('should compile an aggregate query and execute', async () => {
|
|
133
|
+
await qb
|
|
111
134
|
.aggregateFrom('customers')
|
|
112
135
|
.groupBy('firstName', 'asc')
|
|
113
136
|
.withAggregates({
|
|
114
137
|
id: ['sum'],
|
|
115
138
|
})
|
|
116
|
-
.
|
|
139
|
+
.execute();
|
|
140
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
141
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
117
142
|
expect(variables.metadata[0]).toMatchObject({
|
|
118
143
|
type: 'aggregation',
|
|
119
144
|
tableName: 'customers',
|
|
@@ -123,11 +148,13 @@ describe('QueryBuilder', () => {
|
|
|
123
148
|
},
|
|
124
149
|
});
|
|
125
150
|
});
|
|
126
|
-
it('should compile a cross-table query', () => {
|
|
127
|
-
|
|
151
|
+
it('should compile a cross-table query and execute', async () => {
|
|
152
|
+
await qb
|
|
128
153
|
.selectFrom('customers')
|
|
129
154
|
.where('orders', 'hasAnyOf', qb => qb.where('amount', '>', 100))
|
|
130
|
-
.
|
|
155
|
+
.execute();
|
|
156
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(1);
|
|
157
|
+
const variables = mockRawRequest.mock.calls[0][1];
|
|
131
158
|
expect(variables.metadata[0]).toMatchObject({
|
|
132
159
|
type: 'select',
|
|
133
160
|
tableName: 'customers',
|
|
@@ -155,5 +182,81 @@ describe('QueryBuilder', () => {
|
|
|
155
182
|
},
|
|
156
183
|
});
|
|
157
184
|
});
|
|
185
|
+
it('should handle a successful transaction', async () => {
|
|
186
|
+
const mockRawRequest = jest
|
|
187
|
+
.fn()
|
|
188
|
+
.mockResolvedValueOnce({
|
|
189
|
+
startTransaction: 'test-transaction-id',
|
|
190
|
+
})
|
|
191
|
+
.mockResolvedValueOnce({ execute: [] })
|
|
192
|
+
.mockResolvedValueOnce({ commitTransaction: true });
|
|
193
|
+
SocketConnection.prototype.rawRequest = mockRawRequest;
|
|
194
|
+
// @ts-ignore
|
|
195
|
+
const qb = createQueryBuilder({
|
|
196
|
+
baseUrl: 'http://localhost',
|
|
197
|
+
apiKey: 'test',
|
|
198
|
+
});
|
|
199
|
+
await qb.transaction(txQb => {
|
|
200
|
+
return txQb
|
|
201
|
+
.insertInto('customers')
|
|
202
|
+
.values({ firstName: 'John', lastName: 'Doe' })
|
|
203
|
+
.execute();
|
|
204
|
+
});
|
|
205
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(3);
|
|
206
|
+
const startTransactionCall = mockRawRequest.mock.calls[0];
|
|
207
|
+
expect(startTransactionCall[0]).toContain('startTransaction');
|
|
208
|
+
const executeCall = mockRawRequest.mock.calls[1];
|
|
209
|
+
expect(executeCall[3]).toBe('test-transaction-id');
|
|
210
|
+
const commitTransactionCall = mockRawRequest.mock.calls[2];
|
|
211
|
+
expect(commitTransactionCall[0]).toContain('commitTransaction');
|
|
212
|
+
expect(commitTransactionCall[3]).toBe('test-transaction-id');
|
|
213
|
+
});
|
|
214
|
+
it('should handle a failed transaction and rollback', async () => {
|
|
215
|
+
const transactionId = 'test-transaction-id-fail';
|
|
216
|
+
const errorMessage = 'Something went wrong';
|
|
217
|
+
const mockRawRequest = jest
|
|
218
|
+
.fn()
|
|
219
|
+
.mockResolvedValueOnce({ startTransaction: transactionId })
|
|
220
|
+
.mockRejectedValueOnce(new Error(errorMessage))
|
|
221
|
+
.mockResolvedValueOnce({ rollbackTransaction: true });
|
|
222
|
+
SocketConnection.prototype.rawRequest = mockRawRequest;
|
|
223
|
+
// @ts-ignore
|
|
224
|
+
const qb = createQueryBuilder({
|
|
225
|
+
baseUrl: 'http://localhost',
|
|
226
|
+
apiKey: 'test',
|
|
227
|
+
});
|
|
228
|
+
await expect(qb.transaction(txQb => {
|
|
229
|
+
return txQb
|
|
230
|
+
.insertInto('customers')
|
|
231
|
+
.values({ firstName: 'John', lastName: 'Doe' })
|
|
232
|
+
.execute();
|
|
233
|
+
})).rejects.toThrow(errorMessage);
|
|
234
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(3);
|
|
235
|
+
const startTransactionCall = mockRawRequest.mock.calls[0];
|
|
236
|
+
expect(startTransactionCall[0]).toContain('startTransaction');
|
|
237
|
+
const executeCall = mockRawRequest.mock.calls[1];
|
|
238
|
+
expect(executeCall[3]).toBe(transactionId);
|
|
239
|
+
const rollbackTransactionCall = mockRawRequest.mock.calls[2];
|
|
240
|
+
expect(rollbackTransactionCall[0]).toContain('rollbackTransaction');
|
|
241
|
+
expect(rollbackTransactionCall[3]).toBe(transactionId);
|
|
242
|
+
});
|
|
243
|
+
it('should not have transaction method within a transaction', async () => {
|
|
244
|
+
const mockRawRequest = jest
|
|
245
|
+
.fn()
|
|
246
|
+
.mockResolvedValueOnce({
|
|
247
|
+
startTransaction: 'test-transaction-id-no-nested',
|
|
248
|
+
})
|
|
249
|
+
.mockResolvedValueOnce({ commitTransaction: true });
|
|
250
|
+
SocketConnection.prototype.rawRequest = mockRawRequest;
|
|
251
|
+
// @ts-ignore
|
|
252
|
+
const qb = createQueryBuilder({
|
|
253
|
+
baseUrl: 'http://localhost',
|
|
254
|
+
apiKey: 'test',
|
|
255
|
+
});
|
|
256
|
+
await qb.transaction(async (txQb) => {
|
|
257
|
+
expect(txQb).not.toHaveProperty('transaction');
|
|
258
|
+
});
|
|
259
|
+
expect(mockRawRequest).toHaveBeenCalledTimes(2);
|
|
260
|
+
});
|
|
158
261
|
});
|
|
159
262
|
//# sourceMappingURL=query-builder.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-builder.spec.js","sourceRoot":"","sources":["../../../src/__tests__/query-builder.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"query-builder.spec.js","sourceRoot":"","sources":["../../../src/__tests__/query-builder.spec.ts"],"names":[],"mappings":"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"}
|