Comparing version 8.5.0 to 8.5.1
@@ -0,1 +1,6 @@ | ||
## 8.5.1 | ||
- Fix dependency vulnerability | ||
- Fix #158 | ||
## 8.5.0 | ||
@@ -2,0 +7,0 @@ |
450
lib/index.js
@@ -7,16 +7,6 @@ "use strict"; | ||
var _typeof = | ||
typeof Symbol === "function" && typeof Symbol.iterator === "symbol" | ||
? function(obj) { | ||
return typeof obj; | ||
} | ||
: function(obj) { | ||
return obj && | ||
typeof Symbol === "function" && | ||
obj.constructor === Symbol && | ||
obj !== Symbol.prototype | ||
? "symbol" | ||
: typeof obj; | ||
}; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; | ||
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); | ||
exports.default = sift; | ||
@@ -35,3 +25,3 @@ exports.compare = compare; | ||
var typeString = "[object " + type + "]"; | ||
return function(value) { | ||
return function (value) { | ||
return Object.prototype.toString.call(value) === typeString; | ||
@@ -52,16 +42,33 @@ }; | ||
var nestable = function nestable(validator) { | ||
return function (validateOptions, value, key, valueOwner, nestedResults) { | ||
if (nestedResults) { | ||
return Boolean(nestedResults.find(function (_ref) { | ||
var _ref2 = _slicedToArray(_ref, 3), | ||
value = _ref2[0], | ||
key = _ref2[1], | ||
valueOwner = _ref2[2]; | ||
return validator(validateOptions, key, valueOwner); | ||
})); | ||
} | ||
return validator(validateOptions, value, key, valueOwner); | ||
}; | ||
}; | ||
/** | ||
*/ | ||
function or(validator) { | ||
return function(a, b) { | ||
if (!isArray(b) || !b.length) { | ||
return validator(a, b); | ||
var or = nestable(function (validator) { | ||
return function (validateOptions, value, key, valueOwner, nestedResults) { | ||
if (!isArray(value) || !value.length) { | ||
return validator(validateOptions, value); | ||
} | ||
for (var i = 0, n = b.length; i < n; i++) { | ||
if (validator(a, get(b, i))) return true; | ||
for (var i = 0, n = value.length; i < n; i++) { | ||
if (validator(validateOptions, get(value, i))) return true; | ||
} | ||
return false; | ||
}; | ||
} | ||
}); | ||
@@ -72,8 +79,8 @@ /** | ||
function and(validator) { | ||
return function(a, b) { | ||
if (!isArray(b) || !b.length) { | ||
return validator(a, b); | ||
return function (validateOptions, value, key, valueOwner) { | ||
if (!isArray(value) || !value.length) { | ||
return validator(validateOptions, value, key, valueOwner); | ||
} | ||
for (var i = 0, n = b.length; i < n; i++) { | ||
if (!validator(a, get(b, i))) return false; | ||
for (var i = 0, n = value.length; i < n; i++) { | ||
if (!validator(validateOptions, get(value, i), value, valueOwner)) return false; | ||
} | ||
@@ -84,4 +91,4 @@ return true; | ||
function validate(validator, b, k, o) { | ||
return validator.v(validator.a, b, k, o); | ||
function _validate(validator, value, key, valueOwner, nestedResults) { | ||
return validator.validate(validator.options, value, key, valueOwner, nestedResults); | ||
} | ||
@@ -93,4 +100,4 @@ | ||
$eq: or(function(a, b) { | ||
return a(b); | ||
$eq: or(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -101,4 +108,4 @@ | ||
$ne: and(function(a, b) { | ||
return a(b); | ||
$ne: and(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -109,4 +116,4 @@ | ||
$gt: or(function(a, b) { | ||
return a(b); | ||
$gt: or(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -117,4 +124,4 @@ | ||
$gte: or(function(a, b) { | ||
return a(b); | ||
$gte: or(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -125,4 +132,4 @@ | ||
$lt: or(function(a, b) { | ||
return a(b); | ||
$lt: or(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -133,4 +140,4 @@ | ||
$lte: or(function(a, b) { | ||
return a(b); | ||
$lte: or(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -141,4 +148,4 @@ | ||
$mod: or(function(a, b) { | ||
return a(b); | ||
$mod: or(function (test, value) { | ||
return test(value); | ||
}), | ||
@@ -149,11 +156,12 @@ | ||
$in: function $in(a, b) { | ||
return a(b); | ||
$in: function $in(test, value) { | ||
return test(value); | ||
}, | ||
/** | ||
*/ | ||
$nin: function $nin(a, b) { | ||
return a(b); | ||
$nin: function $nin(test, value) { | ||
return test(value); | ||
}, | ||
@@ -164,4 +172,4 @@ | ||
$not: function $not(a, b, k, o) { | ||
return a(b, k, o); | ||
$not: function $not(test, value, key, valueOwner) { | ||
return test(value, key, valueOwner); | ||
}, | ||
@@ -172,4 +180,4 @@ | ||
$type: function $type(a, b) { | ||
return a(b); | ||
$type: function $type(testType, value) { | ||
return testType(value); | ||
}, | ||
@@ -180,4 +188,4 @@ | ||
$all: function $all(a, b, k, o) { | ||
return defaultExpressions.$and(a, b, k, o); | ||
$all: function $all(allOptions, value, key, valueOwner, nestedResults) { | ||
return defaultExpressions.$and(allOptions, value, key, valueOwner, nestedResults); | ||
}, | ||
@@ -188,4 +196,4 @@ | ||
$size: function $size(a, b) { | ||
return b ? a === b.length : false; | ||
$size: function $size(sizeMatch, value) { | ||
return value ? sizeMatch === value.length : false; | ||
}, | ||
@@ -196,5 +204,5 @@ | ||
$or: function $or(a, b, k, o) { | ||
for (var i = 0, n = a.length; i < n; i++) { | ||
if (validate(get(a, i), b, k, o)) { | ||
$or: function $or(orOptions, value, key, valueOwner) { | ||
for (var i = 0, n = orOptions.length; i < n; i++) { | ||
if (_validate(get(orOptions, i), value, key, valueOwner)) { | ||
return true; | ||
@@ -209,4 +217,4 @@ } | ||
$nor: function $nor(a, b, k, o) { | ||
return !defaultExpressions.$or(a, b, k, o); | ||
$nor: function $nor(validateOptions, value, key, valueOwner) { | ||
return !defaultExpressions.$or(validateOptions, value, key, valueOwner); | ||
}, | ||
@@ -217,7 +225,16 @@ | ||
$and: function $and(a, b, k, o) { | ||
for (var i = 0, n = a.length; i < n; i++) { | ||
if (!validate(get(a, i), b, k, o)) { | ||
return false; | ||
$and: function $and(validateOptions, value, key, valueOwner, nestedResults) { | ||
if (nestedResults) { | ||
for (var i = 0, n = validateOptions.length; i < n; i++) { | ||
if (!_validate(get(validateOptions, i), value, key, valueOwner, nestedResults)) { | ||
return false; | ||
} | ||
} | ||
} else { | ||
for (var i = 0, n = validateOptions.length; i < n; i++) { | ||
if (!_validate(get(validateOptions, i), value, key, valueOwner, nestedResults)) { | ||
return false; | ||
} | ||
} | ||
} | ||
@@ -230,4 +247,4 @@ return true; | ||
$regex: or(function(a, b) { | ||
return typeof b === "string" && a.test(b); | ||
$regex: or(function (validateOptions, value) { | ||
return typeof value === "string" && validateOptions.test(value); | ||
}), | ||
@@ -238,4 +255,4 @@ | ||
$where: function $where(a, b, k, o) { | ||
return a.call(b, b, k, o); | ||
$where: function $where(validateOptions, value, key, valueOwner) { | ||
return validateOptions.call(value, value, key, valueOwner); | ||
}, | ||
@@ -246,7 +263,7 @@ | ||
$elemMatch: function $elemMatch(a, b, k, o) { | ||
if (isArray(b)) { | ||
return !!~search(b, a); | ||
$elemMatch: function $elemMatch(validateOptions, value, key, valueOwner) { | ||
if (isArray(value)) { | ||
return !!~search(value, validateOptions); | ||
} | ||
return validate(a, b, k, o); | ||
return _validate(validateOptions, value, key, valueOwner); | ||
}, | ||
@@ -257,4 +274,4 @@ | ||
$exists: function $exists(a, b, k, o) { | ||
return o.hasOwnProperty(k) === a; | ||
$exists: function $exists(validateOptions, value, key, valueOwner) { | ||
return valueOwner.hasOwnProperty(key) === validateOptions; | ||
} | ||
@@ -270,70 +287,70 @@ }; | ||
$eq: function $eq(a, query, _ref) { | ||
var comparable = _ref.comparable, | ||
compare = _ref.compare; | ||
$eq: function $eq(query, queryOwner, _ref3) { | ||
var comparable = _ref3.comparable, | ||
compare = _ref3.compare; | ||
if (a instanceof RegExp) { | ||
return or(function(b) { | ||
return typeof b === "string" && a.test(b); | ||
if (query instanceof RegExp) { | ||
return or(function (value) { | ||
return typeof value === "string" && query.test(value); | ||
}); | ||
} else if (a instanceof Function) { | ||
return or(a); | ||
} else if (isArray(a) && !a.length) { | ||
} else if (query instanceof Function) { | ||
return or(query); | ||
} else if (isArray(query) && !query.length) { | ||
// Special case of a == [] | ||
return or(function(b) { | ||
return isArray(b) && !b.length; | ||
return or(function (value) { | ||
return isArray(value) && !value.length; | ||
}); | ||
} else if (a === null) { | ||
return or(function(b) { | ||
} else if (query === null) { | ||
return or(function (value) { | ||
//will match both null and undefined | ||
return b == null; | ||
return value == null; | ||
}); | ||
} | ||
return or(function(b) { | ||
return compare(comparable(b), comparable(a)) === 0; | ||
return or(function (value) { | ||
return compare(comparable(value), comparable(query)) === 0; | ||
}); | ||
}, | ||
$gt: function $gt(a, query, _ref2) { | ||
var comparable = _ref2.comparable, | ||
compare = _ref2.compare; | ||
$gt: function $gt(query, queryOwner, _ref4) { | ||
var comparable = _ref4.comparable, | ||
compare = _ref4.compare; | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) > 0; | ||
return function (value) { | ||
return compare(comparable(value), comparable(query)) > 0; | ||
}; | ||
}, | ||
$gte: function $gte(a, query, _ref3) { | ||
var comparable = _ref3.comparable, | ||
compare = _ref3.compare; | ||
$gte: function $gte(query, queryOwner, _ref5) { | ||
var comparable = _ref5.comparable, | ||
compare = _ref5.compare; | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) >= 0; | ||
return function (value) { | ||
return compare(comparable(value), comparable(query)) >= 0; | ||
}; | ||
}, | ||
$lt: function $lt(a, query, _ref4) { | ||
var comparable = _ref4.comparable, | ||
compare = _ref4.compare; | ||
$lt: function $lt(query, queryOwner, _ref6) { | ||
var comparable = _ref6.comparable, | ||
compare = _ref6.compare; | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) < 0; | ||
return function (value) { | ||
return compare(comparable(value), comparable(query)) < 0; | ||
}; | ||
}, | ||
$lte: function $lte(a, query, _ref5) { | ||
var comparable = _ref5.comparable, | ||
compare = _ref5.compare; | ||
$lte: function $lte(query, queryOwner, _ref7) { | ||
var comparable = _ref7.comparable, | ||
compare = _ref7.compare; | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) <= 0; | ||
return function (value) { | ||
return compare(comparable(value), comparable(query)) <= 0; | ||
}; | ||
}, | ||
$in: function $in(a, query, options) { | ||
$in: function $in(query, queryOwner, options) { | ||
var comparable = options.comparable; | ||
return function(b) { | ||
if (b instanceof Array) { | ||
for (var i = b.length; i--; ) { | ||
if (~a.indexOf(comparable(get(b, i)))) { | ||
return function (value) { | ||
if (value instanceof Array) { | ||
for (var i = value.length; i--;) { | ||
if (~query.indexOf(comparable(get(value, i)))) { | ||
return true; | ||
@@ -343,9 +360,6 @@ } | ||
} else { | ||
var comparableB = comparable(b); | ||
if ( | ||
comparableB === b && | ||
(typeof b === "undefined" ? "undefined" : _typeof(b)) === "object" | ||
) { | ||
for (var i = a.length; i--; ) { | ||
if (String(a[i]) === String(b) && String(b) !== "[object Object]") { | ||
var comparableValue = comparable(value); | ||
if (comparableValue === value && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object") { | ||
for (var i = query.length; i--;) { | ||
if (String(query[i]) === String(value) && String(value) !== "[object Object]") { | ||
return true; | ||
@@ -360,5 +374,5 @@ } | ||
*/ | ||
if (typeof comparableB == "undefined") { | ||
for (var i = a.length; i--; ) { | ||
if (a[i] == null) { | ||
if (typeof comparableValue == "undefined") { | ||
for (var i = query.length; i--;) { | ||
if (query[i] == null) { | ||
return true; | ||
@@ -372,10 +386,6 @@ } | ||
*/ | ||
for (var i = a.length; i--; ) { | ||
var validator = createRootValidator(get(a, i), options); | ||
var result = validate(validator, b, i, a); | ||
if ( | ||
result && | ||
String(result) !== "[object Object]" && | ||
String(b) !== "[object Object]" | ||
) { | ||
for (var i = query.length; i--;) { | ||
var validator = createRootValidator(get(query, i), options); | ||
var result = _validate(validator, comparableValue, i, query); | ||
if (result && String(result) !== "[object Object]" && String(comparableValue) !== "[object Object]") { | ||
return true; | ||
@@ -385,3 +395,3 @@ } | ||
return !!~a.indexOf(comparableB); | ||
return !!~query.indexOf(comparableValue); | ||
} | ||
@@ -393,12 +403,12 @@ | ||
$nin: function $nin(a, query, options) { | ||
var eq = prepare.$in(a, query, options); | ||
return function(a, b, k, o) { | ||
return !eq(a, b, k, o); | ||
$nin: function $nin(query, queryOwner, options) { | ||
var eq = prepare.$in(query, queryOwner, options); | ||
return function (validateOptions, value, key, valueOwner) { | ||
return !eq(validateOptions, value, key, valueOwner); | ||
}; | ||
}, | ||
$mod: function $mod(a) { | ||
return function(b) { | ||
return b % a[0] == a[1]; | ||
$mod: function $mod(query) { | ||
return function (value) { | ||
return value % query[0] == query[1]; | ||
}; | ||
@@ -410,6 +420,6 @@ }, | ||
$ne: function $ne(a, query, options) { | ||
var eq = prepare.$eq(a, query, options); | ||
return and(function(a, b, k, o) { | ||
return !eq(a, b, k, o); | ||
$ne: function $ne(query, queryOwner, options) { | ||
var eq = prepare.$eq(query, queryOwner, options); | ||
return and(function (validateOptions, value, key, valueOwner) { | ||
return !eq(validateOptions, value, key, valueOwner); | ||
}); | ||
@@ -421,4 +431,4 @@ }, | ||
$and: function $and(a, query, options) { | ||
return a.map(parse(options)); | ||
$and: function $and(query, queryOwner, options) { | ||
return query.map(parse(options)); | ||
}, | ||
@@ -429,4 +439,4 @@ | ||
$all: function $all(a, query, options) { | ||
return prepare.$and(a, query, options); | ||
$all: function $all(query, queryOwner, options) { | ||
return prepare.$and(query, queryOwner, options); | ||
}, | ||
@@ -437,4 +447,4 @@ | ||
$or: function $or(a, query, options) { | ||
return a.map(parse(options)); | ||
$or: function $or(query, queryOwner, options) { | ||
return query.map(parse(options)); | ||
}, | ||
@@ -445,4 +455,4 @@ | ||
$nor: function $nor(a, query, options) { | ||
return a.map(parse(options)); | ||
$nor: function $nor(query, queryOwner, options) { | ||
return query.map(parse(options)); | ||
}, | ||
@@ -453,12 +463,12 @@ | ||
$not: function $not(a, query, options) { | ||
var v = parse(options)(a); | ||
return function(b, k, o) { | ||
return !validate(v, b, k, o); | ||
$not: function $not(query, queryOwner, options) { | ||
var validateOptions = parse(options)(query); | ||
return function (value, key, valueOwner) { | ||
return !_validate(validateOptions, value, key, valueOwner); | ||
}; | ||
}, | ||
$type: function $type(a) { | ||
return function(b, k, o) { | ||
return b != void 0 ? b instanceof a || b.constructor == a : false; | ||
$type: function $type(query) { | ||
return function (value, key, valueOwner) { | ||
return value != void 0 ? value instanceof query || value.constructor == query : false; | ||
}; | ||
@@ -470,4 +480,4 @@ }, | ||
$regex: function $regex(a, query) { | ||
return new RegExp(a, query.$options); | ||
$regex: function $regex(query, queryOwner) { | ||
return new RegExp(query, queryOwner.$options); | ||
}, | ||
@@ -478,4 +488,4 @@ | ||
$where: function $where(a) { | ||
return typeof a === "string" ? new Function("obj", "return " + a) : a; | ||
$where: function $where(query) { | ||
return typeof query === "string" ? new Function("obj", "return " + query) : query; | ||
}, | ||
@@ -486,4 +496,4 @@ | ||
$elemMatch: function $elemMatch(a, query, options) { | ||
return parse(options)(a); | ||
$elemMatch: function $elemMatch(query, queryOwner, options) { | ||
return parse(options)(query); | ||
}, | ||
@@ -494,4 +504,4 @@ | ||
$exists: function $exists(a) { | ||
return !!a; | ||
$exists: function $exists(query) { | ||
return !!query; | ||
} | ||
@@ -506,3 +516,3 @@ }; | ||
var result = get(array, i); | ||
if (validate(validator, get(array, i))) { | ||
if (_validate(validator, get(array, i))) { | ||
return i; | ||
@@ -518,4 +528,4 @@ } | ||
function createValidator(a, validate) { | ||
return { a: a, v: validate }; | ||
function createValidator(options, validate) { | ||
return { options: options, validate: validate }; | ||
} | ||
@@ -526,24 +536,41 @@ | ||
function nestedValidator(a, b) { | ||
var values = []; | ||
findValues(b, a.k, 0, b, values); | ||
function validatedNested(_ref8, value) { | ||
var keyPath = _ref8.keyPath, | ||
child = _ref8.child, | ||
query = _ref8.query; | ||
if (values.length === 1) { | ||
var first = values[0]; | ||
return validate(a.nv, first[0], first[1], first[2]); | ||
var results = []; | ||
findValues(value, keyPath, 0, value, results); | ||
if (results.length === 1) { | ||
var _results$ = _slicedToArray(results[0], 3), | ||
_value = _results$[0], | ||
key = _results$[1], | ||
valueOwner = _results$[2]; | ||
return _validate(child, _value, key, valueOwner); | ||
} | ||
// If the query contains $ne, need to test all elements ANDed together | ||
var inclusive = a && a.q && typeof a.q.$ne !== "undefined"; | ||
var inclusive = query && typeof query.$ne !== "undefined"; | ||
var allValid = inclusive; | ||
for (var i = 0; i < values.length; i++) { | ||
var result = values[i]; | ||
var isValid = validate(a.nv, result[0], result[1], result[2]); | ||
if (inclusive) { | ||
allValid &= isValid; | ||
} else { | ||
allValid |= isValid; | ||
} | ||
} | ||
return allValid; | ||
var allValues = results.map(function (_ref9) { | ||
var _ref10 = _slicedToArray(_ref9, 1), | ||
value = _ref10[0]; | ||
return value; | ||
}); | ||
return _validate(child, undefined, undefined, undefined, results); | ||
// for (var i = 0; i < results.length; i++) { | ||
// const [value, key, valueOwner] = results[i]; | ||
// var isValid = validate(child, value, key, valueOwner); | ||
// console.log(isValid, value); | ||
// if (inclusive) { | ||
// allValid &= isValid; | ||
// } else { | ||
// allValid |= isValid; | ||
// } | ||
// } | ||
// return allValid; | ||
} | ||
@@ -577,4 +604,4 @@ | ||
function createNestedValidator(keypath, a, q) { | ||
return { a: { k: keypath, nv: a, q: q }, v: nestedValidator }; | ||
function createNestedValidator(keyPath, child, query) { | ||
return createValidator({ keyPath: keyPath, child: child, query: query }, validatedNested); | ||
} | ||
@@ -587,9 +614,3 @@ | ||
function isVanillaObject(value) { | ||
return ( | ||
value && | ||
(value.constructor === Object || | ||
value.constructor === Array || | ||
value.constructor.toString() === "function Object() { [native code] }" || | ||
value.constructor.toString() === "function Array() { [native code] }") | ||
); | ||
return value && (value.constructor === Object || value.constructor === Array || value.constructor.toString() === "function Object() { [native code] }" || value.constructor.toString() === "function Array() { [native code] }"); | ||
} | ||
@@ -599,3 +620,3 @@ | ||
var comparable = options.comparable, | ||
expressions = options.expressions; | ||
expressions = options.expressions; | ||
@@ -615,3 +636,3 @@ var wrapQuery = function wrapQuery(query) { | ||
for (var key in query) { | ||
var a = query[key]; | ||
var queryValue = query[key]; | ||
@@ -622,10 +643,9 @@ if (key === "$options") { | ||
var expression = | ||
defaultExpressions[key] || (options && expressions && expressions[key]); | ||
var expression = defaultExpressions[key] || options && expressions && expressions[key]; | ||
if (expression) { | ||
if (prepare[key]) { | ||
a = prepare[key](a, query, options); | ||
queryValue = prepare[key](queryValue, query, options); | ||
} | ||
validators.push(createValidator(comparable(a), expression)); | ||
validators.push(createValidator(comparable(queryValue), expression)); | ||
} else { | ||
@@ -638,9 +658,7 @@ if (key.charCodeAt(0) === 36) { | ||
validators.push(createNestedValidator(keyParts, parseNested(a), a)); | ||
validators.push(createNestedValidator(keyParts, parseNested(queryValue), queryValue)); | ||
} | ||
} | ||
return validators.length === 1 | ||
? validators[0] | ||
: createValidator(validators, defaultExpressions.$and); | ||
return validators.length === 1 ? validators[0] : createValidator(validators, defaultExpressions.$and); | ||
}; | ||
@@ -719,5 +737,5 @@ | ||
validator = { | ||
a: validator, | ||
v: function v(a, b, k, o) { | ||
return validate(a, b && options.select(b), k, o); | ||
options: validator, | ||
validate: function validate(validateOptions, value, key, valueOwner) { | ||
return _validate(validateOptions, value && options.select(value), key, valueOwner); | ||
} | ||
@@ -733,9 +751,6 @@ }; | ||
function sift(query, options) { | ||
options = Object.assign( | ||
{ compare: compare, comparable: comparable }, | ||
options | ||
); | ||
options = Object.assign({ compare: compare, comparable: comparable }, options); | ||
var validator = createRootValidator(query, options); | ||
return function(b, k, o) { | ||
return validate(validator, b, k, o); | ||
return function (value, key, valueOwner) { | ||
return _validate(validator, value, key, valueOwner); | ||
}; | ||
@@ -749,6 +764,3 @@ } | ||
if (isEqual(a, b)) return 0; | ||
if ( | ||
(typeof a === "undefined" ? "undefined" : _typeof(a)) === | ||
(typeof b === "undefined" ? "undefined" : _typeof(b)) | ||
) { | ||
if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === (typeof b === "undefined" ? "undefined" : _typeof(b))) { | ||
if (a > b) { | ||
@@ -755,0 +767,0 @@ return 1; |
{ | ||
"name": "sift", | ||
"description": "mongodb query style array filtering", | ||
"version": "8.5.0", | ||
"version": "8.5.1", | ||
"repository": "crcn/sift.js", | ||
@@ -41,4 +41,5 @@ "author": { | ||
"build": "mkdir -p lib; babel src/index.js > lib/index.js; webpack", | ||
"build:watch": "mkdir -p lib; babel --watch src/index.js --out-file=lib/index.js", | ||
"test": "mocha ./test -R spec --compilers js:babel-core/register" | ||
} | ||
} |
180
sift.min.js
@@ -14,4 +14,4 @@ !(function(n, t) { | ||
if (t[e]) return t[e].exports; | ||
var u = (t[e] = { i: e, l: !1, exports: {} }); | ||
return n[e].call(u.exports, u, u.exports, r), (u.l = !0), u.exports; | ||
var o = (t[e] = { i: e, l: !1, exports: {} }); | ||
return n[e].call(o.exports, o, o.exports, r), (o.l = !0), o.exports; | ||
} | ||
@@ -39,9 +39,9 @@ return ( | ||
) | ||
for (var u in n) | ||
for (var o in n) | ||
r.d( | ||
e, | ||
u, | ||
o, | ||
function(t) { | ||
return n[t]; | ||
}.bind(null, u) | ||
}.bind(null, o) | ||
); | ||
@@ -81,6 +81,6 @@ return e; | ||
r.d(t, "default", function() { | ||
return m; | ||
return y; | ||
}), | ||
r.d(t, "compare", function() { | ||
return y; | ||
return m; | ||
}), | ||
@@ -90,4 +90,4 @@ r.d(t, "comparable", function() { | ||
}); | ||
var u = e("Array"), | ||
o = e("Object"), | ||
var o = e("Array"), | ||
u = e("Object"), | ||
i = e("Function"); | ||
@@ -99,4 +99,4 @@ function f(n, t) { | ||
return function(t, r) { | ||
if (!u(r) || !r.length) return n(t, r); | ||
for (var e = 0, o = r.length; e < o; e++) | ||
if (!o(r) || !r.length) return n(t, r); | ||
for (var e = 0, u = r.length; e < u; e++) | ||
if (n(t, f(r, e))) return !0; | ||
@@ -108,4 +108,4 @@ return !1; | ||
return function(t, r) { | ||
if (!u(r) || !r.length) return n(t, r); | ||
for (var e = 0, o = r.length; e < o; e++) | ||
if (!o(r) || !r.length) return n(t, r); | ||
for (var e = 0, u = r.length; e < u; e++) | ||
if (!n(t, f(r, e))) return !1; | ||
@@ -116,3 +116,3 @@ return !0; | ||
function l(n, t, r, e) { | ||
return n.v(n.a, t, r, e); | ||
return n.validate(n.options, t, r, e); | ||
} | ||
@@ -141,5 +141,3 @@ var p = { | ||
}), | ||
$in: function(n, t) { | ||
return n(t); | ||
}, | ||
$in: (n, t) => n(t), | ||
$nin: function(n, t) { | ||
@@ -161,4 +159,4 @@ return n(t); | ||
$or: function(n, t, r, e) { | ||
for (var u = 0, o = n.length; u < o; u++) | ||
if (l(f(n, u), t, r, e)) return !0; | ||
for (var o = 0, u = n.length; o < u; o++) | ||
if (l(f(n, o), t, r, e)) return !0; | ||
return !1; | ||
@@ -170,4 +168,4 @@ }, | ||
$and: function(n, t, r, e) { | ||
for (var u = 0, o = n.length; u < o; u++) | ||
if (!l(f(n, u), t, r, e)) return !1; | ||
for (var o = 0, u = n.length; o < u; o++) | ||
if (!l(f(n, o), t, r, e)) return !1; | ||
return !0; | ||
@@ -182,3 +180,3 @@ }, | ||
$elemMatch: function(n, t, r, e) { | ||
return u(t) | ||
return o(t) | ||
? !!~(function(n, t) { | ||
@@ -205,5 +203,5 @@ for (var r = 0; r < n.length; r++) { | ||
? c(n) | ||
: u(n) && !n.length | ||
: o(n) && !n.length | ||
? c(function(n) { | ||
return u(n) && !n.length; | ||
return o(n) && !n.length; | ||
}) | ||
@@ -244,4 +242,4 @@ : c( | ||
if (!(t instanceof Array)) { | ||
var u = e(t); | ||
if (u === t && "object" == typeof t) | ||
var o = e(t); | ||
if (o === t && "object" == typeof t) | ||
for (i = n.length; i--; ) | ||
@@ -253,14 +251,14 @@ if ( | ||
return !0; | ||
if (void 0 === u) | ||
if (void 0 === o) | ||
for (i = n.length; i--; ) if (null == n[i]) return !0; | ||
for (i = n.length; i--; ) { | ||
var o = l(h(f(n, i), r), t, i, n); | ||
var u = l(h(f(n, i), r), o, i, n); | ||
if ( | ||
o && | ||
"[object Object]" !== String(o) && | ||
"[object Object]" !== String(t) | ||
u && | ||
"[object Object]" !== String(u) && | ||
"[object Object]" !== String(o) | ||
) | ||
return !0; | ||
} | ||
return !!~n.indexOf(u); | ||
return !!~n.indexOf(o); | ||
} | ||
@@ -274,4 +272,4 @@ for (var i = t.length; i--; ) | ||
const e = s.$in(n, t, r); | ||
return function(n, t, r, u) { | ||
return !e(n, t, r, u); | ||
return function(n, t, r, o) { | ||
return !e(n, t, r, o); | ||
}; | ||
@@ -286,8 +284,8 @@ }, | ||
const e = s.$eq(n, t, r); | ||
return a(function(n, t, r, u) { | ||
return !e(n, t, r, u); | ||
return a(function(n, t, r, o) { | ||
return !e(n, t, r, o); | ||
}); | ||
}, | ||
$and: function(n, t, r) { | ||
return n.map(b(r)); | ||
return n.map(v(r)); | ||
}, | ||
@@ -298,9 +296,9 @@ $all: function(n, t, r) { | ||
$or: function(n, t, r) { | ||
return n.map(b(r)); | ||
return n.map(v(r)); | ||
}, | ||
$nor: function(n, t, r) { | ||
return n.map(b(r)); | ||
return n.map(v(r)); | ||
}, | ||
$not: function(n, t, r) { | ||
const e = b(r)(n); | ||
const e = v(r)(n); | ||
return function(n, t, r) { | ||
@@ -324,3 +322,3 @@ return !l(e, n, t, r); | ||
$elemMatch: function(n, t, r) { | ||
return b(r)(n); | ||
return v(r)(n); | ||
}, | ||
@@ -332,35 +330,31 @@ $exists: function(n) { | ||
function g(n, t) { | ||
return { a: n, v: t }; | ||
return { options: n, validate: t }; | ||
} | ||
function $(n, t) { | ||
var r = []; | ||
function $({ keyPath: n, child: t, query: r }, e) { | ||
var u = []; | ||
if ( | ||
((function n(t, r, e, o, i) { | ||
((function n(t, r, e, u, i) { | ||
if (e === r.length || null == t) | ||
return void i.push([t, r[e - 1], o]); | ||
return void i.push([t, r[e - 1], u]); | ||
var c = f(r, e); | ||
if (u(t) && isNaN(Number(c))) | ||
if (o(t) && isNaN(Number(c))) | ||
for (var a = 0, l = t.length; a < l; a++) n(f(t, a), r, e, t, i); | ||
else n(f(t, c), r, e + 1, t, i); | ||
})(t, n.k, 0, t, r), | ||
1 === r.length) | ||
})(e, n, 0, e, u), | ||
1 === u.length) | ||
) { | ||
var e = r[0]; | ||
return l(n.nv, e[0], e[1], e[2]); | ||
var i = u[0]; | ||
return l(t, i[0], i[1], i[2]); | ||
} | ||
for ( | ||
var o = n && n.q && void 0 !== n.q.$ne, i = o, c = 0; | ||
c < r.length; | ||
c++ | ||
) { | ||
var a = r[c], | ||
p = l(n.nv, a[0], a[1], a[2]); | ||
o ? (i &= p) : (i |= p); | ||
for (var c = r && void 0 !== r.$ne, a = c, p = 0; p < u.length; p++) { | ||
var s = u[p], | ||
g = l(t, s[0], s[1], s[2]); | ||
c ? (a &= g) : (a |= g); | ||
} | ||
return i; | ||
return a; | ||
} | ||
function v(n, t, r) { | ||
return { a: { k: n, nv: t, q: r }, v: $ }; | ||
function d(n, t, r) { | ||
return g({ keyPath: n, child: t, query: r }, $); | ||
} | ||
function b(n) { | ||
function v(n) { | ||
const { comparable: t, expressions: r } = n; | ||
@@ -382,19 +376,19 @@ var e = function(n) { | ||
}, | ||
u = function(e) { | ||
o = function(e) { | ||
e = t(e); | ||
var u = []; | ||
for (var o in e) { | ||
var f = e[o]; | ||
if ("$options" !== o) { | ||
var c = p[o] || (n && r && r[o]); | ||
if (c) s[o] && (f = s[o](f, e, n)), u.push(g(t(f), c)); | ||
var o = []; | ||
for (var u in e) { | ||
var f = e[u]; | ||
if ("$options" !== u) { | ||
var c = p[u] || (n && r && r[u]); | ||
if (c) s[u] && (f = s[u](f, e, n)), o.push(g(t(f), c)); | ||
else { | ||
if (36 === o.charCodeAt(0)) | ||
throw new Error("Unknown operation " + o); | ||
var a = o.split("."); | ||
u.push(v(a, i(f), f)); | ||
if (36 === u.charCodeAt(0)) | ||
throw new Error("Unknown operation " + u); | ||
var a = u.split("."); | ||
o.push(d(a, i(f), f)); | ||
} | ||
} | ||
} | ||
return 1 === u.length ? u[0] : g(u, p.$and); | ||
return 1 === o.length ? o[0] : g(o, p.$and); | ||
}, | ||
@@ -406,3 +400,3 @@ i = function(n) { | ||
(function n(t, r) { | ||
if (!o(t)) return r; | ||
if (!u(t)) return r; | ||
for (var e in t) r.push(e), n(t[e], r); | ||
@@ -413,11 +407,11 @@ return r; | ||
.search(/[$.]/) | ||
? g(n, d) | ||
: u(n) | ||
? g(n, b) | ||
: o(n) | ||
); | ||
}; | ||
return function(n) { | ||
return u(e(n)); | ||
return o(e(n)); | ||
}; | ||
} | ||
function d(n, t) { | ||
function b(n, t) { | ||
if ( | ||
@@ -428,11 +422,11 @@ Object.prototype.toString.call(n) !== | ||
return !1; | ||
if (o(n)) { | ||
if (u(n)) { | ||
if (Object.keys(n).length !== Object.keys(t).length) return !1; | ||
for (var r in n) if (!d(n[r], t[r])) return !1; | ||
for (var r in n) if (!b(n[r], t[r])) return !1; | ||
return !0; | ||
} | ||
if (u(n)) { | ||
if (o(n)) { | ||
if (n.length !== t.length) return !1; | ||
for (var e = 0, i = n.length; e < i; e++) | ||
if (!d(n[e], t[e])) return !1; | ||
if (!b(n[e], t[e])) return !1; | ||
return !0; | ||
@@ -443,3 +437,3 @@ } | ||
function h(n, t) { | ||
var r = b(t)(n); | ||
var r = v(t)(n); | ||
return ( | ||
@@ -449,5 +443,5 @@ t && | ||
(r = { | ||
a: r, | ||
v: function(n, r, e, u) { | ||
return l(n, r && t.select(r), e, u); | ||
options: r, | ||
validate: function(n, r, e, o) { | ||
return l(n, r && t.select(r), e, o); | ||
} | ||
@@ -458,4 +452,4 @@ }), | ||
} | ||
function m(n, t) { | ||
var r = h(n, (t = Object.assign({ compare: y, comparable: j }, t))); | ||
function y(n, t) { | ||
var r = h(n, (t = Object.assign({ compare: m, comparable: j }, t))); | ||
return function(n, t, e) { | ||
@@ -465,4 +459,4 @@ return l(r, n, t, e); | ||
} | ||
function y(n, t) { | ||
if (d(n, t)) return 0; | ||
function m(n, t) { | ||
if (b(n, t)) return 0; | ||
if (typeof n == typeof t) { | ||
@@ -476,3 +470,3 @@ if (n > t) return 1; | ||
? n.getTime() | ||
: u(n) | ||
: o(n) | ||
? n.map(j) | ||
@@ -479,0 +473,0 @@ : n && "function" == typeof n.toJSON |
370
src/index.js
@@ -27,16 +27,25 @@ /* | ||
const nestable = (validator) => (validateOptions, value, key, valueOwner, nestedResults) => { | ||
if (nestedResults) { | ||
return Boolean(nestedResults.find(([value, key, valueOwner]) => validator(validateOptions, key, valueOwner))); | ||
} | ||
return validator(validateOptions, value, key, valueOwner); | ||
}; | ||
/** | ||
*/ | ||
function or(validator) { | ||
return function(a, b) { | ||
if (!isArray(b) || !b.length) { | ||
return validator(a, b); | ||
const or = nestable((validator) => { | ||
return function(validateOptions, value, key, valueOwner, nestedResults) { | ||
if (!isArray(value) || !value.length) { | ||
return validator(validateOptions, value); | ||
} | ||
for (var i = 0, n = b.length; i < n; i++) { | ||
if (validator(a, get(b, i))) return true; | ||
for (var i = 0, n = value.length; i < n; i++) { | ||
if (validator(validateOptions, get(value, i))) return true; | ||
} | ||
return false; | ||
}; | ||
} | ||
}); | ||
@@ -47,8 +56,8 @@ /** | ||
function and(validator) { | ||
return function(a, b) { | ||
if (!isArray(b) || !b.length) { | ||
return validator(a, b); | ||
return function(validateOptions, value, key, valueOwner) { | ||
if (!isArray(value) || !value.length) { | ||
return validator(validateOptions, value, key, valueOwner); | ||
} | ||
for (var i = 0, n = b.length; i < n; i++) { | ||
if (!validator(a, get(b, i))) return false; | ||
for (var i = 0, n = value.length; i < n; i++) { | ||
if (!validator(validateOptions, get(value, i), value, valueOwner)) return false; | ||
} | ||
@@ -59,4 +68,4 @@ return true; | ||
function validate(validator, b, k, o) { | ||
return validator.v(validator.a, b, k, o); | ||
function validate(validator, value, key, valueOwner, nestedResults) { | ||
return validator.validate(validator.options, value, key, valueOwner, nestedResults); | ||
} | ||
@@ -68,4 +77,4 @@ | ||
$eq: or(function(a, b) { | ||
return a(b); | ||
$eq: or(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -76,4 +85,4 @@ | ||
$ne: and(function(a, b) { | ||
return a(b); | ||
$ne: and(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -84,4 +93,4 @@ | ||
$gt: or(function(a, b) { | ||
return a(b); | ||
$gt: or(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -92,4 +101,4 @@ | ||
$gte: or(function(a, b) { | ||
return a(b); | ||
$gte: or(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -100,4 +109,4 @@ | ||
$lt: or(function(a, b) { | ||
return a(b); | ||
$lt: or(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -108,4 +117,4 @@ | ||
$lte: or(function(a, b) { | ||
return a(b); | ||
$lte: or(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -116,4 +125,4 @@ | ||
$mod: or(function(a, b) { | ||
return a(b); | ||
$mod: or(function(test, value) { | ||
return test(value); | ||
}), | ||
@@ -124,4 +133,4 @@ | ||
$in: function(a, b) { | ||
return a(b); | ||
$in(test, value) { | ||
return test(value); | ||
}, | ||
@@ -132,4 +141,4 @@ | ||
$nin: function(a, b) { | ||
return a(b); | ||
$nin: function(test, value) { | ||
return test(value); | ||
}, | ||
@@ -140,4 +149,4 @@ | ||
$not: function(a, b, k, o) { | ||
return a(b, k, o); | ||
$not: function(test, value, key, valueOwner) { | ||
return test(value, key, valueOwner); | ||
}, | ||
@@ -148,4 +157,4 @@ | ||
$type: function(a, b) { | ||
return a(b); | ||
$type: function(testType, value) { | ||
return testType(value); | ||
}, | ||
@@ -156,4 +165,4 @@ | ||
$all: function(a, b, k, o) { | ||
return defaultExpressions.$and(a, b, k, o); | ||
$all: function(allOptions, value, key, valueOwner, nestedResults) { | ||
return defaultExpressions.$and(allOptions, value, key, valueOwner, nestedResults); | ||
}, | ||
@@ -164,4 +173,4 @@ | ||
$size: function(a, b) { | ||
return b ? a === b.length : false; | ||
$size: function(sizeMatch, value) { | ||
return value ? sizeMatch === value.length : false; | ||
}, | ||
@@ -172,5 +181,5 @@ | ||
$or: function(a, b, k, o) { | ||
for (var i = 0, n = a.length; i < n; i++) { | ||
if (validate(get(a, i), b, k, o)) { | ||
$or: function(orOptions, value, key, valueOwner) { | ||
for (var i = 0, n = orOptions.length; i < n; i++) { | ||
if (validate(get(orOptions, i), value, key, valueOwner)) { | ||
return true; | ||
@@ -185,4 +194,4 @@ } | ||
$nor: function(a, b, k, o) { | ||
return !defaultExpressions.$or(a, b, k, o); | ||
$nor: function(validateOptions, value, key, valueOwner) { | ||
return !defaultExpressions.$or(validateOptions, value, key, valueOwner); | ||
}, | ||
@@ -193,7 +202,16 @@ | ||
$and: function(a, b, k, o) { | ||
for (var i = 0, n = a.length; i < n; i++) { | ||
if (!validate(get(a, i), b, k, o)) { | ||
return false; | ||
$and: function(validateOptions, value, key, valueOwner, nestedResults) { | ||
if (nestedResults) { | ||
for (var i = 0, n = validateOptions.length; i < n; i++) { | ||
if (!validate(get(validateOptions, i), value, key, valueOwner, nestedResults)) { | ||
return false; | ||
} | ||
} | ||
} else { | ||
for (var i = 0, n = validateOptions.length; i < n; i++) { | ||
if (!validate(get(validateOptions, i), value, key, valueOwner, nestedResults)) { | ||
return false; | ||
} | ||
} | ||
} | ||
@@ -206,4 +224,4 @@ return true; | ||
$regex: or(function(a, b) { | ||
return typeof b === "string" && a.test(b); | ||
$regex: or(function(validateOptions, value) { | ||
return typeof value === "string" && validateOptions.test(value); | ||
}), | ||
@@ -214,4 +232,4 @@ | ||
$where: function(a, b, k, o) { | ||
return a.call(b, b, k, o); | ||
$where: function(validateOptions, value, key, valueOwner) { | ||
return validateOptions.call(value, value, key, valueOwner); | ||
}, | ||
@@ -222,7 +240,7 @@ | ||
$elemMatch: function(a, b, k, o) { | ||
if (isArray(b)) { | ||
return !!~search(b, a); | ||
$elemMatch: function(validateOptions, value, key, valueOwner) { | ||
if (isArray(value)) { | ||
return !!~search(value, validateOptions); | ||
} | ||
return validate(a, b, k, o); | ||
return validate(validateOptions, value, key, valueOwner); | ||
}, | ||
@@ -233,4 +251,4 @@ | ||
$exists: function(a, b, k, o) { | ||
return o.hasOwnProperty(k) === a; | ||
$exists: function(validateOptions, value, key, valueOwner) { | ||
return valueOwner.hasOwnProperty(key) === validateOptions; | ||
} | ||
@@ -246,54 +264,54 @@ }; | ||
$eq: function(a, query, { comparable, compare }) { | ||
if (a instanceof RegExp) { | ||
return or(function(b) { | ||
return typeof b === "string" && a.test(b); | ||
$eq: function(query, queryOwner, { comparable, compare }) { | ||
if (query instanceof RegExp) { | ||
return or(function(value) { | ||
return typeof value === "string" && query.test(value); | ||
}); | ||
} else if (a instanceof Function) { | ||
return or(a); | ||
} else if (isArray(a) && !a.length) { | ||
} else if (query instanceof Function) { | ||
return or(query); | ||
} else if (isArray(query) && !query.length) { | ||
// Special case of a == [] | ||
return or(function(b) { | ||
return isArray(b) && !b.length; | ||
return or(function(value) { | ||
return isArray(value) && !value.length; | ||
}); | ||
} else if (a === null) { | ||
return or(function(b) { | ||
} else if (query === null) { | ||
return or(function(value) { | ||
//will match both null and undefined | ||
return b == null; | ||
return value == null; | ||
}); | ||
} | ||
return or(function(b) { | ||
return compare(comparable(b), comparable(a)) === 0; | ||
return or(function(value) { | ||
return compare(comparable(value), comparable(query)) === 0; | ||
}); | ||
}, | ||
$gt: function(a, query, { comparable, compare }) { | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) > 0; | ||
$gt: function(query, queryOwner, { comparable, compare }) { | ||
return function(value) { | ||
return compare(comparable(value), comparable(query)) > 0; | ||
}; | ||
}, | ||
$gte: function(a, query, { comparable, compare }) { | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) >= 0; | ||
$gte: function(query, queryOwner, { comparable, compare }) { | ||
return function(value) { | ||
return compare(comparable(value), comparable(query)) >= 0; | ||
}; | ||
}, | ||
$lt: function(a, query, { comparable, compare }) { | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) < 0; | ||
$lt: function(query, queryOwner, { comparable, compare }) { | ||
return function(value) { | ||
return compare(comparable(value), comparable(query)) < 0; | ||
}; | ||
}, | ||
$lte: function(a, query, { comparable, compare }) { | ||
return function(b) { | ||
return compare(comparable(b), comparable(a)) <= 0; | ||
$lte: function(query, queryOwner, { comparable, compare }) { | ||
return function(value) { | ||
return compare(comparable(value), comparable(query)) <= 0; | ||
}; | ||
}, | ||
$in: function(a, query, options) { | ||
$in: function(query, queryOwner, options) { | ||
const { comparable } = options; | ||
return function(b) { | ||
if (b instanceof Array) { | ||
for (var i = b.length; i--; ) { | ||
if (~a.indexOf(comparable(get(b, i)))) { | ||
return function(value) { | ||
if (value instanceof Array) { | ||
for (var i = value.length; i--; ) { | ||
if (~query.indexOf(comparable(get(value, i)))) { | ||
return true; | ||
@@ -303,6 +321,9 @@ } | ||
} else { | ||
var comparableB = comparable(b); | ||
if (comparableB === b && typeof b === "object") { | ||
for (var i = a.length; i--; ) { | ||
if (String(a[i]) === String(b) && String(b) !== "[object Object]") { | ||
var comparableValue = comparable(value); | ||
if (comparableValue === value && typeof value === "object") { | ||
for (var i = query.length; i--; ) { | ||
if ( | ||
String(query[i]) === String(value) && | ||
String(value) !== "[object Object]" | ||
) { | ||
return true; | ||
@@ -317,5 +338,5 @@ } | ||
*/ | ||
if (typeof comparableB == "undefined") { | ||
for (var i = a.length; i--; ) { | ||
if (a[i] == null) { | ||
if (typeof comparableValue == "undefined") { | ||
for (var i = query.length; i--; ) { | ||
if (query[i] == null) { | ||
return true; | ||
@@ -329,9 +350,9 @@ } | ||
*/ | ||
for (var i = a.length; i--; ) { | ||
var validator = createRootValidator(get(a, i), options); | ||
var result = validate(validator, b, i, a); | ||
for (var i = query.length; i--; ) { | ||
var validator = createRootValidator(get(query, i), options); | ||
var result = validate(validator, comparableValue, i, query); | ||
if ( | ||
result && | ||
String(result) !== "[object Object]" && | ||
String(b) !== "[object Object]" | ||
String(comparableValue) !== "[object Object]" | ||
) { | ||
@@ -342,3 +363,3 @@ return true; | ||
return !!~a.indexOf(comparableB); | ||
return !!~query.indexOf(comparableValue); | ||
} | ||
@@ -350,12 +371,12 @@ | ||
$nin: function(a, query, options) { | ||
const eq = prepare.$in(a, query, options); | ||
return function(a, b, k, o) { | ||
return !eq(a, b, k, o); | ||
$nin: function(query, queryOwner, options) { | ||
const eq = prepare.$in(query, queryOwner, options); | ||
return function(validateOptions, value, key, valueOwner) { | ||
return !eq(validateOptions, value, key, valueOwner); | ||
}; | ||
}, | ||
$mod: function(a) { | ||
return function(b) { | ||
return b % a[0] == a[1]; | ||
$mod: function(query) { | ||
return function(value) { | ||
return value % query[0] == query[1]; | ||
}; | ||
@@ -367,6 +388,6 @@ }, | ||
$ne: function(a, query, options) { | ||
const eq = prepare.$eq(a, query, options); | ||
return and(function(a, b, k, o) { | ||
return !eq(a, b, k, o); | ||
$ne: function(query, queryOwner, options) { | ||
const eq = prepare.$eq(query, queryOwner, options); | ||
return and(function(validateOptions, value, key, valueOwner) { | ||
return !eq(validateOptions, value, key, valueOwner); | ||
}); | ||
@@ -378,4 +399,4 @@ }, | ||
$and: function(a, query, options) { | ||
return a.map(parse(options)); | ||
$and: function(query, queryOwner, options) { | ||
return query.map(parse(options)); | ||
}, | ||
@@ -386,4 +407,4 @@ | ||
$all: function(a, query, options) { | ||
return prepare.$and(a, query, options); | ||
$all: function(query, queryOwner, options) { | ||
return prepare.$and(query, queryOwner, options); | ||
}, | ||
@@ -394,4 +415,4 @@ | ||
$or: function(a, query, options) { | ||
return a.map(parse(options)); | ||
$or: function(query, queryOwner, options) { | ||
return query.map(parse(options)); | ||
}, | ||
@@ -402,4 +423,4 @@ | ||
$nor: function(a, query, options) { | ||
return a.map(parse(options)); | ||
$nor: function(query, queryOwner, options) { | ||
return query.map(parse(options)); | ||
}, | ||
@@ -410,12 +431,14 @@ | ||
$not: function(a, query, options) { | ||
const v = parse(options)(a); | ||
return function(b, k, o) { | ||
return !validate(v, b, k, o); | ||
$not: function(query, queryOwner, options) { | ||
const validateOptions = parse(options)(query); | ||
return function(value, key, valueOwner) { | ||
return !validate(validateOptions, value, key, valueOwner); | ||
}; | ||
}, | ||
$type: function(a) { | ||
return function(b, k, o) { | ||
return b != void 0 ? b instanceof a || b.constructor == a : false; | ||
$type: function(query) { | ||
return function(value, key, valueOwner) { | ||
return value != void 0 | ||
? value instanceof query || value.constructor == query | ||
: false; | ||
}; | ||
@@ -427,4 +450,4 @@ }, | ||
$regex: function(a, query) { | ||
return new RegExp(a, query.$options); | ||
$regex: function(query, queryOwner) { | ||
return new RegExp(query, queryOwner.$options); | ||
}, | ||
@@ -435,4 +458,6 @@ | ||
$where: function(a) { | ||
return typeof a === "string" ? new Function("obj", "return " + a) : a; | ||
$where: function(query) { | ||
return typeof query === "string" | ||
? new Function("obj", "return " + query) | ||
: query; | ||
}, | ||
@@ -443,4 +468,4 @@ | ||
$elemMatch: function(a, query, options) { | ||
return parse(options)(a); | ||
$elemMatch: function(query, queryOwner, options) { | ||
return parse(options)(query); | ||
}, | ||
@@ -451,4 +476,4 @@ | ||
$exists: function(a) { | ||
return !!a; | ||
$exists: function(query) { | ||
return !!query; | ||
} | ||
@@ -474,4 +499,4 @@ }; | ||
function createValidator(a, validate) { | ||
return { a: a, v: validate }; | ||
function createValidator(options, validate) { | ||
return { options, validate }; | ||
} | ||
@@ -482,24 +507,28 @@ | ||
function nestedValidator(a, b) { | ||
var values = []; | ||
findValues(b, a.k, 0, b, values); | ||
if (values.length === 1) { | ||
var first = values[0]; | ||
return validate(a.nv, first[0], first[1], first[2]); | ||
function validatedNested({ keyPath, child, query }, value) { | ||
const results = []; | ||
findValues(value, keyPath, 0, value, results); | ||
if (results.length === 1) { | ||
const [value, key, valueOwner] = results[0]; | ||
return validate(child, value, key, valueOwner); | ||
} | ||
// If the query contains $ne, need to test all elements ANDed together | ||
var inclusive = a && a.q && typeof a.q.$ne !== "undefined"; | ||
var inclusive = query && typeof query.$ne !== "undefined"; | ||
var allValid = inclusive; | ||
for (var i = 0; i < values.length; i++) { | ||
var result = values[i]; | ||
var isValid = validate(a.nv, result[0], result[1], result[2]); | ||
if (inclusive) { | ||
allValid &= isValid; | ||
} else { | ||
allValid |= isValid; | ||
} | ||
} | ||
return allValid; | ||
const allValues = results.map(([value]) => value); | ||
return validate(child, undefined, undefined, undefined, results); | ||
// for (var i = 0; i < results.length; i++) { | ||
// const [value, key, valueOwner] = results[i]; | ||
// var isValid = validate(child, value, key, valueOwner); | ||
// console.log(isValid, value); | ||
// if (inclusive) { | ||
// allValid &= isValid; | ||
// } else { | ||
// allValid |= isValid; | ||
// } | ||
// } | ||
// return allValid; | ||
} | ||
@@ -533,4 +562,4 @@ | ||
function createNestedValidator(keypath, a, q) { | ||
return { a: { k: keypath, nv: a, q: q }, v: nestedValidator }; | ||
function createNestedValidator(keyPath, child, query) { | ||
return createValidator({ keyPath, child, query }, validatedNested); | ||
} | ||
@@ -567,3 +596,3 @@ | ||
for (var key in query) { | ||
var a = query[key]; | ||
var queryValue = query[key]; | ||
@@ -579,5 +608,5 @@ if (key === "$options") { | ||
if (prepare[key]) { | ||
a = prepare[key](a, query, options); | ||
queryValue = prepare[key](queryValue, query, options); | ||
} | ||
validators.push(createValidator(comparable(a), expression)); | ||
validators.push(createValidator(comparable(queryValue), expression)); | ||
} else { | ||
@@ -590,3 +619,5 @@ if (key.charCodeAt(0) === 36) { | ||
validators.push(createNestedValidator(keyParts, parseNested(a), a)); | ||
validators.push( | ||
createNestedValidator(keyParts, parseNested(queryValue), queryValue) | ||
); | ||
} | ||
@@ -671,5 +702,10 @@ } | ||
validator = { | ||
a: validator, | ||
v: function(a, b, k, o) { | ||
return validate(a, b && options.select(b), k, o); | ||
options: validator, | ||
validate: function(validateOptions, value, key, valueOwner) { | ||
return validate( | ||
validateOptions, | ||
value && options.select(value), | ||
key, | ||
valueOwner | ||
); | ||
} | ||
@@ -687,4 +723,4 @@ }; | ||
var validator = createRootValidator(query, options); | ||
return function(b, k, o) { | ||
return validate(validator, b, k, o); | ||
return function(value, key, valueOwner) { | ||
return validate(validator, value, key, valueOwner); | ||
}; | ||
@@ -691,0 +727,0 @@ } |
import * as assert from "assert"; | ||
import { default as _eval } from "eval"; | ||
import sift, { indexOf as siftIndexOf } from ".."; | ||
import { ObjectID } from "bson"; | ||
@@ -265,2 +266,83 @@ describe(__filename + "#", function() { | ||
}); | ||
it("Works with Object ids", () => { | ||
const test1 = sift({ | ||
$in: [ | ||
ObjectID("54dd5546b1d296a54d152e84"), | ||
ObjectID("54dd5546b1d296a54d152e85") | ||
] | ||
}); | ||
assert.equal(test1(ObjectID("54dd5546b1d296a54d152e84")), true); | ||
assert.equal(test1(ObjectID("54dd5546b1d296a54d152e85")), true); | ||
assert.equal(test1(ObjectID("54dd5546b1d296a54d152e86")), false); | ||
}); | ||
it("works woth toJSON", () => { | ||
function ObjectId(value) { | ||
// primitive implementation | ||
return { | ||
toJSON: () => value | ||
}; | ||
} | ||
const test1 = sift({ | ||
$in: [ObjectId("1"), ObjectId("2")] | ||
}); | ||
const result = test1(ObjectId("1")); // expects to be true | ||
assert.equal(result, true); | ||
}); | ||
// https://github.com/crcn/sift.js/issues/159 | ||
it("can sift with a regexp string", () => { | ||
let where = { | ||
$not: { | ||
value: { | ||
$regex: "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}$" | ||
} | ||
} | ||
}; | ||
const whereProps = { | ||
value: "funky@example.com" | ||
}; | ||
const filtered = [whereProps].filter(sift(where)); | ||
assert.equal(filtered.length, 0); | ||
}); | ||
// https://github.com/crcn/sift.js/issues/160 | ||
it('can work with nested $all', () => { | ||
const items = [{ | ||
"order" : { | ||
"id" : "or_0001", | ||
"amount" : 6000, | ||
"items" : [ | ||
{ | ||
"product" : "poster", | ||
"sku" : "P18x24", | ||
"quantity" : 1, | ||
"amount" : 3000 | ||
}, | ||
{ | ||
"product" : "frame", | ||
"sku" : "P18x24", | ||
"quantity" : 1, | ||
"amount" : 3000 | ||
}, | ||
{ | ||
"product" : "shipping", | ||
"sku" : "shipping", | ||
"quantity" : 1, | ||
"amount" : 5000 | ||
} | ||
] | ||
} | ||
}]; | ||
const results = items.filter(sift({ 'order.items.product': { $all: ['poster', 'frame'] } })); | ||
assert.equal(results.length, 1); | ||
}); | ||
}); |
@@ -5,3 +5,2 @@ import * as assert from "assert"; | ||
import sift from ".."; | ||
const ObjectID = require("bson").ObjectID; | ||
@@ -8,0 +7,0 @@ describe(__filename + "#", function() { |
@@ -5,2 +5,4 @@ import * as assert from "assert"; | ||
describe(__filename + "#", function() { | ||
@@ -7,0 +9,0 @@ [ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
269809
3137