@taylordb/query-builder 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{src → cjs}/__tests__/query-builder.spec.js +1 -1
- package/dist/{src → cjs}/__tests__/query-builder.spec.js.map +1 -1
- package/dist/{src → cjs}/aggregation-query-builder.d.ts +1 -0
- package/dist/{src → cjs}/aggregation-query-builder.js +4 -1
- package/dist/{src → cjs}/aggregation-query-builder.js.map +1 -1
- package/dist/cjs/batch-query-builder.d.ts +27 -0
- package/dist/{src → cjs}/batch-query-builder.js +10 -0
- package/dist/cjs/batch-query-builder.js.map +1 -0
- package/dist/cjs/executor.d.ts +15 -0
- package/dist/cjs/executor.js +67 -0
- package/dist/cjs/executor.js.map +1 -0
- package/dist/{src → cjs}/insert-query-builder.d.ts +8 -6
- package/dist/{src → cjs}/insert-query-builder.js +2 -1
- package/dist/cjs/insert-query-builder.js.map +1 -0
- package/dist/{src → cjs}/query-builder.d.ts +4 -2
- package/dist/{src → cjs}/query-builder.js +7 -0
- package/dist/cjs/query-builder.js.map +1 -0
- package/dist/cjs/subscription-manager.d.ts +19 -0
- package/dist/cjs/subscription-manager.js +105 -0
- package/dist/cjs/subscription-manager.js.map +1 -0
- package/dist/esm/@types/aggregate.d.ts +28 -0
- package/dist/esm/@types/aggregate.js +2 -0
- package/dist/esm/@types/aggregate.js.map +1 -0
- package/dist/esm/@types/delete.d.ts +2 -0
- package/dist/esm/@types/delete.js +2 -0
- package/dist/esm/@types/delete.js.map +1 -0
- package/dist/esm/@types/insert.d.ts +8 -0
- package/dist/esm/@types/insert.js +2 -0
- package/dist/esm/@types/insert.js.map +1 -0
- package/dist/esm/@types/internal-types.d.ts +24 -0
- package/dist/esm/@types/internal-types.js +2 -0
- package/dist/esm/@types/internal-types.js.map +1 -0
- package/dist/esm/@types/query-builder.d.ts +7 -0
- package/dist/esm/@types/query-builder.js +2 -0
- package/dist/esm/@types/query-builder.js.map +1 -0
- package/dist/esm/@types/type-helpers.d.ts +27 -0
- package/dist/esm/@types/type-helpers.js +2 -0
- package/dist/esm/@types/type-helpers.js.map +1 -0
- package/dist/esm/@types/update.d.ts +5 -0
- package/dist/esm/@types/update.js +2 -0
- package/dist/esm/@types/update.js.map +1 -0
- package/dist/esm/__tests__/query-builder.spec.js +127 -0
- package/dist/esm/__tests__/query-builder.spec.js.map +1 -0
- package/dist/{sample/sample-1 → esm/__tests__}/taylorclient.types.d.ts +0 -21
- package/dist/{src → esm}/__tests__/taylorclient.types.js +1 -2
- package/dist/esm/__tests__/taylorclient.types.js.map +1 -0
- package/dist/esm/aggregation-query-builder.d.ts +28 -0
- package/dist/esm/aggregation-query-builder.js +79 -0
- package/dist/esm/aggregation-query-builder.js.map +1 -0
- package/dist/esm/batch-query-builder.d.ts +27 -0
- package/dist/esm/batch-query-builder.js +34 -0
- package/dist/esm/batch-query-builder.js.map +1 -0
- package/dist/esm/delete-query-builder.d.ts +16 -0
- package/dist/esm/delete-query-builder.js +32 -0
- package/dist/esm/delete-query-builder.js.map +1 -0
- package/dist/esm/executor.d.ts +15 -0
- package/dist/esm/executor.js +63 -0
- package/dist/esm/executor.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/insert-query-builder.d.ts +19 -0
- package/dist/esm/insert-query-builder.js +65 -0
- package/dist/esm/insert-query-builder.js.map +1 -0
- package/dist/esm/query-builder.d.ts +54 -0
- package/dist/esm/query-builder.js +203 -0
- package/dist/esm/query-builder.js.map +1 -0
- package/dist/esm/selection-builder.d.ts +10 -0
- package/dist/esm/selection-builder.js +16 -0
- package/dist/esm/selection-builder.js.map +1 -0
- package/dist/esm/subscription-manager.d.ts +19 -0
- package/dist/esm/subscription-manager.js +98 -0
- package/dist/esm/subscription-manager.js.map +1 -0
- package/dist/esm/update-query-builder.d.ts +17 -0
- package/dist/esm/update-query-builder.js +39 -0
- package/dist/esm/update-query-builder.js.map +1 -0
- package/dist/esm/where-query-builder.d.ts +14 -0
- package/dist/esm/where-query-builder.js +63 -0
- package/dist/esm/where-query-builder.js.map +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +12 -9
- package/dist/sample/sample-1/index.js +0 -71
- package/dist/sample/sample-1/index.js.map +0 -1
- package/dist/sample/sample-1/taylorclient.types.js.map +0 -1
- package/dist/src/batch-query-builder.d.ts +0 -16
- package/dist/src/batch-query-builder.js.map +0 -1
- package/dist/src/executor.d.ts +0 -12
- package/dist/src/executor.js +0 -37
- package/dist/src/executor.js.map +0 -1
- package/dist/src/insert-query-builder.js.map +0 -1
- package/dist/src/query-builder.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src → cjs}/@types/aggregate.d.ts +0 -0
- /package/dist/{src → cjs}/@types/aggregate.js +0 -0
- /package/dist/{src → cjs}/@types/aggregate.js.map +0 -0
- /package/dist/{src → cjs}/@types/delete.d.ts +0 -0
- /package/dist/{src → cjs}/@types/delete.js +0 -0
- /package/dist/{src → cjs}/@types/delete.js.map +0 -0
- /package/dist/{src → cjs}/@types/insert.d.ts +0 -0
- /package/dist/{src → cjs}/@types/insert.js +0 -0
- /package/dist/{src → cjs}/@types/insert.js.map +0 -0
- /package/dist/{src → cjs}/@types/internal-types.d.ts +0 -0
- /package/dist/{src → cjs}/@types/internal-types.js +0 -0
- /package/dist/{src → cjs}/@types/internal-types.js.map +0 -0
- /package/dist/{src → cjs}/@types/query-builder.d.ts +0 -0
- /package/dist/{src → cjs}/@types/query-builder.js +0 -0
- /package/dist/{src → cjs}/@types/query-builder.js.map +0 -0
- /package/dist/{src → cjs}/@types/type-helpers.d.ts +0 -0
- /package/dist/{src → cjs}/@types/type-helpers.js +0 -0
- /package/dist/{src → cjs}/@types/type-helpers.js.map +0 -0
- /package/dist/{src → cjs}/@types/update.d.ts +0 -0
- /package/dist/{src → cjs}/@types/update.js +0 -0
- /package/dist/{src → cjs}/@types/update.js.map +0 -0
- /package/dist/{src → cjs}/__tests__/query-builder.spec.d.ts +0 -0
- /package/dist/{src → cjs}/__tests__/taylorclient.types.d.ts +0 -0
- /package/dist/{sample/sample-1 → cjs/__tests__}/taylorclient.types.js +0 -0
- /package/dist/{src → cjs}/__tests__/taylorclient.types.js.map +0 -0
- /package/dist/{src → cjs}/delete-query-builder.d.ts +0 -0
- /package/dist/{src → cjs}/delete-query-builder.js +0 -0
- /package/dist/{src → cjs}/delete-query-builder.js.map +0 -0
- /package/dist/{src → cjs}/index.d.ts +0 -0
- /package/dist/{src → cjs}/index.js +0 -0
- /package/dist/{src → cjs}/index.js.map +0 -0
- /package/dist/{src → cjs}/selection-builder.d.ts +0 -0
- /package/dist/{src → cjs}/selection-builder.js +0 -0
- /package/dist/{src → cjs}/selection-builder.js.map +0 -0
- /package/dist/{src → cjs}/update-query-builder.d.ts +0 -0
- /package/dist/{src → cjs}/update-query-builder.js +0 -0
- /package/dist/{src → cjs}/update-query-builder.js.map +0 -0
- /package/dist/{src → cjs}/where-query-builder.d.ts +0 -0
- /package/dist/{src → cjs}/where-query-builder.js +0 -0
- /package/dist/{src → cjs}/where-query-builder.js.map +0 -0
- /package/dist/{sample/sample-1/index.d.ts → esm/__tests__/query-builder.spec.d.ts} +0 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ColumnType, MetadataWithTableName, UpdateMutationMetaData } from '@taylordb/shared';
|
|
2
|
+
export type UpdateNode = MetadataWithTableName<UpdateMutationMetaData>;
|
|
3
|
+
export type Updatable<T> = {
|
|
4
|
+
[K in keyof T]?: T[K] extends ColumnType<any, any, infer I, any> ? I : never;
|
|
5
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/@types/update.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { createQueryBuilder } from '../index.js';
|
|
2
|
+
describe('QueryBuilder', () => {
|
|
3
|
+
// @ts-ignore
|
|
4
|
+
const qb = createQueryBuilder({
|
|
5
|
+
baseUrl: 'http://localhost',
|
|
6
|
+
apiKey: 'test',
|
|
7
|
+
});
|
|
8
|
+
it('should compile a select query', () => {
|
|
9
|
+
const { variables } = qb
|
|
10
|
+
.selectFrom('customers')
|
|
11
|
+
.select(['firstName', 'lastName'])
|
|
12
|
+
.where('firstName', '=', 'John')
|
|
13
|
+
.orderBy('lastName', 'asc')
|
|
14
|
+
.paginate(1, 10)
|
|
15
|
+
.compile();
|
|
16
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
17
|
+
type: 'select',
|
|
18
|
+
tableName: 'customers',
|
|
19
|
+
fields: ['firstName', 'lastName'],
|
|
20
|
+
filtersSet: {
|
|
21
|
+
conjunction: 'and',
|
|
22
|
+
filtersSet: [
|
|
23
|
+
{
|
|
24
|
+
field: 'firstName',
|
|
25
|
+
operator: '=',
|
|
26
|
+
value: 'John',
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
sorting: [{ field: 'lastName', direction: 'asc' }],
|
|
31
|
+
pagination: { offset: 0, limit: 10 },
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
it('should compile an insert query', () => {
|
|
35
|
+
const { variables } = qb
|
|
36
|
+
.insertInto('customers')
|
|
37
|
+
.values({
|
|
38
|
+
firstName: 'Jane',
|
|
39
|
+
lastName: 'Doe',
|
|
40
|
+
})
|
|
41
|
+
.compile();
|
|
42
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
43
|
+
type: 'create',
|
|
44
|
+
tableName: 'customers',
|
|
45
|
+
createdRecords: [{ firstName: 'Jane', lastName: 'Doe' }],
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it('should compile an update query', () => {
|
|
49
|
+
const { variables } = qb
|
|
50
|
+
.update('customers')
|
|
51
|
+
.set({ lastName: 'Smith' })
|
|
52
|
+
.where('id', '=', 1)
|
|
53
|
+
.compile();
|
|
54
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
55
|
+
type: 'update',
|
|
56
|
+
tableName: 'customers',
|
|
57
|
+
values: { lastName: 'Smith' },
|
|
58
|
+
filtersSet: {
|
|
59
|
+
conjunction: 'and',
|
|
60
|
+
filtersSet: [
|
|
61
|
+
{
|
|
62
|
+
field: 'id',
|
|
63
|
+
operator: '=',
|
|
64
|
+
value: 1,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
it('should compile a delete query', () => {
|
|
71
|
+
const { variables } = qb
|
|
72
|
+
.deleteFrom('customers')
|
|
73
|
+
.where('id', '=', 1)
|
|
74
|
+
.compile();
|
|
75
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
76
|
+
type: 'delete',
|
|
77
|
+
tableName: 'customers',
|
|
78
|
+
filtersSet: {
|
|
79
|
+
conjunction: 'and',
|
|
80
|
+
filtersSet: [
|
|
81
|
+
{
|
|
82
|
+
field: 'id',
|
|
83
|
+
operator: '=',
|
|
84
|
+
value: 1,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it('should compile a batch query', () => {
|
|
91
|
+
const { variables } = qb
|
|
92
|
+
.batch([
|
|
93
|
+
qb.selectFrom('customers').select(['firstName', 'lastName']),
|
|
94
|
+
qb
|
|
95
|
+
.insertInto('customers')
|
|
96
|
+
.values({ firstName: 'John', lastName: 'Doe' }),
|
|
97
|
+
])
|
|
98
|
+
.compile();
|
|
99
|
+
expect(variables.metadata).toHaveLength(2);
|
|
100
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
101
|
+
type: 'select',
|
|
102
|
+
tableName: 'customers',
|
|
103
|
+
});
|
|
104
|
+
expect(variables.metadata[1]).toMatchObject({
|
|
105
|
+
type: 'create',
|
|
106
|
+
tableName: 'customers',
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
it('should compile an aggregate query', () => {
|
|
110
|
+
const { variables } = qb
|
|
111
|
+
.aggregateFrom('customers')
|
|
112
|
+
.groupBy('firstName', 'asc')
|
|
113
|
+
.withAggregates({
|
|
114
|
+
id: ['sum'],
|
|
115
|
+
})
|
|
116
|
+
.compile();
|
|
117
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
118
|
+
type: 'aggregation',
|
|
119
|
+
tableName: 'customers',
|
|
120
|
+
groupings: [{ field: 'firstName', direction: 'asc' }],
|
|
121
|
+
aggregations: {
|
|
122
|
+
id: ['sum'],
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=query-builder.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.spec.js","sourceRoot":"","sources":["../../../src/__tests__/query-builder.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -134,8 +134,6 @@ export interface Tables {
|
|
|
134
134
|
attachmentTable: AttachmentTable;
|
|
135
135
|
collaboratorsTable: CollaboratorsTable;
|
|
136
136
|
customers: CustomersTable;
|
|
137
|
-
orders: OrdersTable;
|
|
138
|
-
products: ProductsTable;
|
|
139
137
|
}
|
|
140
138
|
export interface TaylorDatabase {
|
|
141
139
|
filters: Filters;
|
|
@@ -147,25 +145,6 @@ interface CustomersTable {
|
|
|
147
145
|
createdAt: DateColumnType;
|
|
148
146
|
updatedAt: DateColumnType;
|
|
149
147
|
firstName: TextColumnType;
|
|
150
|
-
phoneNumber: TextColumnType;
|
|
151
148
|
lastName: TextColumnType;
|
|
152
|
-
avatar: LinkColumnType<'attachmentTable'>;
|
|
153
|
-
orders: LinkColumnType<'orders'>;
|
|
154
|
-
}
|
|
155
|
-
interface OrdersTable {
|
|
156
|
-
id: NumberColumnType;
|
|
157
|
-
createdAt: DateColumnType;
|
|
158
|
-
updatedAt: DateColumnType;
|
|
159
|
-
address: TextColumnType;
|
|
160
|
-
customer: LinkColumnType<'customers'>;
|
|
161
|
-
products: LinkColumnType<'products'>;
|
|
162
|
-
}
|
|
163
|
-
interface ProductsTable {
|
|
164
|
-
id: NumberColumnType;
|
|
165
|
-
createdAt: DateColumnType;
|
|
166
|
-
updatedAt: DateColumnType;
|
|
167
|
-
name: TextColumnType;
|
|
168
|
-
sku: TextColumnType;
|
|
169
|
-
orders1: LinkColumnType<'orders'>;
|
|
170
149
|
}
|
|
171
150
|
export {};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Copyright (c) 2025 TaylorDB
|
|
4
3
|
*
|
|
5
4
|
* This source code is licensed under the MIT license found in the
|
|
6
5
|
* LICENSE file in the root directory of this source tree.
|
|
7
6
|
*/
|
|
8
|
-
|
|
7
|
+
export {};
|
|
9
8
|
//# sourceMappingURL=taylorclient.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taylorclient.types.js","sourceRoot":"","sources":["../../../src/__tests__/taylorclient.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AggregateNode, AggregateRecord } from './@types/aggregate.js';
|
|
2
|
+
import type { AnyDB } from './@types/internal-types.js';
|
|
3
|
+
import { Executor } from './executor.js';
|
|
4
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
5
|
+
export declare class AggregationQueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables'], TGroupBy extends readonly (keyof DB['tables'][TableName] & string)[] = [], TAggregations extends {
|
|
6
|
+
[K in keyof DB['tables'][TableName] & string]?: readonly (keyof DB['aggregates'][DB['tables'][TableName][K]['type']])[];
|
|
7
|
+
} = object> extends FilterableQueryBuilder<DB, TableName> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(node: AggregateNode, executor: Executor);
|
|
10
|
+
groupBy<const TField extends keyof DB['tables'][TableName] & string>(field: TField, direction?: 'asc' | 'desc'): AggregationQueryBuilder<DB, TableName, [
|
|
11
|
+
...TGroupBy,
|
|
12
|
+
TField
|
|
13
|
+
], TAggregations>;
|
|
14
|
+
withAggregates<const T extends {
|
|
15
|
+
[K in keyof DB['tables'][TableName] & string]?: readonly (keyof DB['aggregates'][DB['tables'][TableName][K]['type']])[];
|
|
16
|
+
}>(aggregates: T): AggregationQueryBuilder<DB, TableName, TGroupBy, TAggregations & T>;
|
|
17
|
+
limit(count: number): AggregationQueryBuilder<DB, TableName, TGroupBy, TAggregations>;
|
|
18
|
+
offset(count: number): AggregationQueryBuilder<DB, TableName, TGroupBy, TAggregations>;
|
|
19
|
+
paginate(page: number, limit: number): AggregationQueryBuilder<DB, TableName, TGroupBy, TAggregations>;
|
|
20
|
+
orderBy(field: keyof DB['tables'][TableName], direction?: 'asc' | 'desc'): AggregationQueryBuilder<DB, TableName, TGroupBy, TAggregations>;
|
|
21
|
+
execute(): Promise<AggregateRecord<DB, TableName, TGroupBy, TAggregations>[]>;
|
|
22
|
+
subscribe(callback: (result: AggregateRecord<DB, TableName, TGroupBy, TAggregations>[]) => void): Promise<void>;
|
|
23
|
+
compile(): {
|
|
24
|
+
query: string;
|
|
25
|
+
variables: Record<string, any>;
|
|
26
|
+
};
|
|
27
|
+
_prepareMetadata(): any;
|
|
28
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
2
|
+
export class AggregationQueryBuilder extends FilterableQueryBuilder {
|
|
3
|
+
#node;
|
|
4
|
+
constructor(node, executor) {
|
|
5
|
+
super(node, executor);
|
|
6
|
+
this.#node = node;
|
|
7
|
+
}
|
|
8
|
+
groupBy(field, direction = 'asc') {
|
|
9
|
+
const newGrouping = {
|
|
10
|
+
field,
|
|
11
|
+
direction,
|
|
12
|
+
};
|
|
13
|
+
return new AggregationQueryBuilder({
|
|
14
|
+
...this.#node,
|
|
15
|
+
groupings: [...(this.#node.groupings || []), newGrouping],
|
|
16
|
+
}, this._executor);
|
|
17
|
+
}
|
|
18
|
+
withAggregates(aggregates) {
|
|
19
|
+
const newAggregates = { ...this.#node.aggregations };
|
|
20
|
+
for (const key in aggregates) {
|
|
21
|
+
newAggregates[key] = aggregates[key].map(aggregate => aggregate);
|
|
22
|
+
}
|
|
23
|
+
return new AggregationQueryBuilder({
|
|
24
|
+
...this.#node,
|
|
25
|
+
aggregations: newAggregates,
|
|
26
|
+
}, this._executor);
|
|
27
|
+
}
|
|
28
|
+
limit(count) {
|
|
29
|
+
return new AggregationQueryBuilder({
|
|
30
|
+
...this.#node,
|
|
31
|
+
pagination: { ...this.#node.pagination, limit: count },
|
|
32
|
+
}, this._executor);
|
|
33
|
+
}
|
|
34
|
+
offset(count) {
|
|
35
|
+
return new AggregationQueryBuilder({
|
|
36
|
+
...this.#node,
|
|
37
|
+
pagination: { ...this.#node.pagination, offset: count },
|
|
38
|
+
}, this._executor);
|
|
39
|
+
}
|
|
40
|
+
paginate(page, limit) {
|
|
41
|
+
return this.offset((page - 1) * limit).limit(limit);
|
|
42
|
+
}
|
|
43
|
+
orderBy(field, direction = 'asc') {
|
|
44
|
+
const newSorting = {
|
|
45
|
+
field: field,
|
|
46
|
+
direction,
|
|
47
|
+
};
|
|
48
|
+
return new AggregationQueryBuilder({
|
|
49
|
+
...this.#node,
|
|
50
|
+
sorting: [...(this.#node.sorting || []), newSorting],
|
|
51
|
+
}, this._executor);
|
|
52
|
+
}
|
|
53
|
+
async execute() {
|
|
54
|
+
const response = await this._executor.execute(this);
|
|
55
|
+
return response;
|
|
56
|
+
}
|
|
57
|
+
subscribe(callback) {
|
|
58
|
+
return this._executor.subscribe([this], callback);
|
|
59
|
+
}
|
|
60
|
+
compile() {
|
|
61
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
62
|
+
const metadata = [this._prepareMetadata()];
|
|
63
|
+
return { query, variables: { metadata } };
|
|
64
|
+
}
|
|
65
|
+
_prepareMetadata() {
|
|
66
|
+
return {
|
|
67
|
+
type: 'aggregation',
|
|
68
|
+
tableName: this.#node.tableName,
|
|
69
|
+
groupings: this.#node.groupings,
|
|
70
|
+
aggregations: this.#node.aggregations,
|
|
71
|
+
...(this.#node.filtersSet.filtersSet.length > 0
|
|
72
|
+
? { filtersSet: this.#node.filtersSet }
|
|
73
|
+
: {}),
|
|
74
|
+
...(this.#node.pagination ? { pagination: this.#node.pagination } : {}),
|
|
75
|
+
...(this.#node.sorting ? { sorting: this.#node.sorting } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=aggregation-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregation-query-builder.js","sourceRoot":"","sources":["../../src/aggregation-query-builder.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,OAAO,uBAQX,SAAQ,sBAAqC;IAC7C,KAAK,CAAgB;IAErB,YAAY,IAAmB,EAAE,QAAkB;QACjD,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,OAAO,CACL,KAAa,EACb,YAA4B,KAAK;QAOjC,MAAM,WAAW,GAAkC;YACjD,KAAK;YACL,SAAS;SACV,CAAC;QAEF,OAAO,IAAI,uBAAuB,CAChC;YACE,GAAG,IAAI,CAAC,KAAK;YACb,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC;SAC1D,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,cAAc,CAMZ,UAAa;QAEb,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAE,CAAC,GAAG,CACvC,SAAS,CAAC,EAAE,CAAC,SAAmB,CACjC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,uBAAuB,CAChC;YACE,GAAG,IAAI,CAAC,KAAK;YACb,YAAY,EAAE,aAAa;SAC5B,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CACH,KAAa;QAEb,OAAO,IAAI,uBAAuB,CAChC;YACE,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;SACvD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,KAAa;QAEb,OAAO,IAAI,uBAAuB,CAChC;YACE,GAAG,IAAI,CAAC,KAAK;YACb,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE;SACxD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,QAAQ,CACN,IAAY,EACZ,KAAa;QAEb,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CACL,KAAoC,EACpC,YAA4B,KAAK;QAEjC,MAAM,UAAU,GAA+B;YAC7C,KAAK,EAAE,KAAe;YACtB,SAAS;SACV,CAAC;QAEF,OAAO,IAAI,uBAAuB,CAChC;YACE,GAAG,IAAI,CAAC,KAAK;YACb,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC;SACrD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QAGX,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAE1B,IAAI,CAAC,CAAC;QACV,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,CACP,QAES;QAET,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAC5E,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;YACrC,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;YACP,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AggregationQueryBuilder } from './aggregation-query-builder.js';
|
|
2
|
+
import { DeleteQueryBuilder } from './delete-query-builder.js';
|
|
3
|
+
import { Executor } from './executor.js';
|
|
4
|
+
import { InsertQueryBuilder } from './insert-query-builder.js';
|
|
5
|
+
import { QueryBuilder } from './query-builder.js';
|
|
6
|
+
import { UpdateQueryBuilder } from './update-query-builder.js';
|
|
7
|
+
export type AnySubscribableQueryBuilder = QueryBuilder<any, any, any, any> | AggregationQueryBuilder<any, any, any, any>;
|
|
8
|
+
export type AnyQueryBuilder = AnySubscribableQueryBuilder | InsertQueryBuilder<any, any, any> | UpdateQueryBuilder<any, any> | DeleteQueryBuilder<any, any>;
|
|
9
|
+
type InferExecuteResult<TBuilder> = TBuilder extends {
|
|
10
|
+
execute: () => Promise<any>;
|
|
11
|
+
} ? Awaited<ReturnType<TBuilder['execute']>> : never;
|
|
12
|
+
export type AreAllBuildersSubscribable<TBuilders extends readonly AnyQueryBuilder[]> = TBuilders[number] extends AnySubscribableQueryBuilder ? true : false;
|
|
13
|
+
export declare class BatchQueryBuilder<const TBuilders extends readonly AnyQueryBuilder[]> {
|
|
14
|
+
#private;
|
|
15
|
+
constructor(builders: TBuilders, executor: Executor);
|
|
16
|
+
execute(): Promise<{
|
|
17
|
+
-readonly [K in keyof TBuilders]: InferExecuteResult<TBuilders[K]>;
|
|
18
|
+
}>;
|
|
19
|
+
subscribe(callback: (...results: {
|
|
20
|
+
-readonly [K in keyof TBuilders]: InferExecuteResult<TBuilders[K]>;
|
|
21
|
+
}) => void): Promise<void>;
|
|
22
|
+
compile(): {
|
|
23
|
+
query: string;
|
|
24
|
+
variables: Record<string, any>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AggregationQueryBuilder } from './aggregation-query-builder.js';
|
|
2
|
+
import { QueryBuilder } from './query-builder.js';
|
|
3
|
+
export class BatchQueryBuilder {
|
|
4
|
+
#builders;
|
|
5
|
+
#executor;
|
|
6
|
+
constructor(builders, executor) {
|
|
7
|
+
this.#builders = builders;
|
|
8
|
+
this.#executor = executor;
|
|
9
|
+
}
|
|
10
|
+
async execute() {
|
|
11
|
+
return this.#executor.execute(this);
|
|
12
|
+
}
|
|
13
|
+
subscribe(callback) {
|
|
14
|
+
const builders = this.#builders.filter(builder => builder instanceof AggregationQueryBuilder ||
|
|
15
|
+
builder instanceof QueryBuilder);
|
|
16
|
+
if (builders.length !== this.#builders.length) {
|
|
17
|
+
throw new Error('Batch contains non-subscribable queries (e.g., insert, update, delete)');
|
|
18
|
+
}
|
|
19
|
+
return this.#executor.subscribe(builders, callback);
|
|
20
|
+
}
|
|
21
|
+
compile() {
|
|
22
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
23
|
+
const metadata = this.#builders.map(builder => {
|
|
24
|
+
return builder._prepareMetadata();
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
query,
|
|
28
|
+
variables: {
|
|
29
|
+
metadata,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=batch-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-query-builder.js","sourceRoot":"","sources":["../../src/batch-query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAuBlD,MAAM,OAAO,iBAAiB;IAG5B,SAAS,CAAY;IACrB,SAAS,CAAW;IAEpB,YAAY,QAAmB,EAAE,QAAkB;QACjD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO;QAGX,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CACP,QAIS;QAET,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CACpC,OAAO,CAAC,EAAE,CACR,OAAO,YAAY,uBAAuB;YAC1C,OAAO,YAAY,YAAY,CAClC,CAAC;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAe,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,MAAM,KAAK,GAAG,6DAA6D,CAAC;QAE5E,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC5C,OAAO,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,KAAK;YACL,SAAS,EAAE;gBACT,QAAQ;aACT;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { DeleteNode } from './@types/delete.js';
|
|
2
|
+
import type { AnyDB } from './@types/internal-types.js';
|
|
3
|
+
import { Executor } from './executor.js';
|
|
4
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
5
|
+
export declare class DeleteQueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables']> extends FilterableQueryBuilder<DB, TableName> {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(node: DeleteNode, executor: Executor);
|
|
8
|
+
execute(): Promise<{
|
|
9
|
+
affectedRecords: number;
|
|
10
|
+
}>;
|
|
11
|
+
compile(): {
|
|
12
|
+
query: string;
|
|
13
|
+
variables: Record<string, any>;
|
|
14
|
+
};
|
|
15
|
+
_prepareMetadata(): any;
|
|
16
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
2
|
+
export class DeleteQueryBuilder extends FilterableQueryBuilder {
|
|
3
|
+
#node;
|
|
4
|
+
constructor(node, executor) {
|
|
5
|
+
super(node, executor);
|
|
6
|
+
this.#node = node;
|
|
7
|
+
}
|
|
8
|
+
async execute() {
|
|
9
|
+
const response = await this._executor.execute(this);
|
|
10
|
+
return response[0];
|
|
11
|
+
}
|
|
12
|
+
compile() {
|
|
13
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
14
|
+
const metadata = [this._prepareMetadata()];
|
|
15
|
+
return {
|
|
16
|
+
query,
|
|
17
|
+
variables: {
|
|
18
|
+
metadata,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
_prepareMetadata() {
|
|
23
|
+
return {
|
|
24
|
+
type: 'delete',
|
|
25
|
+
tableName: this.#node.tableName,
|
|
26
|
+
...(this.#node.filtersSet.filtersSet.length > 0
|
|
27
|
+
? { filtersSet: this.#node.filtersSet }
|
|
28
|
+
: {}),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=delete-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-query-builder.js","sourceRoot":"","sources":["../../src/delete-query-builder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,OAAO,kBAGX,SAAQ,sBAAqC;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,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,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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AnySubscribableQueryBuilder } from './batch-query-builder.js';
|
|
2
|
+
interface Compilable {
|
|
3
|
+
compile(): {
|
|
4
|
+
query: string;
|
|
5
|
+
variables: Record<string, any>;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export declare class Executor {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(baseUrl: string, apiKey: string);
|
|
11
|
+
execute<T>(builder: Compilable): Promise<T>;
|
|
12
|
+
rawRequest<T>(query: string, variables: Record<string, any>, headers?: Record<string, string>): Promise<T>;
|
|
13
|
+
subscribe<TResult>(builders: AnySubscribableQueryBuilder[], callback: (result: TResult) => void): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { SubscriptionManager } from './subscription-manager.js';
|
|
2
|
+
const generateUUID = () => {
|
|
3
|
+
if (globalThis.crypto && globalThis.crypto.randomUUID) {
|
|
4
|
+
return globalThis.crypto.randomUUID();
|
|
5
|
+
}
|
|
6
|
+
// A simple fallback for environments without crypto.randomUUID
|
|
7
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
|
|
8
|
+
const r = (Math.random() * 16) | 0;
|
|
9
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
10
|
+
return v.toString(16);
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
export class Executor {
|
|
14
|
+
#baseUrl;
|
|
15
|
+
#apiKey;
|
|
16
|
+
#subscriptionManager;
|
|
17
|
+
constructor(baseUrl, apiKey) {
|
|
18
|
+
this.#baseUrl = baseUrl;
|
|
19
|
+
this.#apiKey = apiKey;
|
|
20
|
+
this.#subscriptionManager = new SubscriptionManager(this, {
|
|
21
|
+
baseUrl,
|
|
22
|
+
apiKey,
|
|
23
|
+
clientId: generateUUID(),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async execute(builder) {
|
|
27
|
+
const { query, variables } = builder.compile();
|
|
28
|
+
return this.rawRequest(query, variables);
|
|
29
|
+
}
|
|
30
|
+
async rawRequest(query, variables, headers) {
|
|
31
|
+
const response = await fetch(this.#baseUrl, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
Authorization: `Bearer ${this.#apiKey}`,
|
|
36
|
+
schema: 'readable',
|
|
37
|
+
...(headers ? { ...headers } : {}),
|
|
38
|
+
},
|
|
39
|
+
body: JSON.stringify({ query, variables }),
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text();
|
|
43
|
+
throw new Error(`Request failed with status ${response.status}: ${errorText}`);
|
|
44
|
+
}
|
|
45
|
+
const jsonResponse = await response.json();
|
|
46
|
+
if (jsonResponse.errors) {
|
|
47
|
+
throw new Error(`GraphQL errors: ${JSON.stringify(jsonResponse.errors)}`);
|
|
48
|
+
}
|
|
49
|
+
if (jsonResponse.data) {
|
|
50
|
+
const [firstKey] = Object.keys(jsonResponse.data);
|
|
51
|
+
if (Array.isArray(jsonResponse.data[firstKey])) {
|
|
52
|
+
return jsonResponse.data[firstKey];
|
|
53
|
+
}
|
|
54
|
+
return jsonResponse.data;
|
|
55
|
+
}
|
|
56
|
+
throw new Error('Unexpected response format');
|
|
57
|
+
}
|
|
58
|
+
async subscribe(builders, callback) {
|
|
59
|
+
const metadatas = builders.map(b => b._prepareMetadata());
|
|
60
|
+
return this.#subscriptionManager.subscribe(metadatas, callback);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createQueryBuilder } from './query-builder.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Insertable, InsertNode } from './@types/insert.js';
|
|
2
|
+
import type { AnyDB } from './@types/internal-types.js';
|
|
3
|
+
import { NonLinkColumnNames } from './@types/query-builder.js';
|
|
4
|
+
import { ResolveSelection } from './@types/type-helpers.js';
|
|
5
|
+
import { Executor } from './executor.js';
|
|
6
|
+
export declare class InsertQueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables'], Selection = {
|
|
7
|
+
id: number;
|
|
8
|
+
}> {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(node: InsertNode, executor: Executor);
|
|
11
|
+
values(values: Insertable<DB['tables'][TableName]> | Insertable<DB['tables'][TableName]>[]): InsertQueryBuilder<DB, TableName, Selection>;
|
|
12
|
+
returning<const TFields extends readonly NonLinkColumnNames<DB['tables'][TableName]>[]>(fields: TFields): InsertQueryBuilder<DB, TableName, ResolveSelection<DB, TableName, TFields, object>>;
|
|
13
|
+
execute(): Promise<Selection[]>;
|
|
14
|
+
compile(): {
|
|
15
|
+
query: string;
|
|
16
|
+
variables: Record<string, any>;
|
|
17
|
+
};
|
|
18
|
+
_prepareMetadata(): any;
|
|
19
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { QueryBuilder } from './query-builder.js';
|
|
2
|
+
import { SelectionBuilder } from './selection-builder.js';
|
|
3
|
+
export class InsertQueryBuilder {
|
|
4
|
+
#node;
|
|
5
|
+
#executor;
|
|
6
|
+
constructor(node, executor) {
|
|
7
|
+
this.#node = node;
|
|
8
|
+
this.#executor = executor;
|
|
9
|
+
}
|
|
10
|
+
values(values) {
|
|
11
|
+
return new InsertQueryBuilder({
|
|
12
|
+
...this.#node,
|
|
13
|
+
createdRecords: Array.isArray(values) ? values : [values],
|
|
14
|
+
}, this.#executor);
|
|
15
|
+
}
|
|
16
|
+
returning(fields) {
|
|
17
|
+
const newSelects = fields.map(field => {
|
|
18
|
+
if (typeof field === 'function') {
|
|
19
|
+
const builder = new SelectionBuilder(this.#executor);
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
const subQuery = field(builder);
|
|
22
|
+
return subQuery._node;
|
|
23
|
+
}
|
|
24
|
+
return field;
|
|
25
|
+
});
|
|
26
|
+
return new InsertQueryBuilder({
|
|
27
|
+
...this.#node,
|
|
28
|
+
returning: [...this.#node.returning, ...newSelects],
|
|
29
|
+
}, this.#executor);
|
|
30
|
+
}
|
|
31
|
+
async execute() {
|
|
32
|
+
return (await this.#executor.execute(this))[0];
|
|
33
|
+
}
|
|
34
|
+
compile() {
|
|
35
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
36
|
+
const metadata = [this._prepareMetadata()];
|
|
37
|
+
return {
|
|
38
|
+
query,
|
|
39
|
+
variables: {
|
|
40
|
+
metadata,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
_prepareMetadata() {
|
|
45
|
+
const buildSelects = (selects) => {
|
|
46
|
+
return selects.map(field => {
|
|
47
|
+
if (typeof field === 'string') {
|
|
48
|
+
return field;
|
|
49
|
+
}
|
|
50
|
+
const subQueryBuilder = new QueryBuilder(field, this.#executor);
|
|
51
|
+
return subQueryBuilder._prepareMetadata();
|
|
52
|
+
});
|
|
53
|
+
};
|
|
54
|
+
const returningSelection = this.#node.returning.length
|
|
55
|
+
? buildSelects(this.#node.returning)
|
|
56
|
+
: ['id'];
|
|
57
|
+
return {
|
|
58
|
+
type: 'create',
|
|
59
|
+
tableName: this.#node.tableName,
|
|
60
|
+
createdRecords: this.#node.createdRecords,
|
|
61
|
+
returning: returningSelection,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=insert-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert-query-builder.js","sourceRoot":"","sources":["../../src/insert-query-builder.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,OAAO,kBAAkB;IAK7B,KAAK,CAAa;IAClB,SAAS,CAAW;IAEpB,YAAY,IAAgB,EAAE,QAAkB;QAC9C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,MAAM,CACJ,MAEyC;QAEzC,OAAO,IAAI,kBAAkB,CAC3B;YACE,GAAG,IAAI,CAAC,KAAK;YACb,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;SAC1D,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,SAAS,CAKP,MAAe;QAMf,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACpC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAgB,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpE,aAAa;gBACb,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,OAAO,QAAQ,CAAC,KAAK,CAAC;YACxB,CAAC;YACD,OAAO,KAAe,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,kBAAkB,CAC3B;YACE,GAAG,IAAI,CAAC,KAAK;YACb,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,UAAU,CAAC;SACpD,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,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,MAAM,YAAY,GAAG,CAAC,OAA+B,EAAS,EAAE;YAC9D,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,MAAM,eAAe,GAAG,IAAI,YAAY,CACtC,KAAkB,EAClB,IAAI,CAAC,SAAS,CACf,CAAC;gBACF,OAAO,eAAe,CAAC,gBAAgB,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM;YACpD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YACpC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEX,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YAC/B,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACzC,SAAS,EAAE,kBAAkB;SAC9B,CAAC;IACJ,CAAC;CACF"}
|