Skip to content

Commit bc39ea9

Browse files
committed
refactor(filter): simplify filter definition
1 parent eeba83f commit bc39ea9

File tree

5 files changed

+22
-54
lines changed

5 files changed

+22
-54
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ lib-cov
99
logs
1010
node_modules
1111
temp
12+
playground/.nuxt

README.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,8 @@ The main function to query your array data.
7070
- `key: string`: The property to filter on
7171
- `value: any`: The value to compare against
7272
- `matchMode: FilterMatchMode`: The type of comparison to make
73-
- `required?: boolean`: Whether this filter must match
74-
- `postCondition?: boolean`: Apply this filter after other operations
75-
- `arrayLookup?: Operator`: How to combine multiple matches in arrays
76-
- `lookupAtRoot?: boolean`: Whether to apply the filter at the root level
73+
- `operator?: Operator` (`'AND' | 'OR' | (() => 'AND' | 'OR')`): How to combine multiple matches in arrays
74+
- `params?: MatcherParams`: Additional parameters for the match mode
7775

7876
### FilterMatchMode
7977

src/query.ts

+15-25
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ export function query<T extends GenericObject, P extends QueryParams>(
3535
result = result.filter((item) => {
3636
return (params.filter ?? []).every((filter) => {
3737
const value = getObjectProperty(item, filter.key)
38-
const arrayLookup = typeof filter.arrayLookup === 'function' ? filter.arrayLookup() : filter.arrayLookup ?? 'OR'
38+
const operator = typeof filter.operator === 'function' ? filter.operator() : filter.operator ?? 'OR'
3939
if (filter.matchMode === 'equals') {
4040
return processFilterWithLookup({
4141
type: 'equals',
4242
params: null,
43-
arrayLookup,
43+
operator,
4444
value,
4545
filter: filter.value,
4646
})
@@ -50,7 +50,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
5050
return processFilterWithLookup({
5151
type: 'contains',
5252
params: null,
53-
arrayLookup,
53+
operator,
5454
value,
5555
filter: filter.value,
5656
})
@@ -59,7 +59,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
5959
return processFilterWithLookup({
6060
type: 'between',
6161
params: filter?.params ?? null,
62-
arrayLookup,
62+
operator,
6363
value,
6464
filter: filter.value,
6565
})
@@ -69,7 +69,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
6969
return processFilterWithLookup({
7070
type: 'greaterThan',
7171
params: filter?.params ?? null,
72-
arrayLookup,
72+
operator,
7373
value,
7474
filter: filter.value,
7575
})
@@ -79,7 +79,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
7979
return processFilterWithLookup({
8080
type: 'greaterThanOrEqual',
8181
params: filter?.params ?? null,
82-
arrayLookup,
82+
operator,
8383
value,
8484
filter: filter.value,
8585
})
@@ -89,7 +89,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
8989
return processFilterWithLookup({
9090
type: 'lessThan',
9191
params: filter?.params ?? null,
92-
arrayLookup,
92+
operator,
9393
value,
9494
filter: filter.value,
9595
})
@@ -99,7 +99,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
9999
return processFilterWithLookup({
100100
type: 'lessThanOrEqual',
101101
params: filter?.params ?? null,
102-
arrayLookup,
102+
operator,
103103
value,
104104
filter: filter.value,
105105
})
@@ -109,17 +109,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
109109
return processFilterWithLookup({
110110
type: 'exists',
111111
params: null,
112-
arrayLookup,
113-
value,
114-
filter: filter.value,
115-
})
116-
}
117-
118-
if (filter.matchMode === 'objectStringMap') {
119-
return processFilterWithLookup({
120-
type: 'objectStringMap',
121-
params: filter.params,
122-
arrayLookup,
112+
operator,
123113
value,
124114
filter: filter.value,
125115
})
@@ -129,7 +119,7 @@ export function query<T extends GenericObject, P extends QueryParams>(
129119
return processFilterWithLookup({
130120
type: 'arrayLength',
131121
params: null,
132-
arrayLookup,
122+
operator,
133123
value,
134124
filter: filter.value,
135125
})
@@ -141,8 +131,8 @@ export function query<T extends GenericObject, P extends QueryParams>(
141131
return processFilterWithLookup({
142132
type: 'objectMatch',
143133
params,
144-
arrayLookup,
145-
value: filter.lookupAtRoot ? item : value,
134+
operator,
135+
value: params?.applyAtRoot ? item : value,
146136
filter: filterValue,
147137
})
148138
}
@@ -201,7 +191,7 @@ function processFilterWithLookup<
201191
P = Parameters<MatchModeProcessorMap[T]>[0],
202192
>(params: {
203193
type: FilterMatchMode
204-
arrayLookup: 'AND' | 'OR'
194+
operator: 'AND' | 'OR'
205195
value: any
206196
filter: any
207197
params: P extends { params: infer U } ? U : P extends { params?: infer U } ? U : null
@@ -219,7 +209,7 @@ function processFilterWithLookup<
219209
: MatchModeProcessor[params.type]({ params: params.params as any, value: params.value, filter: params.filter })
220210
}
221211

222-
else if (params.arrayLookup === 'AND') {
212+
else if (params.operator === 'AND') {
223213
return Array.isArray(params.filter) && params.filter.every((filter, index) => {
224214
if (Array.isArray(params.value)) {
225215
return params.value.some(value =>
@@ -237,7 +227,7 @@ function processFilterWithLookup<
237227
})
238228
}
239229

240-
else if (params.arrayLookup === 'OR') {
230+
else if (params.operator === 'OR') {
241231
return Array.isArray(params.filter) && params.filter.some((filter, index) =>
242232
Array.isArray(params.value)
243233
? params.value.some(value =>

src/types.ts

+4-24
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ export type FilterMatchMode =
1313
| 'lessThan'
1414
| 'lessThanOrEqual'
1515
| 'exists'
16-
| 'objectStringMap'
1716
| 'arrayLength'
1817
| 'objectMatch'
1918

20-
export type NonObjectMatchMode = Exclude<FilterMatchMode, 'objectStringMap' | 'objectMatch'>
19+
export type NonObjectMatchMode = Exclude<FilterMatchMode, 'objectMatch'>
2120
export type ComparatorMatchMode = Extract<FilterMatchMode, 'between' | 'greaterThan' | 'greaterThanOrEqual' | 'lessThan' | 'lessThanOrEqual'>
2221

2322
export interface ComparatorParams {
@@ -28,33 +27,18 @@ export interface ObjectMapFilterParams {
2827
operator: 'AND' | 'OR'
2928
properties: Array<{
3029
key: string
31-
matchMode: Exclude<FilterMatchMode, 'objectStringMap' | 'objectMap'>
30+
matchMode: Exclude<FilterMatchMode, 'objectMap'>
3231
}>
3332
transformFilterValue?: (value: any) => any
3433
matchPropertyAtIndex?: boolean
35-
}
36-
37-
export interface ObjectStringMapFilterParams {
38-
stringMap: Array<
39-
| string
40-
| {
41-
propertyName: string
42-
matchMode: Exclude<FilterMatchMode, 'objectStringMap'>
43-
}
44-
>
45-
stringMapSeparator?: string
46-
stringMapOperator?: 'AND' | 'OR'
47-
dateMode?: boolean
34+
applyAtRoot?: boolean
4835
}
4936

5037
export type MatchModeCore = ({
5138
matchMode: Exclude<FilterMatchMode, 'objectStringMap' | 'objectMatch' | ComparatorMatchMode>
5239
} | {
5340
matchMode: ComparatorMatchMode
5441
params?: ComparatorParams
55-
} | {
56-
matchMode: 'objectStringMap'
57-
params: ObjectStringMapFilterParams
5842
} | {
5943
matchMode: 'objectMatch'
6044
params: ObjectMapFilterParams | ((value: any) => ObjectMapFilterParams)
@@ -63,10 +47,7 @@ export type MatchModeCore = ({
6347
export type QueryFilter = {
6448
key: string
6549
value: any
66-
required?: boolean | undefined
67-
postCondition?: boolean
68-
arrayLookup?: Operator
69-
lookupAtRoot?: boolean
50+
operator?: Operator
7051
} & MatchModeCore
7152

7253
export interface QueryParams {
@@ -91,7 +72,6 @@ export interface MatchModeProcessorMap {
9172
lessThan: ({ value, filter }: { value: any, filter: any, params?: ComparatorParams }) => boolean
9273
lessThanOrEqual: ({ value, filter }: { value: any, filter: any, params?: ComparatorParams }) => boolean
9374
between: ({ value, filter }: { value: any, filter: any, params?: ComparatorParams }) => boolean
94-
objectStringMap: (p: { value: any, filter: any }) => boolean
9575
arrayLength: ({ value, filter }: { value: any, filter: any }) => boolean
9676
objectMatch: ({ value, filter, params }: { value: any, filter: any, params: ObjectMapFilterParams, index?: number }) => boolean
9777
}

src/utils.ts

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ export const MatchModeProcessor: MatchModeProcessorMap = {
3838
between: ({ value, filter, params }) => {
3939
return params?.dateMode ? new Date(value) >= new Date(filter[0]) && new Date(value) <= new Date(filter[1]) : value >= filter[0] && value <= filter[1]
4040
},
41-
objectStringMap: p => !!p,
4241
arrayLength: ({ value, filter }) => Array.isArray(value) && value.length === filter,
4342
objectMatch: ({ value, filter, params, index }) => {
4443
const properties = typeof index !== 'undefined' && params.matchPropertyAtIndex ? [params.properties[index]] : params.properties

0 commit comments

Comments
 (0)