1
import type { FieldFilter, Item, Query } from '@directus/types';
2
import { generateJoi } from '@directus/utils';
5
Note: Filtering is normally done through SQL in run-ast. This function can be used in case an already
6
existing array of items has to be filtered using the same filter syntax as used in the ast-to-sql flow
9
export function filterItems<T extends Item[]>(items: T, filter: Query['filter']): T {
10
if (!filter) return items;
12
return items.filter((item) => passesFilter(item, filter)) as T;
14
function passesFilter(item: Item, filter: Query['filter']): boolean {
15
if (!filter || Object.keys(filter).length === 0) return true;
17
if (Object.keys(filter)[0] === '_and') {
18
const subfilter = Object.values(filter)[0] as Query['filter'][];
20
return subfilter.every((subFilter) => {
21
return passesFilter(item, subFilter);
23
} else if (Object.keys(filter)[0] === '_or') {
24
const subfilter = Object.values(filter)[0] as Query['filter'][];
26
return subfilter.some((subFilter) => {
27
return passesFilter(item, subFilter);
30
const schema = generateJoi(filter as FieldFilter);
32
const { error } = schema.validate(item);
33
return error === undefined;