@taylordb/query-builder 0.1.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/README.md +113 -0
- package/dist/example.d.ts +1 -0
- package/dist/example.js +51 -0
- package/dist/example.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/insert-query-builder.d.ts +6 -0
- package/dist/insert-query-builder.js +9 -0
- package/dist/insert-query-builder.js.map +1 -0
- package/dist/internal-types.d.ts +19 -0
- package/dist/internal-types.js +2 -0
- package/dist/internal-types.js.map +1 -0
- package/dist/query-builder.d.ts +15 -0
- package/dist/query-builder.js +101 -0
- package/dist/query-builder.js.map +1 -0
- package/dist/sample/basic-example.d.ts +1 -0
- package/dist/sample/basic-example.js +55 -0
- package/dist/sample/basic-example.js.map +1 -0
- package/dist/sample/sample-1/index.d.ts +1 -0
- package/dist/sample/sample-1/index.js +68 -0
- package/dist/sample/sample-1/index.js.map +1 -0
- package/dist/sample/sample-1/taylorclient.types.d.ts +150 -0
- package/dist/sample/sample-1/taylorclient.types.js +9 -0
- package/dist/sample/sample-1/taylorclient.types.js.map +1 -0
- package/dist/src/@types/aggregate.d.ts +28 -0
- package/dist/src/@types/aggregate.js +3 -0
- package/dist/src/@types/aggregate.js.map +1 -0
- package/dist/src/@types/delete.d.ts +2 -0
- package/dist/src/@types/delete.js +3 -0
- package/dist/src/@types/delete.js.map +1 -0
- package/dist/src/@types/insert.d.ts +8 -0
- package/dist/src/@types/insert.js +3 -0
- package/dist/src/@types/insert.js.map +1 -0
- package/dist/src/@types/internal-types.d.ts +24 -0
- package/dist/src/@types/internal-types.js +3 -0
- package/dist/src/@types/internal-types.js.map +1 -0
- package/dist/src/@types/query-builder.d.ts +7 -0
- package/dist/src/@types/query-builder.js +3 -0
- package/dist/src/@types/query-builder.js.map +1 -0
- package/dist/src/@types/type-helpers.d.ts +27 -0
- package/dist/src/@types/type-helpers.js +3 -0
- package/dist/src/@types/type-helpers.js.map +1 -0
- package/dist/src/@types/update.d.ts +5 -0
- package/dist/src/@types/update.js +3 -0
- package/dist/src/@types/update.js.map +1 -0
- package/dist/src/__tests__/query-builder.spec.d.ts +1 -0
- package/dist/src/__tests__/query-builder.spec.js +129 -0
- package/dist/src/__tests__/query-builder.spec.js.map +1 -0
- package/dist/src/__tests__/taylorclient.types.d.ts +150 -0
- package/dist/src/__tests__/taylorclient.types.js +9 -0
- package/dist/src/__tests__/taylorclient.types.js.map +1 -0
- package/dist/src/aggregation-query-builder.d.ts +27 -0
- package/dist/src/aggregation-query-builder.js +80 -0
- package/dist/src/aggregation-query-builder.js.map +1 -0
- package/dist/src/batch-query-builder.d.ts +16 -0
- package/dist/src/batch-query-builder.js +28 -0
- package/dist/src/batch-query-builder.js.map +1 -0
- package/dist/src/delete-query-builder.d.ts +16 -0
- package/dist/src/delete-query-builder.js +36 -0
- package/dist/src/delete-query-builder.js.map +1 -0
- package/dist/src/executor.d.ts +12 -0
- package/dist/src/executor.js +37 -0
- package/dist/src/executor.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/insert-query-builder.d.ts +17 -0
- package/dist/src/insert-query-builder.js +68 -0
- package/dist/src/insert-query-builder.js.map +1 -0
- package/dist/src/query-builder.d.ts +52 -0
- package/dist/src/query-builder.js +202 -0
- package/dist/src/query-builder.js.map +1 -0
- package/dist/src/selection-builder.d.ts +10 -0
- package/dist/src/selection-builder.js +20 -0
- package/dist/src/selection-builder.js.map +1 -0
- package/dist/src/update-query-builder.d.ts +17 -0
- package/dist/src/update-query-builder.js +43 -0
- package/dist/src/update-query-builder.js.map +1 -0
- package/dist/src/where-query-builder.d.ts +14 -0
- package/dist/src/where-query-builder.js +68 -0
- package/dist/src/where-query-builder.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/where-query-builder.d.ts +12 -0
- package/dist/where-query-builder.js +55 -0
- package/dist/where-query-builder.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taylorclient.types.js","sourceRoot":"","sources":["../../../sample/sample-1/taylorclient.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AggregationQueryMetaData, MetadataWithTableName } from '@taylordb/shared';
|
|
2
|
+
import { AnyDB } from './internal-types.js';
|
|
3
|
+
import { InferDataType } from './type-helpers.js';
|
|
4
|
+
export type AggregationValue = number | null | object | undefined;
|
|
5
|
+
export type Aggregates<DB extends AnyDB, TName extends keyof DB['tables'], TAggregations extends {
|
|
6
|
+
[K in keyof DB['tables'][TName] & string]?: readonly (keyof DB['aggregates'][DB['tables'][TName][K]['type']])[];
|
|
7
|
+
}> = {
|
|
8
|
+
-readonly [K in keyof TAggregations & keyof DB['tables'][TName]]: {
|
|
9
|
+
-readonly [P in NonNullable<TAggregations[K]>[number]]: DB['aggregates'][DB['tables'][TName][K]['type']][P];
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
type Head<T extends readonly any[]> = T extends readonly [infer H, ...any[]] ? H : never;
|
|
13
|
+
type Tail<T extends readonly any[]> = T extends readonly [any, ...infer R] ? R : never;
|
|
14
|
+
export type AggregateRecord<DB extends AnyDB, TName extends keyof DB['tables'], TGroupBy extends readonly (keyof DB['tables'][TName] & string)[], TAggregations extends {
|
|
15
|
+
[K in keyof DB['tables'][TName] & string]?: readonly (keyof DB['aggregates'][DB['tables'][TName][K]['type']])[];
|
|
16
|
+
}> = TGroupBy extends readonly [] ? {
|
|
17
|
+
count: number;
|
|
18
|
+
aggregates: Aggregates<DB, TName, TAggregations>;
|
|
19
|
+
} : {
|
|
20
|
+
field: Head<TGroupBy>;
|
|
21
|
+
value: InferDataType<DB['tables'][TName][Head<TGroupBy>]>;
|
|
22
|
+
count: number;
|
|
23
|
+
aggregates: Aggregates<DB, TName, TAggregations>;
|
|
24
|
+
} & (Tail<TGroupBy> extends readonly [] ? object : {
|
|
25
|
+
children: AggregateRecord<DB, TName, Tail<TGroupBy>, TAggregations>[];
|
|
26
|
+
});
|
|
27
|
+
export type AggregateNode = Omit<MetadataWithTableName<AggregationQueryMetaData>, 'fields'>;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate.js","sourceRoot":"","sources":["../../../src/@types/aggregate.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/@types/delete.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ColumnType, CreateMutationMetaData, MetadataWithTableName } from '@taylordb/shared';
|
|
2
|
+
import { QueryNode } from './internal-types.js';
|
|
3
|
+
export type InsertNode = MetadataWithTableName<CreateMutationMetaData> & {
|
|
4
|
+
returning: (string | QueryNode)[];
|
|
5
|
+
};
|
|
6
|
+
export type Insertable<T> = {
|
|
7
|
+
[K in keyof T]?: T[K] extends ColumnType<any, any, infer I, any> ? I : never;
|
|
8
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insert.js","sourceRoot":"","sources":["../../../src/@types/insert.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { MetadataWithTableName, ObjConfigurationVisibleField, SelectQueryMetaData } from '@taylordb/shared';
|
|
2
|
+
export type Filters = {
|
|
3
|
+
[key: string]: {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
export type Aggregates = {
|
|
8
|
+
[key: string]: {
|
|
9
|
+
[key: string]: any;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export type AnyDB = {
|
|
13
|
+
filters: Filters;
|
|
14
|
+
aggregates: Aggregates;
|
|
15
|
+
tables: any;
|
|
16
|
+
};
|
|
17
|
+
export type SelectionQueryNode = ObjConfigurationVisibleField<string> & {
|
|
18
|
+
queryType: 'link';
|
|
19
|
+
};
|
|
20
|
+
export type RootQueryNode = Omit<MetadataWithTableName<SelectQueryMetaData>, 'fields'> & {
|
|
21
|
+
fields?: ('*' | string | SelectionQueryNode)[];
|
|
22
|
+
queryType: 'root';
|
|
23
|
+
};
|
|
24
|
+
export type QueryNode = SelectionQueryNode | RootQueryNode;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-types.js","sourceRoot":"","sources":["../../../src/@types/internal-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { LinkColumnType } from '@taylordb/shared';
|
|
2
|
+
export type NonLinkColumnNames<T> = {
|
|
3
|
+
[K in keyof T]: T[K] extends LinkColumnType<any> ? never : K;
|
|
4
|
+
}[keyof T];
|
|
5
|
+
export type LinkColumnNames<T> = {
|
|
6
|
+
[K in keyof T]: T[K] extends LinkColumnType<any> ? K : never;
|
|
7
|
+
}[keyof T];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../../src/@types/query-builder.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ColumnType, LinkColumnType } from '@taylordb/shared';
|
|
2
|
+
import { QueryBuilder } from '../query-builder.js';
|
|
3
|
+
import { AnyDB } from './internal-types.js';
|
|
4
|
+
import { LinkColumnNames, NonLinkColumnNames } from './query-builder.js';
|
|
5
|
+
export type InferDataType<TColumn> = TColumn extends ColumnType<any, any, any, infer D> ? D : never;
|
|
6
|
+
export type TableShape<TTable> = {
|
|
7
|
+
[K in keyof TTable]: InferDataType<TTable[K]>;
|
|
8
|
+
};
|
|
9
|
+
type InferSubqueryResult<TSubquery> = TSubquery extends QueryBuilder<any, any, infer TSelection, any> ? TSelection[] : never;
|
|
10
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
11
|
+
type InferSubqueryShape<TFunc> = TFunc extends (b: any) => QueryBuilder<any, any, infer SubSelection, infer LinkName> ? {
|
|
12
|
+
[K in LinkName & string]: SubSelection[];
|
|
13
|
+
} : object;
|
|
14
|
+
export type ResolveSelection<DB extends AnyDB, TName extends keyof DB['tables'], TFields extends readonly any[], TCurrentSelection> = TCurrentSelection & UnionToIntersection<{
|
|
15
|
+
[I in keyof TFields]: TFields[I] extends NonLinkColumnNames<DB['tables'][TName]> ? {
|
|
16
|
+
[K in TFields[I]]: InferDataType<DB['tables'][TName][K]>;
|
|
17
|
+
} : TFields[I] extends (b: any) => QueryBuilder<any, any, any, any> ? InferSubqueryShape<TFields[I]> : object;
|
|
18
|
+
}[number]>;
|
|
19
|
+
export type ResolveWithPlain<DB extends AnyDB, TName extends keyof DB['tables'], TRelations extends (LinkColumnNames<DB['tables'][TName]> & string) | readonly (LinkColumnNames<DB['tables'][TName]> & string)[], TCurrentSelection> = TCurrentSelection & UnionToIntersection<{
|
|
20
|
+
[K in TRelations extends readonly any[] ? TRelations[number] : TRelations]: {
|
|
21
|
+
[P in K]: TableShape<DB['tables'][DB['tables'][TName][P] extends LinkColumnType<infer L> ? L : never]>[];
|
|
22
|
+
};
|
|
23
|
+
}[TRelations extends readonly any[] ? TRelations[number] : TRelations]>;
|
|
24
|
+
export type ResolveWithObject<TRelations extends Record<string, (qb: any) => QueryBuilder<any, any, any, any>>, TCurrentSelection> = TCurrentSelection & {
|
|
25
|
+
-readonly [K in keyof TRelations]: InferSubqueryResult<ReturnType<TRelations[K]>>;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-helpers.js","sourceRoot":"","sources":["../../../src/@types/type-helpers.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_js_1 = require("../index.js");
|
|
4
|
+
describe('QueryBuilder', () => {
|
|
5
|
+
// @ts-ignore
|
|
6
|
+
const qb = (0, index_js_1.createQueryBuilder)({
|
|
7
|
+
baseUrl: 'http://localhost',
|
|
8
|
+
apiKey: 'test',
|
|
9
|
+
});
|
|
10
|
+
it('should compile a select query', () => {
|
|
11
|
+
const { variables } = qb
|
|
12
|
+
.selectFrom('customers')
|
|
13
|
+
.select(['firstName', 'lastName'])
|
|
14
|
+
.where('firstName', '=', 'John')
|
|
15
|
+
.orderBy('lastName', 'asc')
|
|
16
|
+
.paginate(1, 10)
|
|
17
|
+
.compile();
|
|
18
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
19
|
+
type: 'select',
|
|
20
|
+
tableName: 'customers',
|
|
21
|
+
fields: ['firstName', 'lastName'],
|
|
22
|
+
filtersSet: {
|
|
23
|
+
conjunction: 'and',
|
|
24
|
+
filtersSet: [
|
|
25
|
+
{
|
|
26
|
+
field: 'firstName',
|
|
27
|
+
operator: '=',
|
|
28
|
+
value: 'John',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
},
|
|
32
|
+
sorting: [{ field: 'lastName', direction: 'asc' }],
|
|
33
|
+
pagination: { offset: 0, limit: 10 },
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('should compile an insert query', () => {
|
|
37
|
+
const { variables } = qb
|
|
38
|
+
.insertInto('customers')
|
|
39
|
+
.values({
|
|
40
|
+
firstName: 'Jane',
|
|
41
|
+
lastName: 'Doe',
|
|
42
|
+
})
|
|
43
|
+
.compile();
|
|
44
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
45
|
+
type: 'create',
|
|
46
|
+
tableName: 'customers',
|
|
47
|
+
createdRecords: [{ firstName: 'Jane', lastName: 'Doe' }],
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it('should compile an update query', () => {
|
|
51
|
+
const { variables } = qb
|
|
52
|
+
.update('customers')
|
|
53
|
+
.set({ lastName: 'Smith' })
|
|
54
|
+
.where('id', '=', 1)
|
|
55
|
+
.compile();
|
|
56
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
57
|
+
type: 'update',
|
|
58
|
+
tableName: 'customers',
|
|
59
|
+
values: { lastName: 'Smith' },
|
|
60
|
+
filtersSet: {
|
|
61
|
+
conjunction: 'and',
|
|
62
|
+
filtersSet: [
|
|
63
|
+
{
|
|
64
|
+
field: 'id',
|
|
65
|
+
operator: '=',
|
|
66
|
+
value: 1,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
it('should compile a delete query', () => {
|
|
73
|
+
const { variables } = qb
|
|
74
|
+
.deleteFrom('customers')
|
|
75
|
+
.where('id', '=', 1)
|
|
76
|
+
.compile();
|
|
77
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
78
|
+
type: 'delete',
|
|
79
|
+
tableName: 'customers',
|
|
80
|
+
filtersSet: {
|
|
81
|
+
conjunction: 'and',
|
|
82
|
+
filtersSet: [
|
|
83
|
+
{
|
|
84
|
+
field: 'id',
|
|
85
|
+
operator: '=',
|
|
86
|
+
value: 1,
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
it('should compile a batch query', () => {
|
|
93
|
+
const { variables } = qb
|
|
94
|
+
.batch([
|
|
95
|
+
qb.selectFrom('customers').select(['firstName', 'lastName']),
|
|
96
|
+
qb
|
|
97
|
+
.insertInto('customers')
|
|
98
|
+
.values({ firstName: 'John', lastName: 'Doe' }),
|
|
99
|
+
])
|
|
100
|
+
.compile();
|
|
101
|
+
expect(variables.metadata).toHaveLength(2);
|
|
102
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
103
|
+
type: 'select',
|
|
104
|
+
tableName: 'customers',
|
|
105
|
+
});
|
|
106
|
+
expect(variables.metadata[1]).toMatchObject({
|
|
107
|
+
type: 'create',
|
|
108
|
+
tableName: 'customers',
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
it('should compile an aggregate query', () => {
|
|
112
|
+
const { variables } = qb
|
|
113
|
+
.aggregateFrom('customers')
|
|
114
|
+
.groupBy('firstName', 'asc')
|
|
115
|
+
.withAggregates({
|
|
116
|
+
id: ['sum'],
|
|
117
|
+
})
|
|
118
|
+
.compile();
|
|
119
|
+
expect(variables.metadata[0]).toMatchObject({
|
|
120
|
+
type: 'aggregate',
|
|
121
|
+
tableName: 'customers',
|
|
122
|
+
groupings: [{ field: 'firstName', direction: 'asc' }],
|
|
123
|
+
aggregations: {
|
|
124
|
+
id: ['sum'],
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# 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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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 TaylorDB
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
type IsWithinOperatorValue = 'pastWeek' | 'pastMonth' | 'pastYear' | 'nextWeek' | 'nextMonth' | 'nextYear' | 'daysFromNow' | 'daysAgo' | 'currentWeek' | 'currentMonth' | 'currentYear';
|
|
8
|
+
type DefaultDateFilterValue = ('today' | 'tomorrow' | 'yesterday' | 'oneWeekAgo' | 'oneWeekFromNow' | 'oneMonthAgo' | 'oneMonthFromNow') | ['exactDay' | 'exactTimestamp', string] | ['daysAgo' | 'daysFromNow', number];
|
|
9
|
+
export type Filters = {
|
|
10
|
+
text: {
|
|
11
|
+
'=': string;
|
|
12
|
+
'!=': string;
|
|
13
|
+
caseEqual: string;
|
|
14
|
+
hasAnyOf: string[];
|
|
15
|
+
contains: string;
|
|
16
|
+
startsWith: string;
|
|
17
|
+
endsWith: string;
|
|
18
|
+
doesNotContain: string;
|
|
19
|
+
};
|
|
20
|
+
number: {
|
|
21
|
+
'=': number;
|
|
22
|
+
'!=': number;
|
|
23
|
+
'>': number;
|
|
24
|
+
'>=': number;
|
|
25
|
+
'<': number;
|
|
26
|
+
'<=': number;
|
|
27
|
+
hasAnyOf: number[];
|
|
28
|
+
hasNoneOf: number[];
|
|
29
|
+
};
|
|
30
|
+
checkbox: {
|
|
31
|
+
'=': number;
|
|
32
|
+
};
|
|
33
|
+
link: {
|
|
34
|
+
hasAnyOf: number[];
|
|
35
|
+
hasAllOf: number[];
|
|
36
|
+
isExactly: number[];
|
|
37
|
+
'=': number;
|
|
38
|
+
hasNoneOf: number[];
|
|
39
|
+
};
|
|
40
|
+
date: {
|
|
41
|
+
'=': DefaultDateFilterValue;
|
|
42
|
+
'!=': DefaultDateFilterValue;
|
|
43
|
+
'<': DefaultDateFilterValue;
|
|
44
|
+
'>': DefaultDateFilterValue;
|
|
45
|
+
'<=': DefaultDateFilterValue;
|
|
46
|
+
'>=': DefaultDateFilterValue;
|
|
47
|
+
isWithIn: IsWithinOperatorValue | {
|
|
48
|
+
value: 'daysAgo' | 'daysFromNow';
|
|
49
|
+
date: number;
|
|
50
|
+
};
|
|
51
|
+
isEmpty: boolean;
|
|
52
|
+
isNotEmpty: boolean;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
type Aggregates = {
|
|
56
|
+
number: {
|
|
57
|
+
sum: number;
|
|
58
|
+
average: number;
|
|
59
|
+
median: number;
|
|
60
|
+
min: number | null;
|
|
61
|
+
max: number | null;
|
|
62
|
+
range: number;
|
|
63
|
+
standardDeviation: number;
|
|
64
|
+
histogram: Record<string, number>;
|
|
65
|
+
empty: number;
|
|
66
|
+
filled: number;
|
|
67
|
+
unique: number;
|
|
68
|
+
percentEmpty: number;
|
|
69
|
+
percentFilled: number;
|
|
70
|
+
percentUnique: number;
|
|
71
|
+
};
|
|
72
|
+
date: {
|
|
73
|
+
empty: number;
|
|
74
|
+
filled: number;
|
|
75
|
+
unique: number;
|
|
76
|
+
percentEmpty: number;
|
|
77
|
+
percentFilled: number;
|
|
78
|
+
percentUnique: number;
|
|
79
|
+
min: number | null;
|
|
80
|
+
max: number | null;
|
|
81
|
+
daysRange: number | null;
|
|
82
|
+
monthRange: number | null;
|
|
83
|
+
};
|
|
84
|
+
link: {
|
|
85
|
+
empty: number;
|
|
86
|
+
filled: number;
|
|
87
|
+
percentEmpty: number;
|
|
88
|
+
percentFilled: number;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
export type ColumnType<S, U, I, T> = {
|
|
92
|
+
raw: S;
|
|
93
|
+
insert: I;
|
|
94
|
+
update: U;
|
|
95
|
+
type: T;
|
|
96
|
+
};
|
|
97
|
+
export type DateColumnType = ColumnType<string | undefined, string | undefined, string | undefined, 'date'>;
|
|
98
|
+
export type TextColumnType = ColumnType<string | undefined, string | undefined, string | null, 'text'>;
|
|
99
|
+
export type LinkColumnType<T extends string> = ColumnType<object, number[] | {
|
|
100
|
+
newIds: number[];
|
|
101
|
+
deletedIds: number[];
|
|
102
|
+
} | undefined, number[] | undefined, 'link'> & {
|
|
103
|
+
linkedTo: T;
|
|
104
|
+
};
|
|
105
|
+
export type NumberColumnType = ColumnType<number | undefined, number | undefined, number | undefined, 'number'>;
|
|
106
|
+
export type CheckboxColumnType = ColumnType<boolean | undefined, boolean | undefined, boolean | undefined, 'checkbox'>;
|
|
107
|
+
export type SelectTable = {
|
|
108
|
+
id: NumberColumnType;
|
|
109
|
+
name: TextColumnType;
|
|
110
|
+
color: TextColumnType;
|
|
111
|
+
};
|
|
112
|
+
export type AttachmentTable = {
|
|
113
|
+
id: NumberColumnType;
|
|
114
|
+
name: TextColumnType;
|
|
115
|
+
metadata: TextColumnType;
|
|
116
|
+
size: NumberColumnType;
|
|
117
|
+
fileType: TextColumnType;
|
|
118
|
+
url: TextColumnType;
|
|
119
|
+
};
|
|
120
|
+
export type CollaboratorsTable = {
|
|
121
|
+
id: NumberColumnType;
|
|
122
|
+
name: TextColumnType;
|
|
123
|
+
emailAddress: TextColumnType;
|
|
124
|
+
avatar: TextColumnType;
|
|
125
|
+
};
|
|
126
|
+
export interface Tables {
|
|
127
|
+
/**
|
|
128
|
+
*
|
|
129
|
+
*
|
|
130
|
+
* Internal tables, these tables can not be queried directly.
|
|
131
|
+
*
|
|
132
|
+
*/
|
|
133
|
+
selectTable: SelectTable;
|
|
134
|
+
attachmentTable: AttachmentTable;
|
|
135
|
+
collaboratorsTable: CollaboratorsTable;
|
|
136
|
+
customers: CustomersTable;
|
|
137
|
+
}
|
|
138
|
+
export interface TaylorDatabase {
|
|
139
|
+
filters: Filters;
|
|
140
|
+
aggregates: Aggregates;
|
|
141
|
+
tables: Tables;
|
|
142
|
+
}
|
|
143
|
+
interface CustomersTable {
|
|
144
|
+
id: NumberColumnType;
|
|
145
|
+
createdAt: DateColumnType;
|
|
146
|
+
updatedAt: DateColumnType;
|
|
147
|
+
firstName: TextColumnType;
|
|
148
|
+
lastName: TextColumnType;
|
|
149
|
+
}
|
|
150
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright (c) 2025 TaylorDB
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
//# 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,27 @@
|
|
|
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
|
+
compile(): {
|
|
23
|
+
query: string;
|
|
24
|
+
variables: Record<string, any>;
|
|
25
|
+
};
|
|
26
|
+
_prepareMetadata(): any;
|
|
27
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AggregationQueryBuilder = void 0;
|
|
4
|
+
const where_query_builder_js_1 = require("./where-query-builder.js");
|
|
5
|
+
class AggregationQueryBuilder extends where_query_builder_js_1.FilterableQueryBuilder {
|
|
6
|
+
#node;
|
|
7
|
+
constructor(node, executor) {
|
|
8
|
+
super(node, executor);
|
|
9
|
+
this.#node = node;
|
|
10
|
+
}
|
|
11
|
+
groupBy(field, direction = 'asc') {
|
|
12
|
+
const newGrouping = {
|
|
13
|
+
field,
|
|
14
|
+
direction,
|
|
15
|
+
};
|
|
16
|
+
return new AggregationQueryBuilder({
|
|
17
|
+
...this.#node,
|
|
18
|
+
groupings: [...(this.#node.groupings || []), newGrouping],
|
|
19
|
+
}, this._executor);
|
|
20
|
+
}
|
|
21
|
+
withAggregates(aggregates) {
|
|
22
|
+
const newAggregates = { ...this.#node.aggregations };
|
|
23
|
+
for (const key in aggregates) {
|
|
24
|
+
newAggregates[key] = aggregates[key].map(aggregate => aggregate);
|
|
25
|
+
}
|
|
26
|
+
return new AggregationQueryBuilder({
|
|
27
|
+
...this.#node,
|
|
28
|
+
aggregations: newAggregates,
|
|
29
|
+
}, this._executor);
|
|
30
|
+
}
|
|
31
|
+
limit(count) {
|
|
32
|
+
return new AggregationQueryBuilder({
|
|
33
|
+
...this.#node,
|
|
34
|
+
pagination: { ...this.#node.pagination, limit: count },
|
|
35
|
+
}, this._executor);
|
|
36
|
+
}
|
|
37
|
+
offset(count) {
|
|
38
|
+
return new AggregationQueryBuilder({
|
|
39
|
+
...this.#node,
|
|
40
|
+
pagination: { ...this.#node.pagination, offset: count },
|
|
41
|
+
}, this._executor);
|
|
42
|
+
}
|
|
43
|
+
paginate(page, limit) {
|
|
44
|
+
return this.offset((page - 1) * limit).limit(limit);
|
|
45
|
+
}
|
|
46
|
+
orderBy(field, direction = 'asc') {
|
|
47
|
+
const newSorting = {
|
|
48
|
+
field: field,
|
|
49
|
+
direction,
|
|
50
|
+
};
|
|
51
|
+
return new AggregationQueryBuilder({
|
|
52
|
+
...this.#node,
|
|
53
|
+
sorting: [...(this.#node.sorting || []), newSorting],
|
|
54
|
+
}, this._executor);
|
|
55
|
+
}
|
|
56
|
+
async execute() {
|
|
57
|
+
const response = await this._executor.execute(this);
|
|
58
|
+
return response;
|
|
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: 'aggregate',
|
|
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
|
+
exports.AggregationQueryBuilder = AggregationQueryBuilder;
|
|
80
|
+
//# 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":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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 AnyQueryBuilder = QueryBuilder<any, any> | InsertQueryBuilder<any, any> | UpdateQueryBuilder<any, any> | DeleteQueryBuilder<any, any> | AggregationQueryBuilder<any, any>;
|
|
8
|
+
export declare class BatchQueryBuilder {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(builders: AnyQueryBuilder[], executor: Executor);
|
|
11
|
+
execute<T>(): Promise<T>;
|
|
12
|
+
compile(): {
|
|
13
|
+
query: string;
|
|
14
|
+
variables: Record<string, any>;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BatchQueryBuilder = void 0;
|
|
4
|
+
class BatchQueryBuilder {
|
|
5
|
+
#builders;
|
|
6
|
+
#executor;
|
|
7
|
+
constructor(builders, executor) {
|
|
8
|
+
this.#builders = builders;
|
|
9
|
+
this.#executor = executor;
|
|
10
|
+
}
|
|
11
|
+
async execute() {
|
|
12
|
+
return this.#executor.execute(this);
|
|
13
|
+
}
|
|
14
|
+
compile() {
|
|
15
|
+
const query = 'mutation ($metadata: JSON) { execute(metadata: $metadata) }';
|
|
16
|
+
const metadata = this.#builders.map(builder => {
|
|
17
|
+
return builder._prepareMetadata();
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
query,
|
|
21
|
+
variables: {
|
|
22
|
+
metadata,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.BatchQueryBuilder = BatchQueryBuilder;
|
|
28
|
+
//# 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":";;;AAcA,MAAa,iBAAiB;IAC5B,SAAS,CAAoB;IAC7B,SAAS,CAAW;IAEpB,YAAY,QAA2B,EAAE,QAAkB;QACzD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAI,IAAI,CAAC,CAAC;IACzC,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;AA3BD,8CA2BC"}
|