UNPKG

@wener/miniquery

Version:

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

221 lines (220 loc) 8.52 kB
function _array_like_to_array(arr, len) { if (len == null || len > arr.length) len = arr.length; for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i]; return arr2; } function _array_without_holes(arr) { if (Array.isArray(arr)) return _array_like_to_array(arr); } function _iterable_to_array(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _non_iterable_spread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _to_consumable_array(arr) { return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread(); } function _unsupported_iterable_to_array(o, minLen) { if (!o) return; if (typeof o === "string") return _array_like_to_array(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen); } function get(data, ref) { var current = data; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined; try { for(var _iterator = ref[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){ var key = _step.value; switch(current){ case null: case undefined: return current; } if (Object.hasOwn(current, key)) { current = current[key]; } else { return undefined; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally{ try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally{ if (_didIteratorError) { throw _iteratorError; } } } return current; } export function resolveQuery(ast) { var _ref = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, _ref_context = _ref.context, context = _ref_context === void 0 ? {} : _ref_context, _ref_resolveRef = _ref.resolveRef, resolveRef = _ref_resolveRef === void 0 ? function(param) { var path = param.path; var val = get(context, path); if (typeof val === 'function') { return null; } return val; } : _ref_resolveRef, _ref_resolveFunc = _ref.resolveFunc, resolveFunc = _ref_resolveFunc === void 0 ? function(param) { var name = param.name, args = param.args, resolve = param.resolve; var val = get(context, [ name ]); if (typeof val === 'function') { return val.apply(void 0, _to_consumable_array(args.map(function(e) { return resolve(e); }))); } throw new Error('Function "'.concat(name, '" not found in context')); } : _ref_resolveFunc; var _eval = function(e) { return resolveQuery(e, { context: context, resolveRef: resolveRef, resolveFunc: resolveFunc }); }; switch(ast.type){ case 'literal': return ast.value; case 'ref': return resolveRef({ path: ast.value }); case 'func': return resolveFunc({ name: ast.name, args: ast.args, resolve: _eval }); case 'list': return ast.items.map(function(e) { return _eval(e); }); case 'unary': { var v = _eval(ast.expr); switch(ast.op){ case 'NOT': case '!': return !v; case '+': return +v; case '-': return -v; default: throw new Error("Unsupported unary op: ".concat(ast.op)); } } case 'binary': { var l = _eval(ast.left); var r = _eval(ast.right); if (l === null || l === undefined || r === null || r === undefined) { return null; } switch(ast.op){ case '+': return l + r; case '-': return l - r; case '*': return l * r; case '/': return l / r; case '%': return l % r; default: throw new Error("Unsupported binary op: ".concat(ast.op)); } } case 'logic': { if (ast.op === 'AND') return ast.exprs.every(function(e) { return _eval(e); }); if (ast.op === 'OR') return ast.exprs.some(function(e) { return _eval(e); }); throw new Error("Unsupported logic op: ".concat(ast.op)); } case 'case': { var v1 = ast.condition ? _eval(ast.condition) : true; var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined; try { for(var _iterator = ast.cases[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){ var _step_value = _step.value, w = _step_value.when, t = _step_value.then; if (_eval(w) === v1) { return _eval(t); } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally{ try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally{ if (_didIteratorError) { throw _iteratorError; } } } if (ast.else) { return _eval(ast.else); } return null; } case 'compare': { var l1 = _eval(ast.left); var r1 = Array.isArray(ast.right) ? ast.right.map(function(e) { return _eval(e); }) : _eval(ast.right); switch(ast.op){ case '=': case '==': return l1 === r1; case '!=': case '<>': return l1 !== r1; case '>': return l1 > r1; case '>=': return l1 >= r1; case '<': return l1 < r1; case '<=': return l1 <= r1; case 'IN': return Array.isArray(r1) && r1.includes(l1); case 'NOT IN': return Array.isArray(r1) && !r1.includes(l1); case 'BETWEEN': return Array.isArray(r1) && l1 >= r1[0] && l1 <= r1[1]; case 'NOT BETWEEN': return Array.isArray(r1) && (l1 < r1[0] || l1 > r1[1]); case 'IS': return l1 === r1; case 'IS NOT': return l1 !== r1; default: throw new Error("Unsupported compare op: ".concat(ast.op)); } } default: throw new Error("Unknown AST node type: ".concat(ast.type)); } }