@mcabreradev/filter
Version:
A powerful, SQL-like array filtering library for TypeScript and JavaScript with advanced pattern matching, MongoDB-style operators, deep object comparison, and zero dependencies
63 lines (62 loc) • 2.59 kB
JavaScript
import { hasWildcard, createWildcardRegex, hasNegation, removeNegation } from '../../utils';
export function createStringPredicate(expression, config) {
if (hasNegation(expression)) {
const cleanExpression = removeNegation(expression);
return function (item) {
if (item === null || item === undefined) {
return false;
}
if (typeof item === 'string') {
const itemLower = config.caseSensitive ? item : item.toLowerCase();
const exprLower = config.caseSensitive ? cleanExpression : cleanExpression.toLowerCase();
return itemLower !== exprLower;
}
const values = Object.values(item);
return !values.some((value) => {
if (typeof value === 'string') {
const valueLower = config.caseSensitive ? value : value.toLowerCase();
const exprLower = config.caseSensitive ? cleanExpression : cleanExpression.toLowerCase();
return valueLower === exprLower;
}
return value === cleanExpression;
});
};
}
if (hasWildcard(expression)) {
const regex = createWildcardRegex(expression, config.caseSensitive);
return function (item) {
if (item === null || item === undefined) {
return false;
}
if (typeof item === 'string') {
return regex.test(item);
}
for (const key in item) {
const value = item[key];
if (typeof value === 'string' && regex.test(value)) {
return true;
}
}
return false;
};
}
return function (item) {
if (item === null || item === undefined) {
return false;
}
if (typeof item === 'string') {
const itemLower = config.caseSensitive ? item : item.toLowerCase();
const exprLower = config.caseSensitive ? expression : expression.toLowerCase();
return itemLower === exprLower;
}
const values = Object.values(item);
return values.some((value) => {
if (typeof value === 'string') {
const valueLower = config.caseSensitive ? value : value.toLowerCase();
const exprLower = config.caseSensitive ? expression : expression.toLowerCase();
return valueLower === exprLower;
}
return value === expression;
});
};
}