UNPKG

@wener/miniquery

Version:

SQL Where like **safe** filter expression for ORM.

79 lines (78 loc) 3.01 kB
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); }