@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.
Files changed (133) hide show
  1. package/dist/{src → cjs}/__tests__/query-builder.spec.js +1 -1
  2. package/dist/{src → cjs}/__tests__/query-builder.spec.js.map +1 -1
  3. package/dist/{src → cjs}/aggregation-query-builder.d.ts +1 -0
  4. package/dist/{src → cjs}/aggregation-query-builder.js +4 -1
  5. package/dist/{src → cjs}/aggregation-query-builder.js.map +1 -1
  6. package/dist/cjs/batch-query-builder.d.ts +27 -0
  7. package/dist/{src → cjs}/batch-query-builder.js +10 -0
  8. package/dist/cjs/batch-query-builder.js.map +1 -0
  9. package/dist/cjs/executor.d.ts +15 -0
  10. package/dist/cjs/executor.js +67 -0
  11. package/dist/cjs/executor.js.map +1 -0
  12. package/dist/{src → cjs}/insert-query-builder.d.ts +8 -6
  13. package/dist/{src → cjs}/insert-query-builder.js +2 -1
  14. package/dist/cjs/insert-query-builder.js.map +1 -0
  15. package/dist/{src → cjs}/query-builder.d.ts +4 -2
  16. package/dist/{src → cjs}/query-builder.js +7 -0
  17. package/dist/cjs/query-builder.js.map +1 -0
  18. package/dist/cjs/subscription-manager.d.ts +19 -0
  19. package/dist/cjs/subscription-manager.js +105 -0
  20. package/dist/cjs/subscription-manager.js.map +1 -0
  21. package/dist/esm/@types/aggregate.d.ts +28 -0
  22. package/dist/esm/@types/aggregate.js +2 -0
  23. package/dist/esm/@types/aggregate.js.map +1 -0
  24. package/dist/esm/@types/delete.d.ts +2 -0
  25. package/dist/esm/@types/delete.js +2 -0
  26. package/dist/esm/@types/delete.js.map +1 -0
  27. package/dist/esm/@types/insert.d.ts +8 -0
  28. package/dist/esm/@types/insert.js +2 -0
  29. package/dist/esm/@types/insert.js.map +1 -0
  30. package/dist/esm/@types/internal-types.d.ts +24 -0
  31. package/dist/esm/@types/internal-types.js +2 -0
  32. package/dist/esm/@types/internal-types.js.map +1 -0
  33. package/dist/esm/@types/query-builder.d.ts +7 -0
  34. package/dist/esm/@types/query-builder.js +2 -0
  35. package/dist/esm/@types/query-builder.js.map +1 -0
  36. package/dist/esm/@types/type-helpers.d.ts +27 -0
  37. package/dist/esm/@types/type-helpers.js +2 -0
  38. package/dist/esm/@types/type-helpers.js.map +1 -0
  39. package/dist/esm/@types/update.d.ts +5 -0
  40. package/dist/esm/@types/update.js +2 -0
  41. package/dist/esm/@types/update.js.map +1 -0
  42. package/dist/esm/__tests__/query-builder.spec.js +127 -0
  43. package/dist/esm/__tests__/query-builder.spec.js.map +1 -0
  44. package/dist/{sample/sample-1 → esm/__tests__}/taylorclient.types.d.ts +0 -21
  45. package/dist/{src → esm}/__tests__/taylorclient.types.js +1 -2
  46. package/dist/esm/__tests__/taylorclient.types.js.map +1 -0
  47. package/dist/esm/aggregation-query-builder.d.ts +28 -0
  48. package/dist/esm/aggregation-query-builder.js +79 -0
  49. package/dist/esm/aggregation-query-builder.js.map +1 -0
  50. package/dist/esm/batch-query-builder.d.ts +27 -0
  51. package/dist/esm/batch-query-builder.js +34 -0
  52. package/dist/esm/batch-query-builder.js.map +1 -0
  53. package/dist/esm/delete-query-builder.d.ts +16 -0
  54. package/dist/esm/delete-query-builder.js +32 -0
  55. package/dist/esm/delete-query-builder.js.map +1 -0
  56. package/dist/esm/executor.d.ts +15 -0
  57. package/dist/esm/executor.js +63 -0
  58. package/dist/esm/executor.js.map +1 -0
  59. package/dist/esm/index.d.ts +1 -0
  60. package/dist/esm/index.js +2 -0
  61. package/dist/esm/index.js.map +1 -0
  62. package/dist/esm/insert-query-builder.d.ts +19 -0
  63. package/dist/esm/insert-query-builder.js +65 -0
  64. package/dist/esm/insert-query-builder.js.map +1 -0
  65. package/dist/esm/query-builder.d.ts +54 -0
  66. package/dist/esm/query-builder.js +203 -0
  67. package/dist/esm/query-builder.js.map +1 -0
  68. package/dist/esm/selection-builder.d.ts +10 -0
  69. package/dist/esm/selection-builder.js +16 -0
  70. package/dist/esm/selection-builder.js.map +1 -0
  71. package/dist/esm/subscription-manager.d.ts +19 -0
  72. package/dist/esm/subscription-manager.js +98 -0
  73. package/dist/esm/subscription-manager.js.map +1 -0
  74. package/dist/esm/update-query-builder.d.ts +17 -0
  75. package/dist/esm/update-query-builder.js +39 -0
  76. package/dist/esm/update-query-builder.js.map +1 -0
  77. package/dist/esm/where-query-builder.d.ts +14 -0
  78. package/dist/esm/where-query-builder.js +63 -0
  79. package/dist/esm/where-query-builder.js.map +1 -0
  80. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  81. package/package.json +12 -9
  82. package/dist/sample/sample-1/index.js +0 -71
  83. package/dist/sample/sample-1/index.js.map +0 -1
  84. package/dist/sample/sample-1/taylorclient.types.js.map +0 -1
  85. package/dist/src/batch-query-builder.d.ts +0 -16
  86. package/dist/src/batch-query-builder.js.map +0 -1
  87. package/dist/src/executor.d.ts +0 -12
  88. package/dist/src/executor.js +0 -37
  89. package/dist/src/executor.js.map +0 -1
  90. package/dist/src/insert-query-builder.js.map +0 -1
  91. package/dist/src/query-builder.js.map +0 -1
  92. package/dist/tsconfig.tsbuildinfo +0 -1
  93. /package/dist/{src → cjs}/@types/aggregate.d.ts +0 -0
  94. /package/dist/{src → cjs}/@types/aggregate.js +0 -0
  95. /package/dist/{src → cjs}/@types/aggregate.js.map +0 -0
  96. /package/dist/{src → cjs}/@types/delete.d.ts +0 -0
  97. /package/dist/{src → cjs}/@types/delete.js +0 -0
  98. /package/dist/{src → cjs}/@types/delete.js.map +0 -0
  99. /package/dist/{src → cjs}/@types/insert.d.ts +0 -0
  100. /package/dist/{src → cjs}/@types/insert.js +0 -0
  101. /package/dist/{src → cjs}/@types/insert.js.map +0 -0
  102. /package/dist/{src → cjs}/@types/internal-types.d.ts +0 -0
  103. /package/dist/{src → cjs}/@types/internal-types.js +0 -0
  104. /package/dist/{src → cjs}/@types/internal-types.js.map +0 -0
  105. /package/dist/{src → cjs}/@types/query-builder.d.ts +0 -0
  106. /package/dist/{src → cjs}/@types/query-builder.js +0 -0
  107. /package/dist/{src → cjs}/@types/query-builder.js.map +0 -0
  108. /package/dist/{src → cjs}/@types/type-helpers.d.ts +0 -0
  109. /package/dist/{src → cjs}/@types/type-helpers.js +0 -0
  110. /package/dist/{src → cjs}/@types/type-helpers.js.map +0 -0
  111. /package/dist/{src → cjs}/@types/update.d.ts +0 -0
  112. /package/dist/{src → cjs}/@types/update.js +0 -0
  113. /package/dist/{src → cjs}/@types/update.js.map +0 -0
  114. /package/dist/{src → cjs}/__tests__/query-builder.spec.d.ts +0 -0
  115. /package/dist/{src → cjs}/__tests__/taylorclient.types.d.ts +0 -0
  116. /package/dist/{sample/sample-1 → cjs/__tests__}/taylorclient.types.js +0 -0
  117. /package/dist/{src → cjs}/__tests__/taylorclient.types.js.map +0 -0
  118. /package/dist/{src → cjs}/delete-query-builder.d.ts +0 -0
  119. /package/dist/{src → cjs}/delete-query-builder.js +0 -0
  120. /package/dist/{src → cjs}/delete-query-builder.js.map +0 -0
  121. /package/dist/{src → cjs}/index.d.ts +0 -0
  122. /package/dist/{src → cjs}/index.js +0 -0
  123. /package/dist/{src → cjs}/index.js.map +0 -0
  124. /package/dist/{src → cjs}/selection-builder.d.ts +0 -0
  125. /package/dist/{src → cjs}/selection-builder.js +0 -0
  126. /package/dist/{src → cjs}/selection-builder.js.map +0 -0
  127. /package/dist/{src → cjs}/update-query-builder.d.ts +0 -0
  128. /package/dist/{src → cjs}/update-query-builder.js +0 -0
  129. /package/dist/{src → cjs}/update-query-builder.js.map +0 -0
  130. /package/dist/{src → cjs}/where-query-builder.d.ts +0 -0
  131. /package/dist/{src → cjs}/where-query-builder.js +0 -0
  132. /package/dist/{src → cjs}/where-query-builder.js.map +0 -0
  133. /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"}