respond-framework
Version:
create as fast you think
90 lines (83 loc) • 2.92 kB
JavaScript
;
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;
}
};