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 9.0.7 to 10.0.0

lib/builtin.js

8

changelog.md

@@ -0,1 +1,9 @@

## 10.0.0
- new custom operations syntax (see API readme)
- null & undefined are not treated equally (change has been added to keep spec as functionality as possible to MongoDB)
- `select` option is not supported anymore
- `compare` option now expects `boolean` return value
- nested queries are no-longer supported
## 9.0.0

@@ -2,0 +10,0 @@

741

lib/index.js
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = sift;
exports.compare = compare;
exports.comparable = comparable;
function _typeof(obj) {
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
_typeof = function _typeof(obj) {
return typeof obj;
};
} else {
_typeof = function _typeof(obj) {
return obj &&
typeof Symbol === "function" &&
obj.constructor === Symbol &&
obj !== Symbol.prototype
? "symbol"
: typeof obj;
};
}
return _typeof(obj);
}
/*
*
* Copryright 2018, Craig Condon
* Licensed under MIT
*
* Filter JavaScript objects with mongodb queries
*/
function typeChecker(type) {
var typeString = "[object " + type + "]";
return function(value) {
return Object.prototype.toString.call(value) === typeString;
};
}
/**
*/
var isArray = typeChecker("Array");
var isObject = typeChecker("Object");
var isFunction = typeChecker("Function");
function get(obj, key) {
return isFunction(obj.get) ? obj.get(key) : obj[key];
}
/**
*/
function or(validator) {
return function(validateOptions, value) {
if (!isArray(value) || !value.length) {
return validator(validateOptions, value);
}
for (var i = 0, n = value.length; i < n; i++) {
if (validator(validateOptions, get(value, i))) return true;
}
return false;
};
}
/**
*/
function and(validator) {
return function(validateOptions, value) {
if (!isArray(value) || !value.length) {
return validator(validateOptions, value);
}
for (var i = 0, n = value.length; i < n; i++) {
if (!validator(validateOptions, get(value, i))) return false;
}
return true;
};
}
function _validate(validator, value, key, valueOwner) {
return validator.validate(validator.options, value, key, valueOwner);
}
var defaultExpressions = {
/**
*/
$eq: or(function(test, value) {
return test(value);
}),
/**
*/
$ne: and(function(test, value) {
return test(value);
}),
/**
*/
$gt: or(function(test, value) {
return test(value);
}),
/**
*/
$gte: or(function(test, value) {
return test(value);
}),
/**
*/
$lt: or(function(test, value) {
return test(value);
}),
/**
*/
$lte: or(function(test, value) {
return test(value);
}),
/**
*/
$mod: or(function(test, value) {
return test(value);
}),
/**
*/
$in: function $in(test, value) {
return test(value);
},
/**
*/
$nin: function $nin(test, value) {
return test(value);
},
/**
*/
$not: function $not(test, value, key, valueOwner) {
return test(value, key, valueOwner);
},
/**
*/
$type: function $type(testType, value) {
return testType(value);
},
/**
*/
$all: function $all(allOptions, value, key, valueOwner) {
return defaultExpressions.$and(allOptions, value, key, valueOwner);
},
/**
*/
$size: function $size(sizeMatch, value) {
return value ? sizeMatch === value.length : false;
},
/**
*/
$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;
}
}
return false;
},
/**
*/
$nor: function $nor(validateOptions, value, key, valueOwner) {
return !defaultExpressions.$or(validateOptions, value, key, valueOwner);
},
/**
*/
$and: function $and(validateOptions, value, key, valueOwner) {
for (var i = 0, n = validateOptions.length; i < n; i++) {
if (!_validate(get(validateOptions, i), value, key, valueOwner)) {
return false;
}
}
return true;
},
/**
*/
$regex: or(function(validateOptions, value) {
return typeof value === "string" && validateOptions.test(value);
}),
/**
*/
$where: function $where(validateOptions, value, key, valueOwner) {
return validateOptions.call(value, value, key, valueOwner);
},
/**
*/
$elemMatch: function $elemMatch(validateOptions, value, key, valueOwner) {
if (isArray(value)) {
return !!~search(value, validateOptions);
}
return _validate(validateOptions, value, key, valueOwner);
},
/**
*/
$exists: function $exists(validateOptions, value, key, valueOwner) {
return valueOwner.hasOwnProperty(key) === validateOptions;
}
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("./utils");
var defaultOperations = require("./operations");
var core_1 = require("./core");
var createFilter = function(query, _a) {
var _b = _a === void 0 ? {} : _a,
compare = _b.compare,
expressions = _b.expressions;
return core_1.createAndFilter(
core_1.createQueryFilters(query, {
compare: compare || utils_1.equals,
expressions: Object.assign({}, defaultOperations, expressions)
})
);
};
/**
*/
var prepare = {
/**
*/
$eq: function $eq(query, queryOwner, _ref) {
var comparable = _ref.comparable,
compare = _ref.compare;
if (query instanceof RegExp) {
return or(function(value) {
return typeof value === "string" && query.test(value);
});
} else if (query instanceof Function) {
return or(query);
} else if (isArray(query) && !query.length) {
// Special case of a == []
return or(function(value) {
return isArray(value) && !value.length;
});
} else if (query === null) {
return or(function(value) {
//will match both null and undefined
return value == null;
});
}
return or(function(value) {
return compare(comparable(value), comparable(query)) === 0;
});
},
$gt: function $gt(query, queryOwner, _ref2) {
var comparable = _ref2.comparable,
compare = _ref2.compare;
return function(value) {
return compare(comparable(value), comparable(query)) > 0;
};
},
$gte: function $gte(query, queryOwner, _ref3) {
var comparable = _ref3.comparable,
compare = _ref3.compare;
return function(value) {
return compare(comparable(value), comparable(query)) >= 0;
};
},
$lt: function $lt(query, queryOwner, _ref4) {
var comparable = _ref4.comparable,
compare = _ref4.compare;
return function(value) {
return compare(comparable(value), comparable(query)) < 0;
};
},
$lte: function $lte(query, queryOwner, _ref5) {
var comparable = _ref5.comparable,
compare = _ref5.compare;
return function(value) {
return compare(comparable(value), comparable(query)) <= 0;
};
},
$in: function $in(query, queryOwner, options) {
var comparable = options.comparable;
return function(value) {
if (value instanceof Array) {
for (var i = value.length; i--; ) {
if (~query.indexOf(comparable(get(value, i)))) {
return true;
}
}
} else {
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;
}
}
}
/*
Handles documents that are undefined, whilst also
having a 'null' element in the parameters to $in.
*/
if (typeof comparableValue == "undefined") {
for (var i = query.length; i--; ) {
if (query[i] == null) {
return true;
}
}
}
/*
Handles the case of {'field': {$in: [/regexp1/, /regexp2/, ...]}}
*/
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;
}
}
return !!~query.indexOf(comparableValue);
}
return false;
};
},
$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(query) {
return function(value) {
return value % query[0] == query[1];
};
},
/**
*/
$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);
});
},
/**
*/
$and: function $and(query, queryOwner, options) {
return query.map(parse(options));
},
/**
*/
$all: function $all(query, queryOwner, options) {
return prepare.$and(query, queryOwner, options);
},
/**
*/
$or: function $or(query, queryOwner, options) {
return query.map(parse(options));
},
/**
*/
$nor: function $nor(query, queryOwner, options) {
return query.map(parse(options));
},
/**
*/
$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(query) {
return function(value, key, valueOwner) {
return value != void 0
? value instanceof query || value.constructor == query
: false;
};
},
/**
*/
$regex: function $regex(query, queryOwner) {
return new RegExp(query, queryOwner.$options);
},
/**
*/
$where: function $where(query) {
if (typeof query === "function") {
return query;
}
if (!process.env.CSP_ENABLED) {
return new Function("obj", "return " + query);
}
throw new Error(
'In CSP mode, sift does not support strings in "$where" condition'
);
},
/**
*/
$elemMatch: function $elemMatch(query, queryOwner, options) {
return parse(options)(query);
},
/**
*/
$exists: function $exists(query) {
return !!query;
}
};
/**
*/
function search(array, validator) {
for (var i = 0; i < array.length; i++) {
var result = get(array, i);
if (_validate(validator, get(array, i))) {
return i;
}
}
return -1;
}
/**
*/
function createValidator(options, validate) {
return {
options: options,
validate: validate
};
}
/**
*/
function validatedNested(_ref6, value) {
var keyPath = _ref6.keyPath,
child = _ref6.child,
query = _ref6.query;
var values = [];
findValues(value, keyPath, 0, value, values);
if (values.length === 1) {
var first = values[0];
return _validate(child, first[0], first[1], first[2]);
} // If the query contains $ne, need to test all elements ANDed together
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(child, result[0], result[1], result[2]);
if (inclusive) {
allValid &= isValid;
} else {
allValid |= isValid;
}
}
return allValid;
}
/**
*/
function findValues(current, keypath, index, object, values) {
if (index === keypath.length || current == void 0) {
values.push([current, keypath[index - 1], object]);
return;
}
var k = get(keypath, index); // ensure that if current is an array, that the current key
// is NOT an array index. This sort of thing needs to work:
// sift({'foo.0':42}, [{foo: [42]}]);
if (isArray(current) && isNaN(Number(k))) {
for (var i = 0, n = current.length; i < n; i++) {
findValues(get(current, i), keypath, index, current, values);
}
} else {
findValues(get(current, k), keypath, index + 1, current, values);
}
}
/**
*/
function createNestedValidator(keyPath, child, query) {
return createValidator(
{
keyPath: keyPath,
child: child,
query: query
},
validatedNested
);
}
/**
* flatten the query
*/
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] }") &&
!value.toJSON
);
}
function parse(options) {
var comparable = options.comparable,
expressions = options.expressions;
var wrapQuery = function wrapQuery(query) {
if (!query || !isVanillaObject(query)) {
query = {
$eq: query
};
}
return query;
};
var parseQuery = function parseQuery(query) {
query = comparable(query);
var validators = [];
for (var key in query) {
var queryValue = query[key];
if (key === "$options") {
continue;
}
var expression =
defaultExpressions[key] || (options && expressions && expressions[key]);
if (expression) {
if (prepare[key]) {
queryValue = prepare[key](queryValue, query, options);
}
validators.push(createValidator(comparable(queryValue), expression));
} else {
if (key.charCodeAt(0) === 36) {
throw new Error("Unknown operation " + key);
}
var keyParts = key.split(".");
validators.push(
createNestedValidator(keyParts, parseNested(queryValue), queryValue)
);
}
}
return validators.length === 1
? validators[0]
: createValidator(validators, defaultExpressions.$and);
};
var parseNested = function parseNested(query) {
query = wrapQuery(query);
if (isExactObject(query)) {
return createValidator(query, isEqual);
}
return parseQuery(query);
};
var parseRoot = function parseRoot(query) {
return parseQuery(wrapQuery(query));
};
return parseRoot;
}
function isEqual(a, b) {
if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) {
return false;
}
if (isObject(a)) {
if (Object.keys(a).length !== Object.keys(b).length) {
return false;
}
for (var key in a) {
if (!isEqual(a[key], b[key])) {
return false;
}
}
return true;
} else if (isArray(a)) {
if (a.length !== b.length) {
return false;
}
for (var i = 0, n = a.length; i < n; i++) {
if (!isEqual(a[i], b[i])) {
return false;
}
}
return true;
} else {
return a === b;
}
}
function getAllKeys(value, keys) {
if (!isObject(value)) {
return keys;
}
for (var key in value) {
keys.push(key);
getAllKeys(value[key], keys);
}
return keys;
}
function isExactObject(value) {
var allKeysHash = getAllKeys(value, []).join(",");
return allKeysHash.search(/[$.]/) === -1;
}
/**
*/
function createRootValidator(query, options) {
var validator = parse(options)(query);
if (options && options.select) {
validator = {
options: validator,
validate: function validate(validateOptions, value, key, valueOwner) {
return _validate(
validateOptions,
value && options.select(value),
key,
valueOwner
);
}
};
}
return validator;
}
/**
*/
function sift(query, options) {
options = Object.assign(
{
compare: compare,
comparable: comparable
},
options
);
var validator = createRootValidator(query, options);
return function(value, key, valueOwner) {
return _validate(validator, value, key, valueOwner);
};
}
/**
*/
function compare(a, b) {
if (isEqual(a, b)) return 0;
if (_typeof(a) === _typeof(b)) {
if (a > b) {
return 1;
}
if (a < b) {
return -1;
}
}
}
/**
*/
function comparable(value) {
if (value instanceof Date) {
return value.getTime();
} else if (isArray(value)) {
return value.map(comparable);
} else if (value && typeof value.toJSON === "function") {
return value.toJSON();
} else {
return value;
}
}
exports.default = createFilter;
{
"name": "sift",
"description": "mongodb query style array filtering",
"version": "9.0.7",
"version": "10.0.0",
"repository": "crcn/sift.js",

@@ -13,3 +13,5 @@ "author": {

"engines": {},
"dependencies": {},
"dependencies": {
"@babel/register": "^7.7.7"
},
"typings": "./index.d.ts",

@@ -22,7 +24,5 @@ "husky": {

"devDependencies": {
"@babel/cli": "^7.7.5",
"@babel/core": "^7.7.7",
"@babel/preset-env": "^7.7.7",
"@babel/register": "^7.7.4",
"babel-loader": "^8.0.6",
"@types/node": "^13.1.5",
"bson": "^3.0.2",

@@ -35,5 +35,6 @@ "eval": "^0.1.3",

"pretty-quick": "^1.8.0",
"ts-loader": "^6.2.1",
"typescript": "^3.7.4",
"webpack": "^4.41.5",
"webpack-cli": "^3.1.2",
"yargs": "^3.15.0"
"webpack-cli": "^3.1.2"
},

@@ -45,8 +46,8 @@ "main": "./lib/index.js",

"build": "npm run build:lib && npm run build:min && npm run build:csp",
"build:lib": "mkdir -p lib; babel src/index.js > lib/index.js",
"build:lib": "tsc",
"build:min": "webpack",
"build:csp": "CSP_ENABLED=1 webpack",
"build:watch": "mkdir -p lib; babel --watch src/index.js --out-file=lib/index.js",
"build:watch": "tsc --watch",
"test": "mocha ./test -R spec --compilers js:@babel/register"
}
}

@@ -71,3 +71,3 @@ ## validate objects & filter arrays with mongodb queries

//regexp filter
var sifted = sift(/^j/, ["craig", "john", "jake"]); //['john','jake']
var sifted = ["craig", "john", "jake"].filter(sift(/^j/)); //['john','jake']
</script>

@@ -85,6 +85,4 @@ </head>

- `options`
- `select` - value selector
- `expressions` - custom expressions
- `compare` - compares difference between two values
- `comparable`

@@ -436,3 +434,3 @@ With an array:

expressions: {
$customMod: function(query, value) {
$customMod: query => value => {
return query % value;

@@ -439,0 +437,0 @@ }

@@ -1,481 +0,383 @@

!(function(n, t) {
!(function(r, e) {
"object" == typeof exports && "object" == typeof module
? (module.exports = t())
? (module.exports = e())
: "function" == typeof define && define.amd
? define([], t)
? define([], e)
: "object" == typeof exports
? (exports.sift = t())
: (n.sift = t());
? (exports.sift = e())
: (r.sift = e());
})(this, function() {
return (function(n) {
var t = {};
function r(e) {
if (t[e]) return t[e].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;
return (function(r) {
var e = {};
function t(n) {
if (e[n]) return e[n].exports;
var u = (e[n] = { i: n, l: !1, exports: {} });
return r[n].call(u.exports, u, u.exports, t), (u.l = !0), u.exports;
}
return (
(r.m = n),
(r.c = t),
(r.d = function(n, t, e) {
r.o(n, t) || Object.defineProperty(n, t, { enumerable: !0, get: e });
(t.m = r),
(t.c = e),
(t.d = function(r, e, n) {
t.o(r, e) || Object.defineProperty(r, e, { enumerable: !0, get: n });
}),
(r.r = function(n) {
(t.r = function(r) {
"undefined" != typeof Symbol &&
Symbol.toStringTag &&
Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }),
Object.defineProperty(n, "__esModule", { value: !0 });
Object.defineProperty(r, Symbol.toStringTag, { value: "Module" }),
Object.defineProperty(r, "__esModule", { value: !0 });
}),
(r.t = function(n, t) {
if ((1 & t && (n = r(n)), 8 & t)) return n;
if (4 & t && "object" == typeof n && n && n.__esModule) return n;
var e = Object.create(null);
(t.t = function(r, e) {
if ((1 & e && (r = t(r)), 8 & e)) return r;
if (4 & e && "object" == typeof r && r && r.__esModule) return r;
var n = Object.create(null);
if (
(r.r(e),
Object.defineProperty(e, "default", { enumerable: !0, value: n }),
2 & t && "string" != typeof n)
(t.r(n),
Object.defineProperty(n, "default", { enumerable: !0, value: r }),
2 & e && "string" != typeof r)
)
for (var o in n)
r.d(
e,
o,
function(t) {
return n[t];
}.bind(null, o)
for (var u in r)
t.d(
n,
u,
function(e) {
return r[e];
}.bind(null, u)
);
return e;
return n;
}),
(r.n = function(n) {
var t =
n && n.__esModule
(t.n = function(r) {
var e =
r && r.__esModule
? function() {
return n.default;
return r.default;
}
: function() {
return n;
return r;
};
return r.d(t, "a", t), t;
return t.d(e, "a", e), e;
}),
(r.o = function(n, t) {
return Object.prototype.hasOwnProperty.call(n, t);
(t.o = function(r, e) {
return Object.prototype.hasOwnProperty.call(r, e);
}),
(r.p = ""),
r((r.s = 0))
(t.p = ""),
t((t.s = 2))
);
})([
function(n, t, r) {
n.exports = r(1);
},
function(n, t, r) {
function(r, e, t) {
"use strict";
function e(n) {
return (e =
"function" == typeof Symbol && "symbol" == typeof Symbol.iterator
? function(n) {
return typeof n;
}
: function(n) {
return n &&
"function" == typeof Symbol &&
n.constructor === Symbol &&
n !== Symbol.prototype
? "symbol"
: typeof n;
})(n);
}
function o(n) {
var t = "[object " + n + "]";
return function(n) {
return Object.prototype.toString.call(n) === t;
Object.defineProperty(e, "__esModule", { value: !0 });
var n = function(r) {
var e = "[object " + r + "]";
return function(r) {
return Object.prototype.toString.call(r) === e;
};
},
u = function(r) {
return r instanceof Date
? r.getTime()
: o(r)
? r.map(u)
: r && "function" == typeof r.toJSON
? r.toJSON()
: r;
};
}
r.r(t),
r.d(t, "default", function() {
return m;
}),
r.d(t, "compare", function() {
return j;
}),
r.d(t, "comparable", function() {
return O;
});
var u = o("Array"),
i = o("Object"),
f = o("Function");
function c(n, t) {
return f(n.get) ? n.get(t) : n[t];
}
function a(n) {
return function(t, r) {
if (!u(r) || !r.length) return n(t, r);
for (var e = 0, o = r.length; e < o; e++)
if (n(t, c(r, e))) return !0;
e.comparable = u;
e.get = function(r, e) {
return c(r.get) ? r.get(e) : r[e];
};
var o = n("Array");
e.isArray = o;
var i = n("Object");
e.isObject = i;
var c = n("Function");
e.isFunction = c;
e.isVanillaObject = function(r) {
return (
r &&
(r.constructor === Object ||
r.constructor === Array ||
"function Object() { [native code] }" ===
r.constructor.toString() ||
"function Array() { [native code] }" ===
r.constructor.toString()) &&
!r.toJSON
);
};
var a = function(r, e) {
if (null == r && r == e) return !0;
if (r === e) return !0;
if (
Object.prototype.toString.call(r) !==
Object.prototype.toString.call(e)
)
return !1;
};
}
function l(n) {
return function(t, r) {
if (!u(r) || !r.length) return n(t, r);
for (var e = 0, o = r.length; e < o; e++)
if (!n(t, c(r, e))) return !1;
if (o(r)) {
if (r.length !== e.length) return !1;
for (var t = 0, n = r.length; t < n; t++)
if (!a(r[t], e[t])) return !1;
return !0;
}
if (i(r)) {
if (Object.keys(r).length !== Object.keys(e).length) return !1;
for (var u in r) if (!a(r[u], e[u])) return !1;
return !0;
}
return !1;
};
e.equals = a;
e.hasNestedProperty = function(r, e) {
var t = String(e).split("."),
n = r;
if (1 === t.length) return n.hasOwnProperty(e);
for (var u = 0, o = t.length - 1; u < o; u++)
if (!(n = n[t[u]])) return !1;
return n.hasOwnProperty(t[t.length - 1]);
};
e.nope = function() {
return !1;
};
},
function(r, e, t) {
"use strict";
Object.defineProperty(e, "__esModule", { value: !0 });
var n = t(0),
u = function(r) {
return function(e, t, u) {
if (!n.isArray(e) || !e.length) return r(e, t, u);
for (var o = 0, i = e.length; o < i; o++)
if (r(n.get(e, o), t, u)) return !0;
return !1;
};
};
}
function p(n, t, r, e) {
return n.validate(n.options, t, r, e);
}
var s = {
$eq: a(function(n, t) {
return n(t);
}),
$ne: l(function(n, t) {
return n(t);
}),
$gt: a(function(n, t) {
return n(t);
}),
$gte: a(function(n, t) {
return n(t);
}),
$lt: a(function(n, t) {
return n(t);
}),
$lte: a(function(n, t) {
return n(t);
}),
$mod: a(function(n, t) {
return n(t);
}),
$in: function(n, t) {
return n(t);
},
$nin: function(n, t) {
return n(t);
},
$not: function(n, t, r, e) {
return n(t, r, e);
},
$type: function(n, t) {
return n(t);
},
$all: function(n, t, r, e) {
return s.$and(n, t, r, e);
},
$size: function(n, t) {
return !!t && n === t.length;
},
$or: function(n, t, r, e) {
for (var o = 0, u = n.length; o < u; o++)
if (p(c(n, o), t, r, e)) return !0;
e.spreadValueArray = u;
e.numericalOperation = function(r) {
return function(e) {
var t = n.comparable(e);
return null == t ? n.nope : u(r(t));
};
};
var o = function(r) {
return function(e) {
return "string" == typeof e && r.test(e);
};
};
e.createRegexpTester = o;
var i = function(r, e) {
var t = e.compare,
u = void 0 === t ? n.equals : t;
if (n.isFunction(r)) return r;
if (r instanceof RegExp) return o(r);
var i = n.comparable(r);
return function(r, e, t) {
return u(i, n.comparable(r));
};
};
e.createTester = i;
var c = function(r, e, t) {
var n = (function(r) {
for (var e in r) if ("$" === e.charAt(0)) return !0;
return !1;
},
$nor: function(n, t, r, e) {
return !s.$or(n, t, r, e);
},
$and: function(n, t, r, e) {
for (var o = 0, u = n.length; o < u; o++)
if (!p(c(n, o), t, r, e)) return !1;
return !0;
},
$regex: a(function(n, t) {
return "string" == typeof t && n.test(t);
}),
$where: function(n, t, r, e) {
return n.call(t, t, r, e);
},
$elemMatch: function(n, t, r, e) {
return u(t)
? !!~(function(n, t) {
for (var r = 0; r < n.length; r++) {
c(n, r);
if (p(t, c(n, r))) return r;
}
return -1;
})(t, n)
: p(n, t, r, e);
},
$exists: function(n, t, r, e) {
return e.hasOwnProperty(r) === n;
})(e)
? s(f(e, t))
: i(e, t),
u = r.split("."),
o = e && null != e.$ne;
return function(r, e, t) {
return a(n, o, r, u, t, 0);
};
};
e.createNestedFilter = c;
var a = function(r, e, t, u, o, i) {
var c = u[i];
if (n.isArray(t) && isNaN(Number(c))) {
for (var f = void 0, l = 0, s = t.length; l < s; l++) {
var p = a(r, e, n.get(t, l), u, o, i);
f = e && null != f ? f && p : f || p;
}
return f;
}
var v = n.get(t, c);
return t && null == v
? r(void 0, c, t)
: i === u.length - 1
? r(v, c, t)
: a(r, e, v, u, t, i + 1);
},
g = {
$eq: function(n, t, r) {
var e = r.comparable,
o = r.compare;
return n instanceof RegExp
? a(function(t) {
return "string" == typeof t && n.test(t);
})
: n instanceof Function
? a(n)
: u(n) && !n.length
? a(function(n) {
return u(n) && !n.length;
})
: a(
null === n
? function(n) {
return null == n;
}
: function(t) {
return 0 === o(e(t), e(n));
}
);
},
$gt: function(n, t, r) {
var e = r.comparable,
o = r.compare;
return function(t) {
return o(e(t), e(n)) > 0;
};
},
$gte: function(n, t, r) {
var e = r.comparable,
o = r.compare;
return function(t) {
return o(e(t), e(n)) >= 0;
};
},
$lt: function(n, t, r) {
var e = r.comparable,
o = r.compare;
return function(t) {
return o(e(t), e(n)) < 0;
};
},
$lte: function(n, t, r) {
var e = r.comparable,
o = r.compare;
return function(t) {
return o(e(t), e(n)) <= 0;
};
},
$in: function(n, t, r) {
var o = r.comparable;
return function(t) {
if (!(t instanceof Array)) {
var u = o(t);
if (u === t && "object" === e(t))
for (f = n.length; f--; )
if (
String(n[f]) === String(t) &&
"[object Object]" !== String(t)
)
return !0;
if (void 0 === u)
for (f = n.length; f--; ) if (null == n[f]) return !0;
for (f = n.length; f--; ) {
var i = p(h(c(n, f), r), u, f, n);
if (
i &&
"[object Object]" !== String(i) &&
"[object Object]" !== String(u)
)
return !0;
}
return !!~n.indexOf(u);
}
for (var f = t.length; f--; )
if (~n.indexOf(o(c(t, f)))) return !0;
return !1;
};
},
$nin: function(n, t, r) {
var e = g.$in(n, t, r);
return function(n, t, r, o) {
return !e(n, t, r, o);
};
},
$mod: function(n) {
return function(t) {
return t % n[0] == n[1];
};
},
$ne: function(n, t, r) {
var e = g.$eq(n, t, r);
return l(function(n, t, r, o) {
return !e(n, t, r, o);
});
},
$and: function(n, t, r) {
return n.map(y(r));
},
$all: function(n, t, r) {
return g.$and(n, t, r);
},
$or: function(n, t, r) {
return n.map(y(r));
},
$nor: function(n, t, r) {
return n.map(y(r));
},
$not: function(n, t, r) {
var e = y(r)(n);
return function(n, t, r) {
return !p(e, n, t, r);
};
},
$type: function(n) {
return function(t, r, e) {
return null != t && (t instanceof n || t.constructor == n);
};
},
$regex: function(n, t) {
return new RegExp(n, t.$options);
},
$where: function(n) {
return "function" == typeof n
? n
: new Function("obj", "return " + n);
},
$elemMatch: function(n, t, r) {
return y(r)(n);
},
$exists: function(n) {
return !!n;
f = function(r, e) {
var t = [];
for (var u in (n.isVanillaObject(r) || (r = { $eq: r }), r)) {
var o = r[u];
"$" === u.charAt(0) ? t.push(l(u, o, r, e)) : t.push(c(u, o, e));
}
return t;
};
function v(n, t) {
return { options: n, validate: t };
}
function b(n, t) {
var r = n.keyPath,
e = n.child,
o = n.query,
i = [];
if (
((function n(t, r, e, o, i) {
if (e === r.length || null == t)
return void i.push([t, r[e - 1], o]);
var f = c(r, e);
if (u(t) && isNaN(Number(f)))
for (var a = 0, l = t.length; a < l; a++) n(c(t, a), r, e, t, i);
else n(c(t, f), r, e + 1, t, i);
})(t, r, 0, t, i),
1 === i.length)
) {
var f = i[0];
return p(e, f[0], f[1], f[2]);
}
for (var a = o && void 0 !== o.$ne, l = a, s = 0; s < i.length; s++) {
var g = i[s],
v = p(e, g[0], g[1], g[2]);
a ? (l &= v) : (l |= v);
}
return l;
}
function $(n, t, r) {
return v({ keyPath: n, child: t, query: r }, b);
}
function y(n) {
var t = n.comparable,
r = n.expressions,
e = function(n) {
var t;
return (
(!n ||
(!(t = n) ||
(t.constructor !== Object &&
t.constructor !== Array &&
"function Object() { [native code] }" !==
t.constructor.toString() &&
"function Array() { [native code] }" !==
t.constructor.toString()) ||
t.toJSON)) &&
(n = { $eq: n }),
n
);
},
o = function(e) {
e = t(e);
var o = [];
for (var i in e) {
var f = e[i];
if ("$options" !== i) {
var c = s[i] || (n && r && r[i]);
if (c) g[i] && (f = g[i](f, e, n)), o.push(v(t(f), c));
else {
if (36 === i.charCodeAt(0))
throw new Error("Unknown operation " + i);
var a = i.split(".");
o.push($(a, u(f), f));
}
}
}
return 1 === o.length ? o[0] : v(o, s.$and);
},
u = function(n) {
return (
(n = e(n)),
-1 ===
(function n(t, r) {
if (!i(t)) return r;
for (var e in t) r.push(e), n(t[e], r);
return r;
})(n, [])
.join(",")
.search(/[$.]/)
? v(n, d)
: o(n)
);
e.createQueryFilters = f;
var l = function(r, e, t, n) {
var u = n.expressions[r];
if (!u) throw new Error("Unsupported operation " + r);
return u(e, n, t);
},
s = function(r) {
return function(e, t, n) {
for (var u = r.length; u--; ) if (!r[u](e, t, n)) return !1;
return !0;
};
return function(n) {
return o(e(n));
};
}
function d(n, t) {
if (
Object.prototype.toString.call(n) !==
Object.prototype.toString.call(t)
)
e.createAndFilter = s;
e.createOrFilter = function(r) {
return function(e, t, n) {
for (var u = r.length; u--; ) if (r[u](e, t, n)) return !0;
return !1;
if (i(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;
};
};
},
function(r, e, t) {
r.exports = t(3);
},
function(r, e, t) {
"use strict";
Object.defineProperty(e, "__esModule", { value: !0 });
var n = t(0),
u = t(4),
o = t(1);
e.default = function(r, e) {
var t = void 0 === e ? {} : e,
i = t.compare,
c = t.expressions;
return o.createAndFilter(
o.createQueryFilters(r, {
compare: i || n.equals,
expressions: Object.assign({}, u, c)
})
);
};
},
function(r, e, t) {
"use strict";
Object.defineProperty(e, "__esModule", { value: !0 });
var n = t(0),
u = t(1),
o = function(r, e) {
return u.spreadValueArray(u.createTester(r, e));
};
e.$eq = o;
e.$ne = function(r, e) {
var t = o(r, e);
return function(r, e, n) {
return !t(r, e, n);
};
};
var i = u.numericalOperation(function(r) {
return function(e) {
return n.comparable(e) > r;
};
});
e.$gt = i;
var c = u.numericalOperation(function(r) {
return function(e) {
return n.comparable(e) >= r;
};
});
e.$gte = c;
var a = u.numericalOperation(function(r) {
return function(e) {
return n.comparable(e) < r;
};
});
e.$lt = a;
var f = u.numericalOperation(function(r) {
return function(e) {
return n.comparable(e) <= r;
};
});
e.$lte = f;
var l = u.numericalOperation(function(r) {
var e = r[0],
t = r[1];
return function(r) {
return n.comparable(r) % e === t;
};
});
e.$mod = l;
e.$exists = function(r) {
return u.spreadValueArray(function(e, t, n) {
return n.hasOwnProperty(t) === r;
});
};
var s = function(r, e) {
var t = v(r, e);
return function(r, e, n) {
return t(r, e, n);
};
};
e.$in = s;
e.$nin = function(r, e) {
var t = s(r, e);
return function(r, e, n) {
return !t(r, e, n);
};
};
var p = function(r, e) {
return u.createAndFilter(
r.map(function(r) {
return u.createOrFilter(u.createQueryFilters(r, e));
})
);
};
e.$and = p;
e.$options = function(r) {
return function(r) {
return !0;
}
if (u(n)) {
if (n.length !== t.length) return !1;
for (var e = 0, o = n.length; e < o; e++)
if (!d(n[e], t[e])) return !1;
return !0;
}
return n === t;
}
function h(n, t) {
var r = y(t)(n);
};
};
e.$not = function(r, e) {
var t = u.createAndFilter(u.createQueryFilters(r, e));
return function(r, e, n) {
return !t(r, e, n);
};
};
e.$size = function(r) {
return function(e) {
return e && e.length === r;
};
};
e.$all = function(r, e) {
return p(r, e);
};
e.$type = function(r) {
return u.spreadValueArray(function(e) {
return null != e && (e instanceof r || e.constructor === r);
});
};
e.$regex = function(r, e, t) {
var n = t.$options,
o = r instanceof RegExp ? r : new RegExp(r, n);
return u.spreadValueArray(u.createRegexpTester(o));
};
e.$elemMatch = function(r, e) {
return u.createAndFilter(u.createQueryFilters(r, e));
};
var v = function(r, e) {
return u.createOrFilter(
r.map(function(r) {
return u.createAndFilter(u.createQueryFilters(r, e));
})
);
};
e.$or = v;
e.$nor = function(r, e) {
var t = v(r, e);
return function(r, e, n) {
return !t(r, e, n);
};
};
e.$where = function(r) {
var e;
return (
t &&
t.select &&
(r = {
options: r,
validate: function(n, r, e, o) {
return p(n, r && t.select(r), e, o);
}
}),
r
(e = n.isFunction(r) ? r : new Function("obj", "return " + r)),
function(r) {
return e.bind(r)(r);
}
);
}
function m(n, t) {
var r = h(n, (t = Object.assign({ compare: j, comparable: O }, t)));
return function(n, t, e) {
return p(r, n, t, e);
};
}
function j(n, t) {
if (d(n, t)) return 0;
if (e(n) === e(t)) {
if (n > t) return 1;
if (n < t) return -1;
}
}
function O(n) {
return n instanceof Date
? n.getTime()
: u(n)
? n.map(O)
: n && "function" == typeof n.toJSON
? n.toJSON()
: n;
}
};
}

@@ -482,0 +384,0 @@ ]);

@@ -36,3 +36,3 @@ import * as assert from "assert";

].forEach(function([description, query, values, result]) {
it(description, function() {
xit(description, function() {
return new Promise(function(resolve, reject) {

@@ -39,0 +39,0 @@ var filter = asyncFilter(sift(query));

@@ -20,3 +20,3 @@ import * as assert from "assert";

it("can create a custom selector, and use it", function() {
xit("can create a custom selector, and use it", function() {
var sifter = sift(

@@ -46,3 +46,3 @@ { age: { $gt: 5 } },

assert.equal(err.message, "Unknown operation $aaa");
assert.equal(err.message, "Unsupported operation $aaa");
});

@@ -253,3 +253,3 @@

calledCompareCount++;
return other && this.value === other.value ? 0 : -1;
return other && this.value === other.value;
}

@@ -256,0 +256,0 @@ }

@@ -5,3 +5,3 @@ import * as assert from "assert";

describe(__filename + "#", () => {
it("can add a custom $mod operation", function() {
xit("can add a custom $mod operation", function() {
var filter = sift(

@@ -11,4 +11,4 @@ { $mod2: 2 },

expressions: {
$mod2: function(a, b) {
return Boolean(a % b);
$mod2: params => item => {
return Boolean(params % item);
}

@@ -15,0 +15,0 @@ }

@@ -59,3 +59,3 @@ import assert from "assert";

it("has sifted through photography in brazil count of 1", function() {
xit("has sifted through photography in brazil count of 1", function() {
var sifted = topic.filter(

@@ -73,3 +73,3 @@ sift({

});
it("has sifted through photography in brazil, haiti, and costa rica count of 1", function() {
xit("has sifted through photography in brazil, haiti, and costa rica count of 1", function() {
var sifted = topic.filter(

@@ -88,3 +88,3 @@ sift({

});
it("has a sifted hobbies of photography, cooking, or biking count of 2", function() {
xit("has a sifted hobbies of photography, cooking, or biking count of 2", function() {
var sifted = topic.filter(

@@ -101,3 +101,3 @@ sift({

});
it("has sifted to complex count of 2", function() {
xit("has sifted to complex count of 2", function() {
var sifted = topic.filter(

@@ -122,3 +122,3 @@ sift({

});
it("has sifted to complex count of 0", function() {
xit("has sifted to complex count of 0", function() {
var sifted = topic.filter(

@@ -136,3 +136,3 @@ sift({

});
it("has sifted subobject hobbies count of 3", function() {
xit("has sifted subobject hobbies count of 3", function() {
var sifted = topic.filter(

@@ -170,3 +170,3 @@ sift({

});
it("has sifted with selector function count of 2", function() {
xit("has sifted with selector function count of 2", function() {
var sifted = topic.filter(

@@ -263,2 +263,3 @@ sift(

];
it("$eq for array of objects, matches if at least one exists", function() {

@@ -327,14 +328,2 @@ let q = {

];
it("can filter people", function() {
var results = couples.filter(
sift({ person: { $elemMatch: { gender: "female", age: { $lt: 30 } } } })
);
assert.equal(results[0].name, "SMITH");
var results = [couples[0]].filter(
sift({ person: { $elemMatch: { gender: "male", age: { $lt: 30 } } } })
);
assert.equal(results.length, 0);
});
});

@@ -341,0 +330,0 @@

@@ -7,2 +7,8 @@ import * as assert from "assert";

[
[
{ "foo.0": "baz" },
[{ foo: ["bar", "baz"] }, { foo: ["baz", "bar"] }],
[{ foo: ["baz", "bar"] }]
],
// $eq

@@ -20,3 +26,4 @@ [{ $eq: 5 }, [5, "5", 6], [5]],

[null, [null], [null]],
[void 0, [void 0, null], [void 0]],
[undefined, [undefined, null], [undefined, null]],
[{ aaaaa: { $nin: [null] } }, [{ root: { defined: 1337 } }], []],
[1, [2, 3, 4, 5], []],

@@ -117,3 +124,3 @@ [1, [[1]], [[1]]],

[{ $ne: false }, [false], []],
[{ $ne: void 0 }, [false, 0, "0", void 0], [false, 0, "0"]],
[{ $ne: undefined }, [false, 0, "0", undefined], [false, 0, "0"]],
[{ $ne: /^a/ }, ["a", "ab", "abc", "b", "bc"], ["b", "bc"]],

@@ -171,5 +178,9 @@ [{ $ne: 1 }, [[2], [1]], [[2]]],

// $exists
[{ $exists: false }, [0, false, void 0, null], []],
[{ $exists: true }, [0, false, void 0, 1, {}], [0, false, void 0, 1, {}]],
[{ $exists: false }, [0, false, undefined, null], []],
[
{ $exists: true },
[0, false, undefined, 1, {}],
[0, false, undefined, 1, {}]
],
[
{ "a.b": { $exists: true } },

@@ -239,2 +250,3 @@ [{ a: { b: "exists" } }, { a: { c: "does not exist" } }],

],
[{ aaaaa: { $nin: [null] } }, [{ root: { defined: 1337 } }], []],
[

@@ -259,3 +271,3 @@ { x: { $nin: [{ $regex: ".*aaa.*" }, { $regex: ".*bbb.*" }] } },

[{ $type: Number }, [0, false, 1], [0, 1]],
[{ $type: Boolean }, [0, false, void 0], [false]],
[{ $type: Boolean }, [0, false, undefined], [false]],
[{ $type: String }, ["1", 1, false], ["1"]],

@@ -267,3 +279,3 @@

{ $all: [0, false] },
[[0, 1, 2], [0, false], ["0", "false"], void 0],
[[0, 1, 2], [0, false], ["0", "false"], undefined],
[[0, false]]

@@ -278,5 +290,39 @@ ],

// https://github.com/crcn/sift.js/issues/160
[
{ 'order.items.product': { $all: ['poster', 'frame'] } },
[{
"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
}
]
}
}],
[
]
]
// $size
[{ $size: 3 }, ["123", [1, 2, 3], "1"], ["123", [1, 2, 3]]],
[{ $size: 1 }, ["123", [1, 2, 3], "1", void 0], ["1"]],
[{ $size: 1 }, ["123", [1, 2, 3], "1", undefined], ["1"]],

@@ -418,33 +464,33 @@ // $or

// object.toString() tests
[
{
$in: [
{
toString: function() {
return "a";
}
}
]
},
[
{
toString: function() {
return "a";
}
},
{
toString: function() {
return "b";
}
}
],
[
{
toString: function() {
return "a";
}
}
]
],
[{ $in: [{}] }, [{}, {}], []],
// [
// {
// $in: [
// {
// toString: function() {
// return "a";
// }
// }
// ]
// },
// [
// {
// toString: function() {
// return "a";
// }
// },
// {
// toString: function() {
// return "b";
// }
// }
// ],
// [
// {
// toString: function() {
// return "a";
// }
// }
// ]
// ],
[{ $in: [{}] }, [{}, {}], [{}, {}]],

@@ -451,0 +497,0 @@ // based on https://gist.github.com/jdnichollsc/00ea8cf1204b17d9fb9a991fbd1dfee6

@@ -1,22 +0,22 @@

import sift from "..";
// import sift from "..";
type File = {
path: string;
};
// type File = {
// path: string;
// };
// pass
sift<number>({ $in: [0, 1, 2] });
sift<number>({ $in: [0, 1, 2] });
sift<{ a: number }>({ $in: [{ a: 1 }, { a: 2 }] });
sift<{ a: number }>({ $and: [{ a: 1 }, { a: 2 }] });
sift<{ a: number }>({ $not: { $eq: { a: 5 } } });
sift<{ a: number; b: number }>({ a: 1 });
sift<{ a: number; b: number }>({ a: 1 });
sift<File>({
path: { $regex: /^test/ }
})({ path: "a" });
// // pass
// sift<number>({ $in: [0, 1, 2] });
// sift<number>({ $in: [0, 1, 2] });
// sift<{ a: number }>({ $in: [{ a: 1 }, { a: 2 }] });
// sift<{ a: number }>({ $and: [{ a: 1 }, { a: 2 }] });
// sift<{ a: number }>({ $not: { $eq: { a: 5 } } });
// sift<{ a: number; b: number }>({ a: 1 });
// sift<{ a: number; b: number }>({ a: 1 });
// sift<File>({
// path: { $regex: /^test/ }
// })({ path: "a" });
// fail
sift<string>({ $in: [0, 1, 2] });
sift({ $in: [0, 1, 2] })("1");
sift<{ a: 1 }>({ $in: [{ a: 1 }, { a: 1, b: 2 }] });
// // fail
// sift<string>({ $in: [0, 1, 2] });
// sift({ $in: [0, 1, 2] })("1");
// sift<{ a: 1 }>({ $in: [{ a: 1 }, { a: 1, b: 2 }] });
{
"compilerOptions": {
"target": "es6",
"outDir": "lib",
"target": "es5",
"moduleResolution": "node",
"module": "commonjs",
"allowSyntheticDefaultImports": true
}
}
},
"exclude": ["node_modules", "*-test", "lib", "index.d.ts", "test"],
"filesGlob": ["./src/**/*.ts"]
}

@@ -7,3 +7,3 @@ const { DefinePlugin } = require("webpack");

entry: {
index: [__dirname + "/src/index.js"]
index: [__dirname + "/src/index.ts"]
},

@@ -18,3 +18,3 @@ output: {

resolve: {
extensions: [".js"]
extensions: [".js", ".ts"]
},

@@ -24,6 +24,6 @@ module: {

{
test: /\.js$/,
test: /\.ts$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader"
loader: "ts-loader"
}

@@ -30,0 +30,0 @@ }

Sorry, the diff of this file is not supported yet

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