-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtsql.d.ts
69 lines (58 loc) · 2.85 KB
/
tsql.d.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
declare module "tsql" {
export namespace tsql {
type Selection<TSelection, TEntity> = Partial<{
[TProperty in keyof TEntity]:
TEntity[TProperty] extends object
? TProperty extends keyof TSelection
? TSelection[TProperty]
: never
: string
}>
type SelectionValue<TSelection extends Selection<TSelection, TEntity>, TEntity, TProperty extends keyof TSelection> =
TProperty extends keyof TEntity ?
TSelection[TProperty] extends string | number
? TSelection[TProperty]
: TSelection[TProperty] extends object
? TProperty
: never
: never
type EntityProperty<TSelection, TEntity, TProperty extends keyof TSelection> =
TProperty extends keyof TEntity
? TSelection[TProperty] extends object
? FilterResponse<TSelection[TProperty], TEntity[TProperty]>
: TEntity[TProperty]
: never
type FilterResponse<TSelection extends Selection<TSelection, TEntity>, TEntity> = {
[TProperty in keyof TSelection as SelectionValue<TSelection, TEntity, TProperty>]:
EntityProperty<TSelection, TEntity, TProperty>
}
type FieldCondition<TEntity> =
| { readonly where: Condition<TEntity> }
| {
[TProperty in keyof TEntity]?:
| { readonly eq: TEntity[TProperty] }
| { readonly gt: TEntity[TProperty] extends number ? TEntity[TProperty] : never }
| { readonly lt: TEntity[TProperty] extends number ? TEntity[TProperty] : never }
}
type Condition<TEntity> =
| [FieldCondition<TEntity>, 'or' | 'and', FieldCondition<TEntity>]
| [FieldCondition<TEntity>, 'or' | 'and', FieldCondition<TEntity>, 'or' | 'and', FieldCondition<TEntity>]
| [FieldCondition<TEntity>, 'or' | 'and', FieldCondition<TEntity>, 'or' | 'and', FieldCondition<TEntity>, 'or' | 'and', FieldCondition<TEntity>]
type Order<TEntity> = {
[TProperty in keyof TEntity]?: 'asc' | 'desc'
}
interface IFilterRequest<TSelection extends Selection<TSelection, TEntity>, TEntity> {
readonly select?: TSelection
readonly where?: Condition<TEntity>
readonly order?: Order<TEntity>
readonly limit?: number
readonly offset?: number
}
type Result<TSelection extends Selection<TSelection, TEntity>, TEntity> =
| { kind: 'success', value: Array<FilterResponse<TSelection, TEntity>> }
| { kind: 'error', value: Error }
export interface IFilter<TEntity> {
<TSelection extends Selection<TSelection, TEntity>>(req: IFilterRequest<TSelection, TEntity>): Result<TSelection, TEntity>
}
}
}