@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,54 @@
|
|
|
1
|
+
import { LinkColumnType } from '@taylordb/shared';
|
|
2
|
+
import { AnyDB, QueryNode, RootQueryNode, SelectionQueryNode } from './@types/internal-types.js';
|
|
3
|
+
import { LinkColumnNames, NonLinkColumnNames } from './@types/query-builder.js';
|
|
4
|
+
import { InferDataType, ResolveSelection, ResolveWithObject, ResolveWithPlain } from './@types/type-helpers.js';
|
|
5
|
+
import { AggregationQueryBuilder } from './aggregation-query-builder.js';
|
|
6
|
+
import { AnyQueryBuilder, AreAllBuildersSubscribable, BatchQueryBuilder } from './batch-query-builder.js';
|
|
7
|
+
import { DeleteQueryBuilder } from './delete-query-builder.js';
|
|
8
|
+
import { Executor } from './executor.js';
|
|
9
|
+
import { InsertQueryBuilder } from './insert-query-builder.js';
|
|
10
|
+
import { UpdateQueryBuilder } from './update-query-builder.js';
|
|
11
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
12
|
+
export declare class QueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables'], Selection = object, LinkName = null> extends FilterableQueryBuilder<DB, TableName> {
|
|
13
|
+
_node: QueryNode;
|
|
14
|
+
constructor(node: QueryNode, executor: Executor);
|
|
15
|
+
select<const TFields extends readonly NonLinkColumnNames<DB['tables'][TableName]>[]>(fields: TFields): QueryBuilder<DB, TableName, ResolveSelection<DB, TableName, TFields, Selection>>;
|
|
16
|
+
selectAll(): QueryBuilder<DB, TableName, Selection & {
|
|
17
|
+
[K in keyof DB['tables'][TableName]]: InferDataType<DB['tables'][TableName][K]>;
|
|
18
|
+
}>;
|
|
19
|
+
with<const TArg extends (LinkColumnNames<DB['tables'][TableName]> & string) | readonly (LinkColumnNames<DB['tables'][TableName]> & string)[]>(relations: TArg): QueryBuilder<DB, TableName, ResolveWithPlain<DB, TableName, TArg, Selection>>;
|
|
20
|
+
with<const TArg extends {
|
|
21
|
+
[K in LinkColumnNames<DB['tables'][TableName]>]?: (qb: QueryBuilder<DB, DB['tables'][TableName][K] extends LinkColumnType<any> ? DB['tables'][TableName][K]['linkedTo'] : never, object, K>) => QueryBuilder<DB, any, any, any>;
|
|
22
|
+
}>(relations: TArg): QueryBuilder<DB, TableName, ResolveWithObject<TArg, Selection>>;
|
|
23
|
+
limit(count: number): QueryBuilder<DB, TableName, Selection, LinkName>;
|
|
24
|
+
offset(count: number): QueryBuilder<DB, TableName, Selection, LinkName>;
|
|
25
|
+
paginate(page: number, limit: number): QueryBuilder<DB, TableName, Selection, LinkName>;
|
|
26
|
+
orderBy(field: keyof DB['tables'][TableName], direction?: 'asc' | 'desc'): QueryBuilder<DB, TableName, Selection, LinkName>;
|
|
27
|
+
execute(): Promise<Selection[]>;
|
|
28
|
+
executeTakeFirst(): Promise<Selection | null>;
|
|
29
|
+
subscribe(callback: (result: Selection[]) => void): Promise<void>;
|
|
30
|
+
compile(): {
|
|
31
|
+
query: string;
|
|
32
|
+
variables: Record<string, any>;
|
|
33
|
+
};
|
|
34
|
+
_prepareMetadata(): any;
|
|
35
|
+
isSelectionQueryNode(node: QueryNode): node is SelectionQueryNode;
|
|
36
|
+
isRootQueryNode(node: QueryNode): node is RootQueryNode;
|
|
37
|
+
}
|
|
38
|
+
export declare class RootQueryBuilder<DB extends AnyDB> {
|
|
39
|
+
#private;
|
|
40
|
+
constructor(config: {
|
|
41
|
+
baseUrl: string;
|
|
42
|
+
apiKey: string;
|
|
43
|
+
});
|
|
44
|
+
selectFrom<TableName extends keyof Omit<DB['tables'], 'selectTable' | 'attachmentTable' | 'collaboratorsTable'> & string>(from: TableName): QueryBuilder<DB, TableName>;
|
|
45
|
+
insertInto<TableName extends keyof Omit<DB['tables'], 'selectTable' | 'attachmentTable' | 'collaboratorsTable'> & string>(into: TableName): InsertQueryBuilder<DB, TableName>;
|
|
46
|
+
update<TableName extends keyof Omit<DB['tables'], 'selectTable' | 'attachmentTable' | 'collaboratorsTable'> & string>(tableName: TableName): UpdateQueryBuilder<DB, TableName>;
|
|
47
|
+
deleteFrom<TableName extends keyof Omit<DB['tables'], 'selectTable' | 'attachmentTable' | 'collaboratorsTable'> & string>(tableName: TableName): DeleteQueryBuilder<DB, TableName>;
|
|
48
|
+
batch<const TBuilders extends readonly AnyQueryBuilder[]>(builders: TBuilders): AreAllBuildersSubscribable<TBuilders> extends true ? BatchQueryBuilder<TBuilders> : Omit<BatchQueryBuilder<TBuilders>, 'subscribe'>;
|
|
49
|
+
aggregateFrom<TableName extends keyof Omit<DB['tables'], 'selectTable' | 'attachmentTable' | 'collaboratorsTable'> & string>(tableName: TableName): AggregationQueryBuilder<DB, TableName>;
|
|
50
|
+
}
|
|
51
|
+
export declare function createQueryBuilder<DB extends AnyDB>(config: {
|
|
52
|
+
baseUrl: string;
|
|
53
|
+
apiKey: string;
|
|
54
|
+
}): RootQueryBuilder<DB>;
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { AggregationQueryBuilder } from './aggregation-query-builder.js';
|
|
3
|
+
import { BatchQueryBuilder, } from './batch-query-builder.js';
|
|
4
|
+
import { DeleteQueryBuilder } from './delete-query-builder.js';
|
|
5
|
+
import { Executor } from './executor.js';
|
|
6
|
+
import { InsertQueryBuilder } from './insert-query-builder.js';
|
|
7
|
+
import { SelectionBuilder } from './selection-builder.js';
|
|
8
|
+
import { UpdateQueryBuilder } from './update-query-builder.js';
|
|
9
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
10
|
+
export class QueryBuilder extends FilterableQueryBuilder {
|
|
11
|
+
constructor(node, executor) {
|
|
12
|
+
super(node, executor);
|
|
13
|
+
this._node = node;
|
|
14
|
+
}
|
|
15
|
+
select(fields) {
|
|
16
|
+
return new QueryBuilder({
|
|
17
|
+
...this._node,
|
|
18
|
+
fields: [...this._node.fields, ...fields],
|
|
19
|
+
}, this._executor);
|
|
20
|
+
}
|
|
21
|
+
selectAll() {
|
|
22
|
+
return new QueryBuilder({
|
|
23
|
+
...this._node,
|
|
24
|
+
fields: ['*'],
|
|
25
|
+
}, this._executor);
|
|
26
|
+
}
|
|
27
|
+
with(arg) {
|
|
28
|
+
if (typeof arg === 'string' || Array.isArray(arg)) {
|
|
29
|
+
const relationNames = (Array.isArray(arg) ? arg : [arg]);
|
|
30
|
+
const newSelects = relationNames.map(relationName => {
|
|
31
|
+
const selectionBuilder = new SelectionBuilder(this._executor);
|
|
32
|
+
const subQuery = selectionBuilder
|
|
33
|
+
.useLink(relationName)
|
|
34
|
+
.selectAll();
|
|
35
|
+
return subQuery._node;
|
|
36
|
+
});
|
|
37
|
+
return new QueryBuilder({
|
|
38
|
+
...this._node,
|
|
39
|
+
fields: [...this._node.fields, ...newSelects],
|
|
40
|
+
}, this._executor);
|
|
41
|
+
}
|
|
42
|
+
const relations = arg;
|
|
43
|
+
const newSelects = Object.entries(relations).map(([relationName, configFn]) => {
|
|
44
|
+
const selectionBuilder = new SelectionBuilder(this._executor);
|
|
45
|
+
const initialSubQueryBuilder = selectionBuilder.useLink(relationName);
|
|
46
|
+
const configuredSubQueryBuilder = configFn(initialSubQueryBuilder);
|
|
47
|
+
return configuredSubQueryBuilder._node;
|
|
48
|
+
});
|
|
49
|
+
return new QueryBuilder({
|
|
50
|
+
...this._node,
|
|
51
|
+
fields: [...this._node.fields, ...newSelects],
|
|
52
|
+
}, this._executor);
|
|
53
|
+
}
|
|
54
|
+
limit(count) {
|
|
55
|
+
return new QueryBuilder({
|
|
56
|
+
...this._node,
|
|
57
|
+
pagination: { ...this._node.pagination, limit: count },
|
|
58
|
+
}, this._executor);
|
|
59
|
+
}
|
|
60
|
+
offset(count) {
|
|
61
|
+
return new QueryBuilder({
|
|
62
|
+
...this._node,
|
|
63
|
+
pagination: { ...this._node.pagination, offset: count },
|
|
64
|
+
}, this._executor);
|
|
65
|
+
}
|
|
66
|
+
paginate(page, limit) {
|
|
67
|
+
return this.offset((page - 1) * limit).limit(limit);
|
|
68
|
+
}
|
|
69
|
+
orderBy(field, direction = 'asc') {
|
|
70
|
+
const newSorting = {
|
|
71
|
+
field: field,
|
|
72
|
+
direction,
|
|
73
|
+
};
|
|
74
|
+
return new QueryBuilder({
|
|
75
|
+
...this._node,
|
|
76
|
+
sorting: [...(this._node.sorting || []), newSorting],
|
|
77
|
+
}, this._executor);
|
|
78
|
+
}
|
|
79
|
+
async execute() {
|
|
80
|
+
const response = await this._executor.execute(this);
|
|
81
|
+
return response[0];
|
|
82
|
+
}
|
|
83
|
+
async executeTakeFirst() {
|
|
84
|
+
const response = await this._executor.execute(this);
|
|
85
|
+
return response[0]?.[0] ?? null;
|
|
86
|
+
}
|
|
87
|
+
subscribe(callback) {
|
|
88
|
+
return this._executor.subscribe([this], callback);
|
|
89
|
+
}
|
|
90
|
+
compile() {
|
|
91
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
92
|
+
const metadata = [this._prepareMetadata()];
|
|
93
|
+
return {
|
|
94
|
+
query,
|
|
95
|
+
variables: {
|
|
96
|
+
metadata,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
_prepareMetadata() {
|
|
101
|
+
if (this.isSelectionQueryNode(this._node)) {
|
|
102
|
+
return {
|
|
103
|
+
field: this._node.field,
|
|
104
|
+
fields: this._node.fields.map(field => {
|
|
105
|
+
if (typeof field === 'string') {
|
|
106
|
+
return field;
|
|
107
|
+
}
|
|
108
|
+
return new QueryBuilder(field, this._executor)._prepareMetadata();
|
|
109
|
+
}),
|
|
110
|
+
...(this._node.filtersSet.filtersSet.length > 0
|
|
111
|
+
? { filtersSet: this._node.filtersSet }
|
|
112
|
+
: {}),
|
|
113
|
+
...(this._node.pagination ? { pagination: this._node.pagination } : {}),
|
|
114
|
+
...(this._node.sorting ? { sorting: this._node.sorting } : {}),
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
if (this.isRootQueryNode(this._node)) {
|
|
118
|
+
return {
|
|
119
|
+
type: 'select',
|
|
120
|
+
tableName: this._node.tableName,
|
|
121
|
+
fields: this._node.fields.map(field => {
|
|
122
|
+
if (typeof field === 'string') {
|
|
123
|
+
return field;
|
|
124
|
+
}
|
|
125
|
+
return new QueryBuilder(field, this._executor)._prepareMetadata();
|
|
126
|
+
}),
|
|
127
|
+
...(this._node.filtersSet.filtersSet.length > 0
|
|
128
|
+
? { filtersSet: this._node.filtersSet }
|
|
129
|
+
: {}),
|
|
130
|
+
...(this._node.pagination ? { pagination: this._node.pagination } : {}),
|
|
131
|
+
...(this._node.sorting ? { sorting: this._node.sorting } : {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
throw new Error('Invalid query node');
|
|
135
|
+
}
|
|
136
|
+
isSelectionQueryNode(node) {
|
|
137
|
+
return node.queryType === 'link';
|
|
138
|
+
}
|
|
139
|
+
isRootQueryNode(node) {
|
|
140
|
+
return node.queryType === 'root';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export class RootQueryBuilder {
|
|
144
|
+
#executor;
|
|
145
|
+
constructor(config) {
|
|
146
|
+
this.#executor = new Executor(config.baseUrl, config.apiKey);
|
|
147
|
+
}
|
|
148
|
+
selectFrom(from) {
|
|
149
|
+
return new QueryBuilder({
|
|
150
|
+
tableName: from,
|
|
151
|
+
fields: [],
|
|
152
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
153
|
+
type: 'select',
|
|
154
|
+
queryType: 'root',
|
|
155
|
+
}, this.#executor);
|
|
156
|
+
}
|
|
157
|
+
insertInto(into) {
|
|
158
|
+
return new InsertQueryBuilder({
|
|
159
|
+
tableName: into,
|
|
160
|
+
createdRecords: [],
|
|
161
|
+
returning: [],
|
|
162
|
+
type: 'create',
|
|
163
|
+
}, this.#executor);
|
|
164
|
+
}
|
|
165
|
+
update(tableName) {
|
|
166
|
+
return new UpdateQueryBuilder({
|
|
167
|
+
tableName: tableName,
|
|
168
|
+
values: {},
|
|
169
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
170
|
+
type: 'update',
|
|
171
|
+
}, this.#executor);
|
|
172
|
+
}
|
|
173
|
+
deleteFrom(tableName) {
|
|
174
|
+
return new DeleteQueryBuilder({
|
|
175
|
+
tableName: tableName,
|
|
176
|
+
deletedRecordIds: [],
|
|
177
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
178
|
+
type: 'delete',
|
|
179
|
+
}, this.#executor);
|
|
180
|
+
}
|
|
181
|
+
batch(builders) {
|
|
182
|
+
return new BatchQueryBuilder(builders, this.#executor);
|
|
183
|
+
}
|
|
184
|
+
aggregateFrom(tableName) {
|
|
185
|
+
const node = {
|
|
186
|
+
tableName: tableName,
|
|
187
|
+
type: 'aggregation',
|
|
188
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
189
|
+
groupings: [],
|
|
190
|
+
aggregations: {},
|
|
191
|
+
};
|
|
192
|
+
return new AggregationQueryBuilder(node, this.#executor);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const QBConfigSchema = z.object({
|
|
196
|
+
baseUrl: z.string().url(),
|
|
197
|
+
apiKey: z.string().nonempty(),
|
|
198
|
+
});
|
|
199
|
+
export function createQueryBuilder(config) {
|
|
200
|
+
QBConfigSchema.parse(config);
|
|
201
|
+
return new RootQueryBuilder(config);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LinkColumnType } from '@taylordb/shared';
|
|
2
|
+
import type { AnyDB } from './@types/internal-types.js';
|
|
3
|
+
import { LinkColumnNames } from './@types/query-builder.js';
|
|
4
|
+
import { Executor } from './executor.js';
|
|
5
|
+
import { QueryBuilder } from './query-builder.js';
|
|
6
|
+
export declare class SelectionBuilder<DB extends AnyDB, CurrentTableName extends keyof DB['tables']> {
|
|
7
|
+
_executor: Executor;
|
|
8
|
+
constructor(executor: Executor);
|
|
9
|
+
useLink<LinkName extends LinkColumnNames<DB['tables'][CurrentTableName]> & string>(from: LinkName): QueryBuilder<DB, DB["tables"][CurrentTableName][LinkName] extends LinkColumnType<any> ? DB["tables"][CurrentTableName][LinkName]["linkedTo"] : never, object, LinkName>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { QueryBuilder } from './query-builder.js';
|
|
2
|
+
export class SelectionBuilder {
|
|
3
|
+
_executor;
|
|
4
|
+
constructor(executor) {
|
|
5
|
+
this._executor = executor;
|
|
6
|
+
}
|
|
7
|
+
useLink(from) {
|
|
8
|
+
return new QueryBuilder({
|
|
9
|
+
field: from,
|
|
10
|
+
fields: [],
|
|
11
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
12
|
+
queryType: 'link',
|
|
13
|
+
}, this._executor);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=selection-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection-builder.js","sourceRoot":"","sources":["../../src/selection-builder.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,gBAAgB;IAI3B,SAAS,CAAW;IAEpB,YAAY,QAAkB;QAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,OAAO,CAEL,IAAc;QACd,OAAO,IAAI,YAAY,CAQrB;YACE,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;YAClD,SAAS,EAAE,MAAM;SAClB,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Executor } from './executor.js';
|
|
2
|
+
export type DriverSubscriptionResponse = {
|
|
3
|
+
id: string;
|
|
4
|
+
delta: object[];
|
|
5
|
+
tableName: string;
|
|
6
|
+
subscriptionId: string;
|
|
7
|
+
};
|
|
8
|
+
export declare class SubscriptionManager {
|
|
9
|
+
#private;
|
|
10
|
+
private executor;
|
|
11
|
+
private config;
|
|
12
|
+
constructor(executor: Executor, config: {
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
apiKey: string;
|
|
15
|
+
timeZone?: string;
|
|
16
|
+
clientId?: string;
|
|
17
|
+
});
|
|
18
|
+
subscribe<TResult>(metadatas: any[], callback: (...results: TResult[]) => void): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import jsonpatch from 'fast-json-patch';
|
|
2
|
+
import { io } from 'socket.io-client';
|
|
3
|
+
export class SubscriptionManager {
|
|
4
|
+
executor;
|
|
5
|
+
config;
|
|
6
|
+
#socket = null;
|
|
7
|
+
#subscriptions = new Map();
|
|
8
|
+
#isConnecting = false;
|
|
9
|
+
constructor(executor, config) {
|
|
10
|
+
this.executor = executor;
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async #connect() {
|
|
14
|
+
if (this.#socket || this.#isConnecting) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.#isConnecting = true;
|
|
18
|
+
try {
|
|
19
|
+
const socketUrl = this.config.baseUrl
|
|
20
|
+
.replace(/^http/, 'ws')
|
|
21
|
+
.replace('api', 'bamboo');
|
|
22
|
+
this.#socket = io(socketUrl, {
|
|
23
|
+
auth: {
|
|
24
|
+
token: this.config.apiKey,
|
|
25
|
+
'time-zone': this.config.timeZone || 'UTC',
|
|
26
|
+
'client-id': this.config.clientId,
|
|
27
|
+
},
|
|
28
|
+
query: {},
|
|
29
|
+
});
|
|
30
|
+
this.#socket.emit('listen', { clientId: this.config.clientId });
|
|
31
|
+
this.#socket.on('patch', this.#handlePatch.bind(this));
|
|
32
|
+
await new Promise((resolve, reject) => {
|
|
33
|
+
if (!this.#socket)
|
|
34
|
+
return reject('Socket not initialized');
|
|
35
|
+
this.#socket.on('connect', () => {
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
this.#socket.on('connect_error', err => {
|
|
39
|
+
reject(err);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
this.#socket.emit('subscribe', { clientId: this.config.clientId });
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
this.#isConnecting = false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async subscribe(metadatas, callback) {
|
|
49
|
+
await this.#connect();
|
|
50
|
+
const param = metadatas.map(metadata => ({
|
|
51
|
+
metadata,
|
|
52
|
+
options: {
|
|
53
|
+
returns: ['patch', 'affectedFields'],
|
|
54
|
+
},
|
|
55
|
+
}));
|
|
56
|
+
const result = await this.executor.rawRequest(`
|
|
57
|
+
query ($param: [SubscriptionMetadataInput]!) {
|
|
58
|
+
plugins {
|
|
59
|
+
subscriptions {
|
|
60
|
+
subscribe(subscriptions: $param) {
|
|
61
|
+
subscriptionId
|
|
62
|
+
data
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
`, { param }, { 'client-id': this.config.clientId });
|
|
68
|
+
const subscriptions = result.plugins.subscriptions.subscribe;
|
|
69
|
+
const initialData = subscriptions.map(s => s.data);
|
|
70
|
+
for (const sub of subscriptions) {
|
|
71
|
+
this.#subscriptions.set(sub.subscriptionId, {
|
|
72
|
+
data: sub.data,
|
|
73
|
+
callback: (patchedData) => {
|
|
74
|
+
// This needs to be more robust for batching.
|
|
75
|
+
// For now, we'll just update the single data and call back.
|
|
76
|
+
const idx = subscriptions.findIndex(s => s.subscriptionId === sub.subscriptionId);
|
|
77
|
+
if (idx !== -1) {
|
|
78
|
+
initialData[idx] = patchedData;
|
|
79
|
+
callback(...initialData);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
callback(...initialData);
|
|
85
|
+
}
|
|
86
|
+
#handlePatch(response) {
|
|
87
|
+
for (const patch of response.patches) {
|
|
88
|
+
const sub = this.#subscriptions.get(patch.subscriptionId);
|
|
89
|
+
if (sub) {
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
const { newDocument } = jsonpatch.applyPatch(sub.data, patch.delta);
|
|
92
|
+
sub.data = newDocument;
|
|
93
|
+
sub.callback(newDocument);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=subscription-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription-manager.js","sourceRoot":"","sources":["../../src/subscription-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AnyDB } from './@types/internal-types.js';
|
|
2
|
+
import type { Updatable, UpdateNode } from './@types/update.js';
|
|
3
|
+
import { Executor } from './executor.js';
|
|
4
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
5
|
+
export declare class UpdateQueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables']> extends FilterableQueryBuilder<DB, TableName> {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(node: UpdateNode, executor: Executor);
|
|
8
|
+
set(values: Updatable<DB['tables'][TableName]>): UpdateQueryBuilder<DB, TableName>;
|
|
9
|
+
execute(): Promise<{
|
|
10
|
+
affectedRecords: number;
|
|
11
|
+
}>;
|
|
12
|
+
compile(): {
|
|
13
|
+
query: string;
|
|
14
|
+
variables: Record<string, any>;
|
|
15
|
+
};
|
|
16
|
+
_prepareMetadata(): any;
|
|
17
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { FilterableQueryBuilder } from './where-query-builder.js';
|
|
2
|
+
export class UpdateQueryBuilder extends FilterableQueryBuilder {
|
|
3
|
+
#node;
|
|
4
|
+
constructor(node, executor) {
|
|
5
|
+
super(node, executor);
|
|
6
|
+
this.#node = node;
|
|
7
|
+
}
|
|
8
|
+
set(values) {
|
|
9
|
+
return new UpdateQueryBuilder({
|
|
10
|
+
...this.#node,
|
|
11
|
+
values,
|
|
12
|
+
}, this._executor);
|
|
13
|
+
}
|
|
14
|
+
async execute() {
|
|
15
|
+
const response = await this._executor.execute(this);
|
|
16
|
+
return response[0];
|
|
17
|
+
}
|
|
18
|
+
compile() {
|
|
19
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
20
|
+
const metadata = [this._prepareMetadata()];
|
|
21
|
+
return {
|
|
22
|
+
query,
|
|
23
|
+
variables: {
|
|
24
|
+
metadata,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
_prepareMetadata() {
|
|
29
|
+
return {
|
|
30
|
+
type: 'update',
|
|
31
|
+
tableName: this.#node.tableName,
|
|
32
|
+
values: this.#node.values,
|
|
33
|
+
...(this.#node.filtersSet.filtersSet.length > 0
|
|
34
|
+
? { filtersSet: this.#node.filtersSet }
|
|
35
|
+
: {}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=update-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-query-builder.js","sourceRoot":"","sources":["../../src/update-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,GAAG,CACD,MAA0C;QAE1C,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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ColumnType } from '@taylordb/shared';
|
|
2
|
+
import type { AnyDB, QueryNode } from './@types/internal-types.js';
|
|
3
|
+
import { Executor } from './executor.js';
|
|
4
|
+
export declare class FilterableQueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables']> {
|
|
5
|
+
_node: Pick<QueryNode, 'filtersSet'>;
|
|
6
|
+
_executor: Executor;
|
|
7
|
+
constructor(node: Pick<QueryNode, 'filtersSet'>, executor: Executor);
|
|
8
|
+
where<C extends keyof DB['tables'][TableName], O extends keyof DB['filters'][DB['tables'][TableName][C] extends ColumnType<any, any, any, infer T> ? T & keyof DB['filters'] : never]>(column: C, operator: O, value: DB['filters'][DB['tables'][TableName][C] extends ColumnType<any, any, any, infer T> ? T & keyof DB['filters'] : never][O]): this;
|
|
9
|
+
where<C extends (builder: WhereQueryBuilder<DB, TableName>) => FilterableQueryBuilder<DB, TableName>>(column: C): this;
|
|
10
|
+
orWhere<C extends keyof DB['tables'][TableName], O extends keyof DB['filters'][DB['tables'][TableName][C] extends ColumnType<any, any, any, infer T> ? T & keyof DB['filters'] : never]>(column: C, operator: O, value: DB['filters'][DB['tables'][TableName][C] extends ColumnType<any, any, any, infer T> ? T & keyof DB['filters'] : never][O]): this;
|
|
11
|
+
orWhere<C extends (builder: WhereQueryBuilder<DB, TableName>) => any>(column: C): this;
|
|
12
|
+
}
|
|
13
|
+
export declare class WhereQueryBuilder<DB extends AnyDB, TableName extends keyof DB['tables']> extends FilterableQueryBuilder<DB, TableName> {
|
|
14
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export class FilterableQueryBuilder {
|
|
2
|
+
_node;
|
|
3
|
+
_executor;
|
|
4
|
+
constructor(node, executor) {
|
|
5
|
+
this._node = node;
|
|
6
|
+
this._executor = executor;
|
|
7
|
+
}
|
|
8
|
+
where(column, operator, value) {
|
|
9
|
+
if (typeof column === 'function') {
|
|
10
|
+
const builder = new WhereQueryBuilder({
|
|
11
|
+
...this._node,
|
|
12
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
13
|
+
}, this._executor);
|
|
14
|
+
const result = column(builder);
|
|
15
|
+
return new this.constructor({
|
|
16
|
+
...this._node,
|
|
17
|
+
filtersSet: {
|
|
18
|
+
...this._node.filtersSet,
|
|
19
|
+
filtersSet: [
|
|
20
|
+
...this._node.filtersSet.filtersSet,
|
|
21
|
+
result._node.filtersSet,
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
}, this._executor);
|
|
25
|
+
}
|
|
26
|
+
const newWhere = {
|
|
27
|
+
field: column,
|
|
28
|
+
operator,
|
|
29
|
+
value,
|
|
30
|
+
};
|
|
31
|
+
return new this.constructor({
|
|
32
|
+
...this._node,
|
|
33
|
+
filtersSet: {
|
|
34
|
+
...this._node.filtersSet,
|
|
35
|
+
filtersSet: [...this._node.filtersSet.filtersSet, newWhere],
|
|
36
|
+
},
|
|
37
|
+
}, this._executor);
|
|
38
|
+
}
|
|
39
|
+
orWhere(column, operator, value) {
|
|
40
|
+
const newFilters = this._node.filtersSet.filtersSet;
|
|
41
|
+
if (typeof column === 'function') {
|
|
42
|
+
const builder = new WhereQueryBuilder({
|
|
43
|
+
...this._node,
|
|
44
|
+
filtersSet: { conjunction: 'and', filtersSet: [] },
|
|
45
|
+
}, this._executor);
|
|
46
|
+
const result = column(builder);
|
|
47
|
+
newFilters.push(result._node.filters);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
newFilters.push({ field: column, operator, value });
|
|
51
|
+
}
|
|
52
|
+
return new this.constructor({
|
|
53
|
+
...this._node,
|
|
54
|
+
filtersSet: {
|
|
55
|
+
conjunction: 'or',
|
|
56
|
+
filtersSet: newFilters,
|
|
57
|
+
},
|
|
58
|
+
}, this._executor);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class WhereQueryBuilder extends FilterableQueryBuilder {
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=where-query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"where-query-builder.js","sourceRoot":"","sources":["../../src/where-query-builder.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,sBAAsB;IAIjC,KAAK,CAAgC;IACrC,SAAS,CAAW;IAEpB,YAAY,IAAmC,EAAE,QAAkB;QACjE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IA6BD,KAAK,CAAC,MAAW,EAAE,QAAc,EAAE,KAAW;QAC5C,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,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,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,IAAK,IAAI,CAAC,WAAmB,CAClC;gBACE,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,EACD,IAAI,CAAC,SAAS,CACf,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAoB;YAChC,KAAK,EAAE,MAAgB;YACvB,QAAQ;YACR,KAAK;SACN,CAAC;QAEF,OAAO,IAAK,IAAI,CAAC,WAAmB,CAClC;YACE,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,QAAQ,CAAC;aAC5D;SACF,EACD,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IA2BD,OAAO,CAAC,MAAW,EAAE,QAAc,EAAE,KAAW;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;QAEpD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,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,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,IAAK,IAAI,CAAC,WAAmB,CAClC;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;AAED,MAAM,OAAO,iBAGX,SAAQ,sBAAqC;CAAG"}
|