1
- export interface FilterSetExact < F > {
1
+ export const DRFFilters = [ 'in' , 'exact' , 'lt' , 'gt' , 'lte' , 'gte' , 'startswith' , 'endswith' ]
2
+
3
+ /**
4
+ *
5
+ */
6
+ interface NotIn {
7
+ in ?: never
8
+ }
9
+
10
+ interface NotExact {
11
+ exact ?: never
12
+ }
13
+
14
+ export interface FilterSetExact < F > extends NotIn {
2
15
exact : F
3
16
startswith ?: never
17
+ endswith ?: never
4
18
lte ?: never
5
19
gte ?: never
6
20
lt ?: never
7
21
gt ?: never
8
22
}
9
23
10
- export interface FilterSetStartsWith < F > {
11
- exact ?: never
12
- startswith ?: F
24
+ export interface FilterSetIn < F > extends NotExact {
25
+ startswith ?: never
26
+ endswith ?: never
27
+ in: Array < F >
13
28
lte ?: never
14
29
gte?: never
15
30
lt?: never
16
31
gt?: never
17
32
}
18
33
34
+ export interface FilterSetAffix < F > extends NotExact , NotIn {
35
+ startswith ?: F
36
+ endswith ?: F
37
+ }
38
+
19
39
type FilterSetRange < T > =
20
40
( FilterSetRangeLT < T > & FilterSetRangeGTE < T > ) | ( FilterSetRangeLT < T > & FilterSetRangeGT < T > )
21
41
| ( FilterSetRangeLTE < T > & FilterSetRangeGTE < T > ) | ( FilterSetRangeLTE < T > & FilterSetRangeGT < T > )
22
42
| ( FilterSetRangeGT < T > & FilterSetRangeLTE < T > ) | ( FilterSetRangeGT < T > & FilterSetRangeLT < T > )
23
43
| ( FilterSetRangeGTE < T > & FilterSetRangeLTE < T > ) | ( FilterSetRangeGTE < T > & FilterSetRangeLT < T > )
24
44
25
- interface NotExact {
26
- exact ?: never
27
- }
28
-
29
- interface NotStartsWith {
30
- startswith ?: never
31
- }
32
-
33
- export interface FilterSetRangeLT < T > extends NotExact , NotStartsWith {
45
+ export interface FilterSetRangeLT < T > extends FilterSetAffix < T > {
34
46
lte ?: never
35
47
lt ?: T
36
48
}
37
49
38
- export interface FilterSetRangeLTE < T > extends NotExact , NotStartsWith {
50
+ export interface FilterSetRangeLTE < T > extends FilterSetAffix < T > {
39
51
lte ?: T
40
52
lt ?: never
41
53
}
42
54
43
- export interface FilterSetRangeGT < T > extends NotExact , NotStartsWith {
55
+ export interface FilterSetRangeGT < T > extends FilterSetAffix < T > {
44
56
gte ?: never
45
57
gt ?: T
46
58
}
47
59
48
- export interface FilterSetRangeGTE < T > extends NotExact , NotStartsWith {
60
+ export interface FilterSetRangeGTE < T > extends FilterSetAffix < T > {
49
61
gte ?: T
50
62
gt ?: never
51
63
52
64
}
53
65
54
- type FilterSet < T > = FilterSetRange < T > | FilterSetExact < T > | FilterSetStartsWith < T >
66
+ /**
67
+ * all FilterSets
68
+ */
69
+ type FilterSet < T > = FilterSetRange < T > | FilterSetExact < T > | FilterSetAffix < T > | FilterSetIn < T >
55
70
56
71
// Config to exclude certain filters and enable custom filters
57
- type FSKeyConfig < D > = Partial < Record < keyof D , string > >
72
+ export type FSKeyConfig < D > = Partial < Record < keyof D , string > >
58
73
59
- type CustomKeyConfig = { [ key : string ] : any }
74
+ export type CustomKeyConfig = { [ key : string ] : unknown }
60
75
& {
61
76
[ key in keyof FilterSet < unknown > ] ?: never
62
77
}
63
78
64
- type AllowedFSKeys < D , K extends FSKeyConfig < D > , key extends keyof D > =
65
- K [ key ] extends ( string | number | symbol ) ? Partial < Record < K [ key ] , D [ key ] > > : never
79
+ type AllowedFSKeys < D , K extends FSKeyConfig < D > , key extends keyof D , C extends CustomKeyConfig | null > =
80
+ // we exclude the types from the custom config because they are defined there. If not they might allow wrong types
81
+ ( Exclude < K [ key ] , keyof C > extends ( string | number | symbol ) ? Partial < Record < Exclude < K [ key ] , keyof C > , D [ key ] > > : never )
66
82
67
83
type ConfiguredCustomKeys < D , K extends FSKeyConfig < D > , key extends keyof D , C extends CustomKeyConfig > =
68
84
Extract < keyof C , K [ key ] extends ( string | number | symbol ) ? K [ key ] : never >
@@ -73,7 +89,7 @@ type CustomKey<D, K extends FSKeyConfig<D>, key extends keyof D, C extends Custo
73
89
ConfiguredCustomKeys < D , K , key , C > //
74
90
, C [ ConfiguredCustomKeys < D , K , key , C > ]
75
91
>
76
- >
92
+ >
77
93
78
94
type CheckCustomKeys < D , K extends FSKeyConfig < D > , key extends keyof D , C extends CustomKeyConfig | null > =
79
95
C extends null ?
@@ -88,7 +104,7 @@ type CheckConfigKeys<D, K extends FSKeyConfig<D>, key extends keyof D, C extends
88
104
key extends keyof K ? // check if there is a FSKeyConfig
89
105
(
90
106
CheckCustomKeys < D , K , key , C >
91
- | AllowedFSKeys < D , K , key > // every key that is defined in the config is allowed
107
+ | AllowedFSKeys < D , K , key , C > // every key that is defined in the config is allowed
92
108
)
93
109
: FilterSet < D [ key ] > // no config for the key so we take the default combinations
94
110
@@ -99,9 +115,30 @@ export type FilterSetConfig<D = Record<any, any>, K extends FSKeyConfig<D> | nul
99
115
K extends null ? // check if we have a config
100
116
FilterSet < D [ key ] > // no config so we take the default combinations for each key
101
117
: CheckConfigKeys < D , Exclude < K , null > , key , C > // check if key is inside the config
118
+ ) | (
119
+ D [ key ] extends Record < any , any > ? // check if the type of the key is a Record, so we add extended references
120
+ FilterSetConfig < D [ key ] >
121
+ : never // no types added otherwise
102
122
)
103
123
}
104
124
125
+ /**
126
+ * Internal Representation of a Filter
127
+ */
128
+ export interface Filter {
129
+ key : string
130
+ value : unknown
131
+ }
132
+
133
+ /**
134
+ * @param key: the defined key
135
+ * @param data: the enclosing data containing the data of the key as well as other data on the same hierarchy
136
+ */
137
+ export type FilterHandler = ( key : string , data : unknown ) => Array < Filter >
138
+
139
+ /**
140
+ *
141
+ */
105
142
export interface DRFAxiosConfig {
106
143
107
144
/** The name of the key where one can put their FilterSetConfig under.
@@ -110,4 +147,9 @@ export interface DRFAxiosConfig {
110
147
*/
111
148
filterKey : string
112
149
150
+ /**
151
+ * A Record which contains for a filter the custom filter handler
152
+ */
153
+ filterHandlers ?: Record < string , FilterHandler >
154
+
113
155
}
0 commit comments