ngrx-forms
Version:
Proper integration of forms in Angular 4 applications using ngrx
92 lines • 12.1 kB
JavaScript
export function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
const defaultOptions = {
treatUndefinedAndMissingKeyAsSame: false,
};
export function deepEquals(_1, _2, options = {}) {
const { treatUndefinedAndMissingKeyAsSame } = Object.assign({}, defaultOptions, options);
const leftChain = [];
const rightChain = [];
function compare2Objects(x, y) {
let p;
// remember that NaN === NaN returns false
// and isNaN(undefined) returns true
if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') {
return true;
}
// Compare primitives and functions.
// Check if both arguments link to the same object.
// Especially useful on the step where we compare prototypes
if (x === y) {
return true;
}
// Works in case when functions are created in constructor.
// Comparing dates is a common scenario. Another built-ins?
// We can even handle functions passed across iframes
if ((typeof x === 'function' && typeof y === 'function') ||
(x instanceof Date && y instanceof Date) ||
(x instanceof RegExp && y instanceof RegExp) ||
(x instanceof String && y instanceof String) ||
(x instanceof Number && y instanceof Number)) {
return x.toString() === y.toString();
}
// At last checking prototypes as good as we can
if (!(x instanceof Object && y instanceof Object)) {
return false;
}
if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) {
return false;
}
if (x.constructor !== y.constructor) {
return false;
}
// Check for infinitive linking loops
if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) {
return false;
}
// Quick checking of one object being a subset of another.
for (p in y) {
if (treatUndefinedAndMissingKeyAsSame && y.hasOwnProperty(p) && !x.hasOwnProperty(p) && y[p] === undefined) {
continue;
}
if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
return false;
}
else if (typeof y[p] !== typeof x[p]) {
return false;
}
}
// tslint:disable:forin
for (p in x) {
if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {
if (!treatUndefinedAndMissingKeyAsSame || !x.hasOwnProperty(p) || y.hasOwnProperty(p) || x[p] !== undefined) {
return false;
}
}
switch (typeof (x[p])) {
case 'object':
case 'function':
leftChain.push(x);
rightChain.push(y);
if (!compare2Objects(x[p], y[p])) {
return false;
}
leftChain.pop();
rightChain.pop();
break;
default:
if (x[p] !== y[p]) {
return false;
}
break;
}
}
return true;
}
if (arguments.length <= 1) {
throw new Error('Need two or more arguments to compare');
}
return compare2Objects(_1, _2);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxPQUFPLENBQUMsR0FBVztJQUNqQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBTUQsTUFBTSxjQUFjLEdBQWdDO0lBQ2xELGlDQUFpQyxFQUFFLEtBQUs7Q0FDekMsQ0FBQztBQUVGLE1BQU0sVUFBVSxVQUFVLENBQUksRUFBSyxFQUFFLEVBQUssRUFBRSxVQUE2QixFQUFFO0lBQ3pFLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV6RixNQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7SUFDNUIsTUFBTSxVQUFVLEdBQVUsRUFBRSxDQUFDO0lBRTdCLFNBQVMsZUFBZSxDQUFDLENBQU0sRUFBRSxDQUFNO1FBQ3JDLElBQUksQ0FBQyxDQUFDO1FBRU4sMENBQTBDO1FBQzFDLG9DQUFvQztRQUNwQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUMxRSxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsb0NBQW9DO1FBQ3BDLG1EQUFtRDtRQUNuRCw0REFBNEQ7UUFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELDJEQUEyRDtRQUMzRCwyREFBMkQ7UUFDM0QscURBQXFEO1FBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVSxDQUFDO1lBQ3RELENBQUMs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Q0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDakIsT0FBTyxLQUFLLENBQUM7cUJBQ2Q7b0JBQ0QsTUFBTTthQUNUO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztLQUMxRDtJQUVELE9BQU8sZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqOiBvYmplY3QpIHtcclxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGVlcEVxdWFsc09wdGlvbnMge1xyXG4gIHRyZWF0VW5kZWZpbmVkQW5kTWlzc2luZ0tleUFzU2FtZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBSZXF1aXJlZDxEZWVwRXF1YWxzT3B0aW9ucz4gPSB7XHJcbiAgdHJlYXRVbmRlZmluZWRBbmRNaXNzaW5nS2V5QXNTYW1lOiBmYWxzZSxcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWxzPFQ+KF8xOiBULCBfMjogVCwgb3B0aW9uczogRGVlcEVxdWFsc09wdGlvbnMgPSB7fSkge1xyXG4gIGNvbnN0IHsgdHJlYXRVbmRlZmluZWRBbmRNaXNzaW5nS2V5QXNTYW1lIH0gPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0T3B0aW9ucywgb3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IGxlZnRDaGFpbjogYW55W10gPSBbXTtcclxuICBjb25zdCByaWdodENoYWluOiBhbnlbXSA9IFtdO1xyXG5cclxuICBmdW5jdGlvbiBjb21wYXJlMk9iamVjdHMoeDogYW55LCB5OiBhbnkpIHtcclxuICAgIGxldCBwO1xyXG5cclxuICAgIC8vIHJlbWVtYmVyIHRoYXQgTmFOID09PSBOYU4gcmV0dXJucyBmYWxzZVxyXG4gICAgLy8gYW5kIGlzTmFOKHVuZGVmaW5lZCkgcmV0dXJucyB0cnVlXHJcbiAgICBpZiAoaXNOYU4oeCkgJiYgaXNOYU4oeSkgJiYgdHlwZW9mIHggPT09ICdudW1iZXInICYmIHR5cGVvZiB5ID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDb21wYXJlIHByaW1pdGl2ZXMgYW5kIGZ1bmN0aW9ucy5cclxuICAgIC8vIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGxpbmsgdG8gdGhlIHNhbWUgb2JqZWN0LlxyXG4gICAgLy8gRXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIHN0ZXAgd2hlcmUgd2UgY29tcGFyZSBwcm90b3R5cGVzXHJcbiAgICBpZiAoeCA9PT0geSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXb3JrcyBpbiBjYXNlIHdoZW4gZnVuY3Rpb25zIGFyZSBjcmVhdGVkIGluIGNvbnN0cnVjdG9yLlxyXG4gICAgLy8gQ29tcGFyaW5nIGRhdGVzIGlzIGEgY29tbW9uIHNjZW5hcmlvLiBBbm90aGVyIGJ1aWx0LWlucz9cclxuICAgIC8vIFdlIGNhbiBldmVuIGhhbmRsZSBmdW5jdGlvbnMgcGFzc2VkIGFjcm9zcyBpZnJhbWVzXHJcbiAgICBpZiAoKHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB5ID09PSAnZnVuY3Rpb24nKSB8fFxyXG4gICAgICAoeCBpbnN0YW5jZW9mIERhdGUgJiYgeSBpbnN0YW5jZW9mIERhdGUpIHx8XHJcbiAgICAgICh4IGluc3RhbmNlb2YgUmVnRXhwICYmIHkgaW5zdGFuY2VvZiBSZWdFeHApIHx8XHJcbiAgICAgICh4IGluc3RhbmNlb2YgU3RyaW5nICYmIHkgaW5zdGFuY2VvZiBTdHJpbmcpIHx8XHJcbiAgICAgICh4IGluc3RhbmNlb2YgTnVtYmVyICYmIHkgaW5zdGFuY2VvZiBOdW1iZXIpKSB7XHJcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKCkgPT09IHkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBdCBsYXN0IGNoZWNraW5nIHByb3RvdHlwZXMgYXMgZ29vZCBhcyB3ZSBjYW5cclxuICAgIGlmICghKHggaW5zdGFuY2VvZiBPYmplY3QgJiYgeSBpbnN0YW5jZW9mIE9iamVjdCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh4LmlzUHJvdG90eXBlT2YoeSkgfHwgeS5pc1Byb3RvdHlwZU9mKHgpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoeC5jb25zdHJ1Y3RvciAhPT0geS5jb25zdHJ1Y3Rvcikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIGluZmluaXRpdmUgbGlua2luZyBsb29wc1xyXG4gICAgaWYgKGxlZnRDaGFpbi5pbmRleE9mKHgpID4gLTEgfHwgcmlnaHRDaGFpbi5pbmRleE9mKHkpID4gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFF1aWNrIGNoZWNraW5nIG9mIG9uZSBvYmplY3QgYmVpbmcgYSBzdWJzZXQgb2YgYW5vdGhlci5cclxuICAgIGZvciAocCBpbiB5KSB7XHJcbiAgICAgIGlmICh0cmVhdFVuZGVmaW5lZEFuZE1pc3NpbmdLZXlBc1NhbWUgJiYgeS5oYXNPd25Qcm9wZXJ0eShwKSAmJiAheC5oYXNPd25Qcm9wZXJ0eShwKSAmJiB5W3BdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHkuaGFzT3duUHJvcGVydHkocCkgIT09IHguaGFzT3duUHJvcGVydHkocCkpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHlbcF0gIT09IHR5cGVvZiB4W3BdKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGU6Zm9yaW5cclxuICAgIGZvciAocCBpbiB4KSB7XHJcbiAgICAgIGlmICh5Lmhhc093blByb3BlcnR5KHApICE9PSB4Lmhhc093blByb3BlcnR5KHApKSB7XHJcbiAgICAgICAgaWYgKCF0cmVhdFVuZGVmaW5lZEFuZE1pc3NpbmdLZXlBc1NhbWUgfHwgIXguaGFzT3duUHJvcGVydHkocCkgfHwgeS5oYXNPd25Qcm9wZXJ0eShwKSB8fCB4W3BdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN3aXRjaCAodHlwZW9mICh4W3BdKSkge1xyXG4gICAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxyXG5cclxuICAgICAgICAgIGxlZnRDaGFpbi5wdXNoKHgpO1xyXG4gICAgICAgICAgcmlnaHRDaGFpbi5wdXNoKHkpO1xyXG5cclxuICAgICAgICAgIGlmICghY29tcGFyZTJPYmplY3RzKHhbcF0sIHlbcF0pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZWZ0Q2hhaW4ucG9wKCk7XHJcbiAgICAgICAgICByaWdodENoYWluLnBvcCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBpZiAoeFtwXSAhPT0geVtwXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPD0gMSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIHR3byBvciBtb3JlIGFyZ3VtZW50cyB0byBjb21wYXJlJyk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gY29tcGFyZTJPYmplY3RzKF8xLCBfMik7XHJcbn1cclxuIl19