Skip to content
This repository was archived by the owner on Jun 15, 2021. It is now read-only.

Commit 010c758

Browse files
committed
feat: Adds $search operator.
1 parent 1703bb8 commit 010c758

File tree

5 files changed

+37
-5
lines changed

5 files changed

+37
-5
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"check-coverage": true
2626
},
2727
"dependencies": {
28-
"@js-entity-repos/core": "^9.0.0",
28+
"@js-entity-repos/core": "^9.1.0",
2929
"lodash": "^4.17.4",
3030
"sift": "^5.0.0"
3131
},

src/utils/constructSiftFilter.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import Entity from '@js-entity-repos/core/dist/types/Entity';
2+
import { Filter } from '@js-entity-repos/core/dist/types/Filter';
3+
import parseFilterKey from './parseFilterKey';
4+
5+
export default <E extends Entity>(filter: Filter<E>) => {
6+
return parseFilterKey('$search', (value: any) => {
7+
return { $regex: new RegExp(value, 'i') };
8+
})(filter);
9+
};

src/utils/filterEntities.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import Entity from '@js-entity-repos/core/dist/types/Entity';
22
// tslint:disable-next-line:no-unused import-spacing
33
import { ConditionFilter, Filter, PropFilter } from '@js-entity-repos/core/dist/types/Filter';
44
import sift from 'sift';
5+
import constructSiftFilter from './constructSiftFilter';
56

67
export interface Opts<E extends Entity> {
78
readonly entities: E[];
89
readonly filter: Filter<E>;
910
}
1011

1112
export default <E extends Entity>({ entities, filter }: Opts<E>) => {
12-
const sifter = sift(filter as any);
13+
const siftFilter = constructSiftFilter(filter);
14+
const sifter = sift(siftFilter as any);
1315
return entities.filter(sifter);
1416
};

src/utils/parseFilterKey.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { difference, get, has, isArray, isPlainObject, map, mapValues, pick } from 'lodash';
2+
3+
type FilterParser = (filter: object) => object;
4+
5+
const parseFilterKey = (key: string, parser: FilterParser): FilterParser => {
6+
return (filter: object): object => {
7+
if (has(filter, key)) {
8+
const otherKeys = difference(Object.keys(filter), [key]);
9+
const remainingFilter = pick(filter, otherKeys);
10+
return { ...remainingFilter, ...parser(get(filter, key)) };
11+
} else if (isArray(filter)) {
12+
return map(filter, parseFilterKey(key, parser));
13+
} else if (isPlainObject(filter)) {
14+
return mapValues(filter, parseFilterKey(key, parser));
15+
}
16+
17+
return filter;
18+
};
19+
};
20+
21+
export default parseFilterKey;

0 commit comments

Comments
 (0)