diff --git a/src/utils/convertOperators.ts b/src/utils/convertOperators.ts index 314ac9d..6159a1b 100644 --- a/src/utils/convertOperators.ts +++ b/src/utils/convertOperators.ts @@ -1,16 +1,30 @@ import { operatorResolver } from './operatorResolver'; import { _ } from '@feathersjs/commons/lib'; -export const convertOperators = (query: any, escapeFn: any, root = ''): string[] => - Array.isArray(query) ? - query.map(q => convertOperators(q, escapeFn, root)) : - Object.keys(query).map((prop: any) => - prop === '$or' ? - operatorResolver.$or(convertOperators(query[prop], escapeFn)) : - prop === '$and' ? - operatorResolver.$and(convertOperators(query[prop], escapeFn, prop)) : - (prop in operatorResolver) ? - operatorResolver[prop](...Object.values(escapeFn(root, query[prop]))) : - _.isObject(query[prop]) ? - operatorResolver.$and(convertOperators(query[prop], escapeFn, prop)) : - operatorResolver.$eq(...Object.values(escapeFn(prop, query[prop])))); +export const convertOperators = (query: any, escapeFn: any, root = ''): any => { + if (Array.isArray(query)) { + return query.map(q => convertOperators(q, escapeFn, root)); + } + + return Object.keys(query).map((prop) => { + if (prop === '$or') { + return operatorResolver.$or(convertOperators(query[prop], escapeFn)); + } + + if (prop === '$and') { + return operatorResolver.$and(convertOperators(query[prop], escapeFn, prop)); + } + + if (prop in operatorResolver) { + const values = Object.values(escapeFn(root, query[prop])); + return operatorResolver[prop](...values); + } + + if (_.isObject(query[prop])) { + return operatorResolver.$and(convertOperators(query[prop], escapeFn, prop)); + } + + const values = Object.values(escapeFn(prop, query[prop])); + return operatorResolver.$eq(...values); + }); +}; diff --git a/src/utils/operatorResolver.ts b/src/utils/operatorResolver.ts index 1c11bed..d2c3147 100644 --- a/src/utils/operatorResolver.ts +++ b/src/utils/operatorResolver.ts @@ -21,7 +21,5 @@ export const operatorResolver: any = { $or: (value: any) => `(${value.join(' OR ')})`, $and: (value: any) => Array.isArray(value) && value.length > 1 ? `(${value.join(' AND ')})` : - Array.isArray(value[0]) ? - value[0][0] : - value[0] + Array.isArray(value[0]) ? value[0][0] : value[0] }