UNPKG

respond-framework

Version:
90 lines (83 loc) 2.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _stringToRegex = require("../utils/stringToRegex.js"); var _dateStringToDate = require("../utils/dateStringToDate.js"); var _toFromObjectIds = require("./toFromObjectIds.js"); const createQuerySelector = function ({ customQuery, ...selector }) { Object.keys(selector).forEach(k => { let v = selector[k]; if (paramCleared(k, v, selector)) { return; } else if (isDateAtString(k)) { // dates can be passed as strings in comparison objects ({ k, v } = convertDateAtString(k, v, selector)); // eg: { $gt: '5/1' } -> { $gt: new Date('5/2/2025') } } else if (shouldConvertToRegex(k, v)) { v = '/^' + v + '/i'; } selector[k] = (0, _stringToRegex.isRegexString)(v) ? (0, _stringToRegex.default)(v) : v; }); maybeFilterBySignupDateRange(selector); return customQuery ? evalCustomQuery(customQuery, selector) : selector; }; var _default = exports.default = createQuerySelector; const paramCleared = (k, v, selector) => { const cleared = v === '' || v === undefined || v && typeof v === 'object' && Object.values(v).length === 0; // eg: selector.foo = { $gt: undefined } --> JSON.stringified -> {} if (!cleared) return; delete selector[k]; return true; }; const isDateAtString = k => k.endsWith('AtString'); // eg: 'createdAtString' const convertDateAtString = (k, v, selector) => { const comparison = Object.keys(v)[0]; // eg: $gt delete selector[k]; return { k: k.replace('String', ''), v: { [comparison]: (0, _dateStringToDate.default)(v[comparison]) } // eg: { $gt: Date } }; }; const shouldConvertToRegex = (k, v) => typeof v === 'string' && !(0, _stringToRegex.isRegexString)(v) && // ingore values already provided as regex wrapped in front slashes !(0, _toFromObjectIds.isForeignOrLocalKey)(k) && // ignore id selectors !k.endsWith('Date'); // ignore special signupStartDate || signupEndDate selectors const evalCustomQuery = ({ ...selector }) => { try { delete selector.customQuery; // be sure it's gone, so selector doesn't try to match the key `customQuery` const obj = eval(`(${customQuery})`); // save both the string form + queryable fields Object.assign(selector, obj); } catch (error) {} // do nothing return selector; }; const maybeFilterBySignupDateRange = selector => { if (selector.signupStartDate) { selector.$and = selector.$and || []; selector.$and.push({ createdAt: { $gte: (0, _dateStringToDate.default)(selector.signupStartDate) } }); delete selector.signupStartDate; } if (selector.signupEndDate) { selector.$and = selector.$and || []; selector.$and.push({ createdAt: { $lt: (0, _dateStringToDate.default)(selector.signupEndDate) } }); delete selector.signupEndDate; } };