react-native-integrate
Version:
Automate integration of additional code into React Native projects
200 lines (199 loc) • 6.39 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.satisfies = satisfies;
exports.deepEquals = deepEquals;
function satisfies(left, right) {
if (Array.isArray(right))
return anySatisfiesArray(left, right);
else if (typeof right == 'object' && right != null)
return anySatisfiesObject(left, right);
return anySatisfiesPrimitive(left, right);
}
function anySatisfiesArray(left, right) {
if (Array.isArray(left))
return arraySatisfiesArray(left, right);
//else if (typeof left == 'object') {
// this would never match
// return objectSatisfiesArray(left, right);
//}
// this would never match
// return primitiveSatisfiesArray(left, right);
return false;
}
// searches in array
function arraySatisfiesPrimitive(left, right) {
return left.some((leftChild) => deepEquals(leftChild, right));
}
function arraySatisfiesArray(left, right) {
return deepEquals(left, right);
}
function arraySatisfiesObject(left, right) {
let hasOperand = false;
const result = Object.entries(right).every(([key, value]) => {
if (key in arrayOperands) {
hasOperand = true;
return arrayOperands[key](left, value);
}
return false;
});
if (hasOperand)
return result;
return left.some((leftChild) => deepEquals(leftChild, right));
}
function anySatisfiesObject(left, right) {
if (Array.isArray(left))
return arraySatisfiesObject(left, right);
else if (typeof left == 'object' && left != null)
return objectSatisfiesObject(left, right);
return primitiveSatisfiesObject(left, right);
}
function objectSatisfiesObject(left, right) {
return Object.entries(right).every(([key, value]) => {
if (key in nonArrayOperands)
return nonArrayOperands[key](left, value, right);
return satisfies(left[key], value);
});
}
function anySatisfiesPrimitive(left, right) {
if (Array.isArray(left))
return arraySatisfiesPrimitive(left, right);
else if (typeof left == 'object' && left != null) {
// this would never match
// return objectSatisfiesPrimitive(left, right);
return false;
}
return primitiveSatisfiesPrimitive(left, right);
}
function primitiveSatisfiesPrimitive(left, right) {
return equals(left, right);
}
function primitiveSatisfiesObject(left, right) {
return Object.entries(right).every(([key, value]) => {
if (key in nonArrayOperands)
return nonArrayOperands[key](left, value, right);
return false;
});
}
function equals(left, right) {
return left == right;
}
function deepEquals(left, right) {
if (equals(left, right))
return true;
if (typeof left != 'object' ||
typeof right != 'object' ||
left == null ||
right == null)
return false;
const isLeftArray = Array.isArray(left), isRightArray = Array.isArray(right);
if (isLeftArray && isRightArray) {
if (left.length != right.length)
return false;
for (let i = 0; i < left.length; i++) {
if (!deepEquals(left[i], right[i]))
return false;
}
return true;
}
if (isLeftArray || isRightArray)
return false;
const keysA = Object.keys(left), keysB = Object.keys(right);
if (keysA.length != keysB.length)
return false;
for (const key of keysA) {
if (!keysB.includes(key))
return false;
if (!deepEquals(left[key], right[key]))
return false;
}
return true;
}
const commonOperands = {
$and(left, right) {
if (Array.isArray(right))
return right.every((rightChild) => satisfies(left, rightChild));
return satisfies(left, right);
},
$or(left, right) {
if (Array.isArray(right))
return right.some((rightChild) => satisfies(left, rightChild));
if (right == undefined)
return false;
return Object.entries(right).some(([rightKey, rightChild]) => satisfies(left, { [rightKey]: rightChild }));
},
$eq(left, right) {
return deepEquals(left, right);
},
$ne(left, right) {
return !deepEquals(left, right);
},
$not(left, right) {
return !satisfies(left, right);
},
};
const arrayOperands = {
...commonOperands,
$elemMatch(left, right) {
return left.some((leftChild) => satisfies(leftChild, right));
},
$all(left, right) {
if (Array.isArray(right))
return right.every((rightChild) => left.some((leftChild) => satisfies(leftChild, rightChild)));
return left.every((leftChild) => satisfies(leftChild, right));
},
$any(left, right) {
if (Array.isArray(right))
return right.some((rightChild) => left.some((leftChild) => satisfies(leftChild, rightChild)));
return left.some((leftChild) => satisfies(leftChild, right));
},
$size(left, right) {
return satisfies(left.length, right);
},
};
const nonArrayOperands = {
...commonOperands,
$gt(left, right) {
if (left == undefined || right == undefined)
return false;
return left > right;
},
$gte(left, right) {
if (left == undefined || right == undefined)
return false;
return left >= right;
},
$lt(left, right) {
if (left == undefined || right == undefined)
return false;
return left < right;
},
$lte(left, right) {
if (left == undefined || right == undefined)
return false;
return left <= right;
},
$in(left, right) {
if (Array.isArray(right))
return right.includes(left);
return false;
},
$nin(left, right) {
if (Array.isArray(right))
return !right.includes(left);
return true;
},
$exists(left, right) {
return right ? left != undefined : left == undefined;
},
$regex(left, right, operandParent) {
if (typeof right != 'string' || typeof left != 'string')
return false;
let options = operandParent.$options;
if (typeof options != 'string')
options = undefined;
return new RegExp(right, options).test(left);
},
$options() {
return true;
},
};