mapql
Version:
A MongoDB inspired ES6 Map() query langauge.
76 lines (73 loc) • 2.11 kB
JavaScript
/*!
* A MongoDB inspired ES6 Map() query language. - Copyright (c) 2017 Louis T. (https://lou.ist/)
* Licensed under the MIT license https://raw.githubusercontent.com/LouisT/MapQL/master/LICENSE
*/
;
const isEqual = require('is-equal'),
Helpers = require('../../Helpers');
/*
* Validate $in/$nin with support for RegExp, fallback
* to includes() for arrays and isEqual() otherwise.
*/
class inOrNin {
validate (val, check) {
if (Array.isArray(check)) {
return (Array.isArray(val)) ? val.some(v2 => check.some(c2 => this.test(v2, c2))) : check.some(c2 => this.test(val, c2));
} else if (Array.isArray(val)) {
return val.some(v2 => this.test(v2, check));
}
return this.test(val, check);
}
test (val, check) {
if (Helpers.is(val, 'RegExp') && Helpers.is(check, 'RegExp')) {
return isEqual(val, check);
} else if (Helpers.is(val, 'RegExp')) {
return val.test(check);
} else if (Helpers.is(check, 'RegExp')) {
return check.test(val);
}
return (Array.isArray(check) ? check.includes(val) : (Array.isArray(val) ? val.includes(check) : isEqual(val, check)));
}
}
module.exports = {
'$eq': {
fn: function (val = true, eq = false) {
return isEqual(val, eq);
}
},
'$gt': {
fn: function (val, lt) {
return val > lt;
}
},
'$gte': {
fn: function (val, lte) {
return val >= lte;
}
},
'$lt': {
fn: function (val, gt) {
return val < gt;
}
},
'$lte': {
fn: function (val, gte) {
return val <= gte;
}
},
'$ne': {
fn: function (val, ne) {
return val !== ne;
}
},
'$in': {
fn: function (val, _in) {
return new inOrNin().validate(val, _in);
}
},
'$nin': {
fn: function (val, nin) {
return !(new inOrNin().validate(val, nin));
}
}
};