Comparing version
@@ -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
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
269809
3.3%3137
3.26%