@wener/miniquery
Version:
SQL Where like **safe** filter expression for ORM.
79 lines (78 loc) • 3.01 kB
JavaScript
import { match } from 'ts-pattern';
export function formatSearch(input) {
var OP = {
match: ':',
eq: ':=',
ne: ':!=',
gt: ':>',
lt: ':<',
gte: ':>=',
lte: ':<=',
range: ':'
};
var _exprs = function(s) {
return s.map(_expr).join(' ');
};
var _expr = function(s) {
return match(s).with({
type: 'keyword'
}, function(param) {
var value = param.value, exact = param.exact, negative = param.negative;
return "".concat(negative ? '-' : '').concat(exact ? '"'.concat(value, '"') : value);
}).with({
type: 'logical'
}, function(param) {
var operator = param.operator, value = param.value;
return value.map(_expr).join(" ".concat(operator.toLocaleUpperCase(), " "));
}).with({
type: 'not'
}, function(param) {
var value = param.value;
return "NOT ".concat(_expr(value));
}).with({
type: 'compare'
}, function(param) {
var field = param.field, operator = param.operator, value = param.value, negative = param.negative, mention = param.mention;
return "".concat(negative ? '-' : '').concat(mention ? '@' : '').concat(field).concat(OP[operator]).concat(_value(value));
}).with({
type: 'comment'
}, function(param) {
var value = param.value;
return "/* ".concat(value, " */");
}).with({
type: 'parentheses'
}, function(param) {
var value = param.value;
return "(".concat(_exprs(value), ")");
}).exhaustive();
};
var _literal = function(s) {
if (typeof s === 'string') {
return s.includes(' ') ? '"'.concat(s, '"') : s;
}
return JSON.stringify(s);
};
var _value = function(v) {
return match(v).with({
type: 'range'
}, function(param) {
var minimum = param.minimum, maximum = param.maximum, minimumExclusive = param.minimumExclusive, maximumExclusive = param.maximumExclusive;
if (minimumExclusive === undefined && maximumExclusive === undefined) {
var min = minimum === undefined ? '*' : _value(minimum);
var max = maximum === undefined ? '*' : _value(maximum);
return "".concat(min, "..").concat(max);
}
var min1 = minimum === undefined ? '' : _value(minimum);
var max1 = maximum === undefined ? '' : _value(maximum);
return "".concat(minimumExclusive ? '(' : '[').concat(min1, ",").concat(max1).concat(maximumExclusive ? ')' : ']');
}).with({
format: 'mention'
}, function(param) {
var value = param.value;
return "@".concat(value);
}).otherwise(function(value) {
return _literal(value.value);
});
};
return _exprs(input);
}