Socket
Socket
Sign inDemoInstall

sift

Package Overview
Dependencies
Maintainers
2
Versions
155
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

sift - npm Package Compare versions

Comparing version 8.5.0 to 8.5.1

5

changelog.md

@@ -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"
}
}

@@ -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

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc