-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
index.ts
89 lines (82 loc) · 2.25 KB
/
index.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
export * as postgresql from './providers/postgresql';
export * as sqlite from './providers/sqlite';
export * as mongodb from './providers/mongodb';
type EntriesAssumingNoExtraProps<T> = {
[Key in keyof T]-?: [Key, T[Key]];
}[keyof T][];
const objectEntriesButAssumeNoExtraProperties: <T>(obj: T) => EntriesAssumingNoExtraProps<T> =
Object.entries as any;
type CommonFilter<T> = {
equals?: T | null;
in?: readonly T[] | null;
notIn?: readonly T[] | null;
lt?: T | null;
lte?: T | null;
gt?: T | null;
gte?: T | null;
contains?: T | null;
startsWith?: T | null;
endsWith?: T | null;
not?: CommonFilter<T> | null;
};
function internalResolveFilter(
entries: EntriesAssumingNoExtraProps<CommonFilter<any>>,
mode: 'default' | 'insensitive' | undefined
): object {
const entry = entries.shift();
if (entry === undefined) return {};
const [key, val] = entry;
if (val == null) {
return {
AND: [{ [key]: val }, internalResolveFilter(entries, mode)],
};
}
switch (key) {
case 'equals':
case 'lt':
case 'lte':
case 'gt':
case 'gte':
case 'in':
case 'contains':
case 'startsWith':
case 'endsWith': {
return {
AND: [{ [key]: val, mode }, { not: null }, internalResolveFilter(entries, mode)],
};
}
case 'notIn': {
return {
AND: [
{
NOT: [
internalResolveFilter(objectEntriesButAssumeNoExtraProperties({ in: val }), mode),
],
},
internalResolveFilter(entries, mode),
],
};
}
case 'not': {
return {
AND: [
{
NOT: [internalResolveFilter(objectEntriesButAssumeNoExtraProperties(val) as any, mode)],
},
internalResolveFilter(entries, mode),
],
};
}
}
}
export function resolveCommon(val: CommonFilter<any> | null) {
if (val === null) return null;
return internalResolveFilter(objectEntriesButAssumeNoExtraProperties(val), undefined);
}
export function resolveString(
val: (CommonFilter<string> & { mode?: 'default' | 'insensitive' | null }) | null
) {
if (val === null) return null;
let { mode, ...rest } = val;
return internalResolveFilter(objectEntriesButAssumeNoExtraProperties(rest), mode as any);
}