fast-equals 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +30 -14
- package/dist/fast-equals.cjs.js +21 -6
- package/dist/fast-equals.cjs.js.map +1 -1
- package/dist/fast-equals.esm.js +21 -6
- package/dist/fast-equals.esm.js.map +1 -1
- package/dist/fast-equals.js +24 -9
- package/dist/fast-equals.js.map +1 -1
- package/dist/fast-equals.min.js +1 -1
- package/dist/fast-equals.mjs +21 -6
- package/dist/fast-equals.mjs.map +1 -1
- package/package.json +31 -29
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# fast-equals CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 2.0.4
|
|
4
|
+
|
|
5
|
+
- Fix [#58](https://github.com/planttheidea/fast-equals/issues/58) - duplicate entries in `Map` / `Set` can create false equality success
|
|
6
|
+
- [#60](https://github.com/planttheidea/fast-equals/issues/60) - Add documentation for key equality of `Map` being a part of `deepEqual`
|
|
7
|
+
|
|
3
8
|
## 2.0.3
|
|
4
9
|
|
|
5
10
|
- Fix [#50](https://github.com/planttheidea/fast-equals/pull/50) - copy-pasta in cacheable check
|
package/README.md
CHANGED
|
@@ -22,14 +22,15 @@ Starting with version `1.5.0`, circular objects are supported for both deep and
|
|
|
22
22
|
- [fast-equals](#fast-equals)
|
|
23
23
|
- [Table of contents](#table-of-contents)
|
|
24
24
|
- [Usage](#usage)
|
|
25
|
-
|
|
25
|
+
- [Specific builds](#specific-builds)
|
|
26
26
|
- [Available methods](#available-methods)
|
|
27
|
-
|
|
28
|
-
- [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
- [deepEqual](#deepequal)
|
|
28
|
+
- [Comparing `Map`s](#comparing-maps)
|
|
29
|
+
- [shallowEqual](#shallowequal)
|
|
30
|
+
- [sameValueZeroEqual](#samevaluezeroequal)
|
|
31
|
+
- [circularDeepEqual](#circulardeepequal)
|
|
32
|
+
- [circularShallowEqual](#circularshallowequal)
|
|
33
|
+
- [createCustomEqual](#createcustomequal)
|
|
33
34
|
- [Benchmarks](#benchmarks)
|
|
34
35
|
- [Development](#development)
|
|
35
36
|
|
|
@@ -51,7 +52,7 @@ import * as fe from 'fast-equals';
|
|
|
51
52
|
console.log(fe.deep({ foo: 'bar' }, { foo: 'bar' })); // true
|
|
52
53
|
```
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
### Specific builds
|
|
55
56
|
|
|
56
57
|
There are three builds, an ESM build for modern build systems / runtimes, a CommonJS build for traditional NodeJS environments, and a UMD build for legacy implementations. The ideal one will likely be chosen for you automatically, however if you want to use a specific build you can always import it directly:
|
|
57
58
|
|
|
@@ -66,7 +67,7 @@ There is also a pre-minified version of the UMD build available:
|
|
|
66
67
|
|
|
67
68
|
## Available methods
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
### deepEqual
|
|
70
71
|
|
|
71
72
|
Performs a deep equality comparison on the two objects passed and returns a boolean representing the value equivalency of the objects.
|
|
72
73
|
|
|
@@ -80,7 +81,20 @@ console.log(objectA === objectB); // false
|
|
|
80
81
|
console.log(deepEqual(objectA, objectB)); // true
|
|
81
82
|
```
|
|
82
83
|
|
|
83
|
-
####
|
|
84
|
+
#### Comparing `Map`s
|
|
85
|
+
|
|
86
|
+
`Map` objects support complex keys (objects, Arrays, etc.), however [the spec for key lookups in `Map` are based on `SameZeroValue`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#key_equality). If the spec were followed for comparison, the following would always be `false`:
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
const mapA = new Map([[{ foo: 'bar' }, { baz: 'quz' }]]);
|
|
90
|
+
const mapB = new Map([[{ foo: 'bar' }, { baz: 'quz' }]]);
|
|
91
|
+
|
|
92
|
+
deepEqual(mapA, mapB);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
To support true deep equality of all contents, `fast-equals` will perform a deep equality comparison for key and value parirs. Therefore, the above would be `true`.
|
|
96
|
+
|
|
97
|
+
### shallowEqual
|
|
84
98
|
|
|
85
99
|
Performs a shallow equality comparison on the two objects passed and returns a boolean representing the value equivalency of the objects.
|
|
86
100
|
|
|
@@ -98,7 +112,7 @@ console.log(shallowEqual(objectA, objectB)); // true
|
|
|
98
112
|
console.log(shallowEqual(objectA, objectC)); // false
|
|
99
113
|
```
|
|
100
114
|
|
|
101
|
-
|
|
115
|
+
### sameValueZeroEqual
|
|
102
116
|
|
|
103
117
|
Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) comparison on the two objects passed and returns a boolean representing the value equivalency of the objects. In simple terms, this means either strictly equal or both `NaN`.
|
|
104
118
|
|
|
@@ -116,7 +130,7 @@ console.log(sameValueZeroEqual(mainObject.foo, objectB)); // true
|
|
|
116
130
|
console.log(sameValueZeroEqual(mainObject, objectC)); // false
|
|
117
131
|
```
|
|
118
132
|
|
|
119
|
-
|
|
133
|
+
### circularDeepEqual
|
|
120
134
|
|
|
121
135
|
Performs the same comparison as `deepEqual` but supports circular objects. It is slower than `deepEqual`, so only use if you know circular objects are present.
|
|
122
136
|
|
|
@@ -136,7 +150,9 @@ console.log(circularDeepEqual(new Circular('foo'), new Circular('foo'))); // tru
|
|
|
136
150
|
console.log(circularDeepEqual(new Circular('foo'), new Circular('bar'))); // false
|
|
137
151
|
```
|
|
138
152
|
|
|
139
|
-
|
|
153
|
+
Just as with `deepEqual`, [both keys and values are compared for deep equality](#comparing-maps).
|
|
154
|
+
|
|
155
|
+
### circularShallowEqual
|
|
140
156
|
|
|
141
157
|
Performs the same comparison as `shallowequal` but supports circular objects. It is slower than `shallowEqual`, so only use if you know circular objects are present.
|
|
142
158
|
|
|
@@ -149,7 +165,7 @@ console.log(circularShallowEqual(array, ['foo', array])); // true
|
|
|
149
165
|
console.log(circularShallowEqual(array, [array])); // false
|
|
150
166
|
```
|
|
151
167
|
|
|
152
|
-
|
|
168
|
+
### createCustomEqual
|
|
153
169
|
|
|
154
170
|
Creates a custom equality comparator that will be used on nested values in the object. Unlike `deepEqual` and `shallowEqual`, this is a partial-application function that will receive the internal comparator and should return a function that compares two objects.
|
|
155
171
|
|
package/dist/fast-equals.cjs.js
CHANGED
|
@@ -134,14 +134,22 @@ function areArraysEqual(a, b, isEqual, meta) {
|
|
|
134
134
|
function areMapsEqual(a, b, isEqual, meta) {
|
|
135
135
|
var isValueEqual = a.size === b.size;
|
|
136
136
|
if (isValueEqual && a.size) {
|
|
137
|
+
var matchedIndices_1 = {};
|
|
137
138
|
a.forEach(function (aValue, aKey) {
|
|
138
139
|
if (isValueEqual) {
|
|
139
|
-
|
|
140
|
+
var hasMatch_1 = false;
|
|
141
|
+
var matchIndex_1 = 0;
|
|
140
142
|
b.forEach(function (bValue, bKey) {
|
|
141
|
-
if (!
|
|
142
|
-
|
|
143
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndex_1]) {
|
|
144
|
+
hasMatch_1 =
|
|
145
|
+
isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);
|
|
146
|
+
if (hasMatch_1) {
|
|
147
|
+
matchedIndices_1[matchIndex_1] = true;
|
|
148
|
+
}
|
|
143
149
|
}
|
|
150
|
+
matchIndex_1++;
|
|
144
151
|
});
|
|
152
|
+
isValueEqual = hasMatch_1;
|
|
145
153
|
}
|
|
146
154
|
});
|
|
147
155
|
}
|
|
@@ -211,14 +219,21 @@ function areRegExpsEqual(a, b) {
|
|
|
211
219
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
212
220
|
var isValueEqual = a.size === b.size;
|
|
213
221
|
if (isValueEqual && a.size) {
|
|
222
|
+
var matchedIndices_2 = {};
|
|
214
223
|
a.forEach(function (aValue) {
|
|
215
224
|
if (isValueEqual) {
|
|
216
|
-
|
|
225
|
+
var hasMatch_2 = false;
|
|
226
|
+
var matchIndex_2 = 0;
|
|
217
227
|
b.forEach(function (bValue) {
|
|
218
|
-
if (!
|
|
219
|
-
|
|
228
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_2]) {
|
|
229
|
+
hasMatch_2 = isEqual(aValue, bValue, meta);
|
|
230
|
+
if (hasMatch_2) {
|
|
231
|
+
matchedIndices_2[matchIndex_2] = true;
|
|
232
|
+
}
|
|
220
233
|
}
|
|
234
|
+
matchIndex_2++;
|
|
221
235
|
});
|
|
236
|
+
isValueEqual = hasMatch_2;
|
|
222
237
|
}
|
|
223
238
|
});
|
|
224
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-equals.cjs.js","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue, bKey) => {\n if (!isValueEqual && isEqual(aKey, bKey, meta)) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue) => {\n if (!isValueEqual) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fast-equals.cjs.js","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch =\n isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch = isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
package/dist/fast-equals.esm.js
CHANGED
|
@@ -130,14 +130,22 @@ function areArraysEqual(a, b, isEqual, meta) {
|
|
|
130
130
|
function areMapsEqual(a, b, isEqual, meta) {
|
|
131
131
|
var isValueEqual = a.size === b.size;
|
|
132
132
|
if (isValueEqual && a.size) {
|
|
133
|
+
var matchedIndices_1 = {};
|
|
133
134
|
a.forEach(function (aValue, aKey) {
|
|
134
135
|
if (isValueEqual) {
|
|
135
|
-
|
|
136
|
+
var hasMatch_1 = false;
|
|
137
|
+
var matchIndex_1 = 0;
|
|
136
138
|
b.forEach(function (bValue, bKey) {
|
|
137
|
-
if (!
|
|
138
|
-
|
|
139
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndex_1]) {
|
|
140
|
+
hasMatch_1 =
|
|
141
|
+
isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);
|
|
142
|
+
if (hasMatch_1) {
|
|
143
|
+
matchedIndices_1[matchIndex_1] = true;
|
|
144
|
+
}
|
|
139
145
|
}
|
|
146
|
+
matchIndex_1++;
|
|
140
147
|
});
|
|
148
|
+
isValueEqual = hasMatch_1;
|
|
141
149
|
}
|
|
142
150
|
});
|
|
143
151
|
}
|
|
@@ -207,14 +215,21 @@ function areRegExpsEqual(a, b) {
|
|
|
207
215
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
208
216
|
var isValueEqual = a.size === b.size;
|
|
209
217
|
if (isValueEqual && a.size) {
|
|
218
|
+
var matchedIndices_2 = {};
|
|
210
219
|
a.forEach(function (aValue) {
|
|
211
220
|
if (isValueEqual) {
|
|
212
|
-
|
|
221
|
+
var hasMatch_2 = false;
|
|
222
|
+
var matchIndex_2 = 0;
|
|
213
223
|
b.forEach(function (bValue) {
|
|
214
|
-
if (!
|
|
215
|
-
|
|
224
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_2]) {
|
|
225
|
+
hasMatch_2 = isEqual(aValue, bValue, meta);
|
|
226
|
+
if (hasMatch_2) {
|
|
227
|
+
matchedIndices_2[matchIndex_2] = true;
|
|
228
|
+
}
|
|
216
229
|
}
|
|
230
|
+
matchIndex_2++;
|
|
217
231
|
});
|
|
232
|
+
isValueEqual = hasMatch_2;
|
|
218
233
|
}
|
|
219
234
|
});
|
|
220
235
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-equals.esm.js","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue, bKey) => {\n if (!isValueEqual && isEqual(aKey, bKey, meta)) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue) => {\n if (!isValueEqual) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"AAAA,IAAM,mBAAmB,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC;AAElD,IAAA,IAAI,GAAK,MAAM,KAAX,CAAY;AASxB;;;;;;;SAOgB,kBAAkB,CAAC,CAAM,EAAE,CAAM;IAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;SAMgB,aAAa,CAAC,KAAU;IACtC,OAAO,KAAK,CAAC,WAAW,KAAK,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC;AACnE,CAAC;AAED;;;;;;SAMgB,aAAa,CAAC,KAAU;IACtC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC;AACrD,CAAC;AAED;;;;;;SAMgB,cAAc,CAAC,KAAU;IACvC,OAAO,CAAC,EAAE,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;AACrC,CAAC;AAED;;;;;;SAMgB,mBAAmB;IACjC,IAAM,MAAM,GAAU,EAAE,CAAC;IAEzB,OAAO;QACL,GAAG,EAAH,UAAI,KAAU;YACZ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACpB;QAED,GAAG,EAAH,UAAI,KAAU;YACZ,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;SACrC;KACF,CAAC;AACJ,CAAC;AAED;;;;;AAKO,IAAM,WAAW,GAAG,CAAC,UAAC,aAAsB;IACjD,IAAI,aAAa,EAAE;QACjB,OAAO,SAAS,YAAY;YAC1B,OAAO,IAAI,OAAO,EAAE,CAAC;SACtB,CAAC;KACH;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAExB;;;;;;SAMgB,0BAA0B,CAAC,OAA4B;IACrE,OAAO,SAAS,mBAAmB,CAAC,UAA8B;QAChE,IAAM,WAAW,GAAG,OAAO,IAAI,UAAU,CAAC;QAE1C,OAAO,SAAS,aAAa,CAC3B,CAAM,EACN,CAAM,EACN,KAA4B;YAA5B,sBAAA,EAAA,QAAe,WAAW,EAAE;YAE5B,IAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;YAClD,IAAM,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;YAElD,IAAI,YAAY,IAAI,YAAY,EAAE;gBAChC,IAAM,IAAI,GAAG,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC1C,IAAM,IAAI,GAAG,YAAY,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAE1C,IAAI,IAAI,IAAI,IAAI,EAAE;oBAChB,OAAO,IAAI,IAAI,IAAI,CAAC;iBACrB;gBAED,IAAI,YAAY,EAAE;oBAChB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACd;gBAED,IAAI,YAAY,EAAE;oBAChB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACd;aACF;YAED,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;;;;;;;;SASgB,cAAc,CAC5B,CAAQ,EACR,CAAQ,EACR,OAA2B,EAC3B,IAAS;IAET,IAAI,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IAErB,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE;QACtB,OAAO,KAAK,CAAC;KACd;IAED,OAAO,KAAK,EAAE,GAAG,CAAC,EAAE;QAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE;YACtC,OAAO,KAAK,CAAC;SACd;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;SASgB,YAAY,CAC1B,CAAgB,EAChB,CAAgB,EAChB,OAA2B,EAC3B,IAAS;IAET,IAAI,YAAY,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;IAErC,IAAI,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE;QAC1B,CAAC,CAAC,OAAO,CAAC,UAAC,MAAM,EAAE,IAAI;YACrB,IAAI,YAAY,EAAE;gBAChB,YAAY,GAAG,KAAK,CAAC;gBAErB,CAAC,CAAC,OAAO,CAAC,UAAC,MAAM,EAAE,IAAI;oBACrB,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;wBAC9C,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;qBAC9C;iBACF,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;KACJ;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAOD,IAAM,KAAK,GAAG,QAAQ,CAAC;AAEvB,IAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CACjD,QAAQ,CAAC,SAAS,CAAC,IAAI,EACvB,MAAM,CAAC,SAAS,CAAC,cAAc,CAChC,CAAC;AAEF;;;;;;;;;SASgB,eAAe,CAC7B,CAAkB,EAClB,CAAkB,EAClB,OAA2B,EAC3B,IAAS;IAET,IAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtB,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAEzB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,EAAE;QAC5B,OAAO,KAAK,CAAC;KACd;IAED,IAAI,KAAK,EAAE;QACT,IAAI,GAAG,SAAQ,CAAC;QAEhB,OAAO,KAAK,EAAE,GAAG,CAAC,EAAE;YAClB,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAEnB,IAAI,GAAG,KAAK,KAAK,EAAE;gBACjB,IAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAExC,IACE,CAAC,aAAa,IAAI,aAAa;oBAC/B,aAAa,KAAK,aAAa,EAC/B;oBACA,OAAO,KAAK,CAAC;iBACd;aACF;YAED,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE;gBAC7D,OAAO,KAAK,CAAC;aACd;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;SAOgB,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,QACE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QACrB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QACrB,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;QAC7B,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAC3B,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;QACvB,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QACrB,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS,EAC3B;AACJ,CAAC;AAED;;;;;;;;;SASgB,YAAY,CAC1B,CAAW,EACX,CAAW,EACX,OAA2B,EAC3B,IAAS;IAET,IAAI,YAAY,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC;IAErC,IAAI,YAAY,IAAI,CAAC,CAAC,IAAI,EAAE;QAC1B,CAAC,CAAC,OAAO,CAAC,UAAC,MAAM;YACf,IAAI,YAAY,EAAE;gBAChB,YAAY,GAAG,KAAK,CAAC;gBAErB,CAAC,CAAC,OAAO,CAAC,UAAC,MAAM;oBACf,IAAI,CAAC,YAAY,EAAE;wBACjB,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;qBAC9C;iBACF,CAAC,CAAC;aACJ;SACF,CAAC,CAAC;KACJ;IAED,OAAO,YAAY,CAAC;AACtB;;ACpSA,IAAM,eAAe,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC;AAClD,IAAM,eAAe,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC;SAIlC,gBAAgB,CAAC,aAAyC;IACxE,IAAM,OAAO;;IAEX,OAAO,aAAa,KAAK,UAAU;UAC/B,aAAa,CAAC,UAAU,CAAC;UACzB,UAAU,CAAC;;;;;;;;;;IAWjB,SAAS,UAAU,CAAC,CAAM,EAAE,CAAM,EAAE,IAAU;QAC5C,IAAI,CAAC,KAAK,CAAC,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;YAC5D,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;gBACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;aAC7C;YAED,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE9B,IAAI,MAAM,IAAI,MAAM,EAAE;gBACpB,OAAO,MAAM,KAAK,MAAM,IAAI,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;aACjE;YAED,MAAM,GAAG,CAAC,YAAY,IAAI,CAAC;YAC3B,MAAM,GAAG,CAAC,YAAY,IAAI,CAAC;YAE3B,IAAI,MAAM,IAAI,MAAM,EAAE;gBACpB,QACE,MAAM,KAAK,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EACjE;aACH;YAED,MAAM,GAAG,CAAC,YAAY,MAAM,CAAC;YAC7B,MAAM,GAAG,CAAC,YAAY,MAAM,CAAC;YAE7B,IAAI,MAAM,IAAI,MAAM,EAAE;gBACpB,OAAO,MAAM,KAAK,MAAM,IAAI,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACnD;YAED,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE;gBACxC,OAAO,CAAC,KAAK,CAAC,CAAC;aAChB;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,GAAG,CAAC,YAAY,GAAG,CAAC;gBAC1B,MAAM,GAAG,CAAC,YAAY,GAAG,CAAC;gBAE1B,IAAI,MAAM,IAAI,MAAM,EAAE;oBACpB,OAAO,MAAM,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;iBAC/D;aACF;YAED,IAAI,eAAe,EAAE;gBACnB,MAAM,GAAG,CAAC,YAAY,GAAG,CAAC;gBAC1B,MAAM,GAAG,CAAC,YAAY,GAAG,CAAC;gBAE1B,IAAI,MAAM,IAAI,MAAM,EAAE;oBACpB,OAAO,MAAM,KAAK,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;iBAC/D;aACF;YAED,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;SAC7C;QAED,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC3B;IAED,OAAO,UAAU,CAAC;AACpB;;IC1Fa,SAAS,GAAG,gBAAgB,GAAG;IAC/B,YAAY,GAAG,gBAAgB,CAAC,cAAM,OAAA,kBAAkB,GAAA,EAAE;IAE1D,iBAAiB,GAAG,gBAAgB,CAAC,0BAA0B,EAAE,EAAE;IACnE,oBAAoB,GAAG,gBAAgB,CAClD,0BAA0B,CAAC,kBAAkB,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"fast-equals.esm.js","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch =\n isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch = isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
package/dist/fast-equals.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3
3
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global[
|
|
5
|
-
}(this, (function (exports) { 'use strict';
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["fast-equals"] = {}));
|
|
5
|
+
})(this, (function (exports) { 'use strict';
|
|
6
6
|
|
|
7
7
|
var HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';
|
|
8
8
|
var keys = Object.keys;
|
|
@@ -136,14 +136,22 @@
|
|
|
136
136
|
function areMapsEqual(a, b, isEqual, meta) {
|
|
137
137
|
var isValueEqual = a.size === b.size;
|
|
138
138
|
if (isValueEqual && a.size) {
|
|
139
|
+
var matchedIndices_1 = {};
|
|
139
140
|
a.forEach(function (aValue, aKey) {
|
|
140
141
|
if (isValueEqual) {
|
|
141
|
-
|
|
142
|
+
var hasMatch_1 = false;
|
|
143
|
+
var matchIndex_1 = 0;
|
|
142
144
|
b.forEach(function (bValue, bKey) {
|
|
143
|
-
if (!
|
|
144
|
-
|
|
145
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndex_1]) {
|
|
146
|
+
hasMatch_1 =
|
|
147
|
+
isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);
|
|
148
|
+
if (hasMatch_1) {
|
|
149
|
+
matchedIndices_1[matchIndex_1] = true;
|
|
150
|
+
}
|
|
145
151
|
}
|
|
152
|
+
matchIndex_1++;
|
|
146
153
|
});
|
|
154
|
+
isValueEqual = hasMatch_1;
|
|
147
155
|
}
|
|
148
156
|
});
|
|
149
157
|
}
|
|
@@ -213,14 +221,21 @@
|
|
|
213
221
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
214
222
|
var isValueEqual = a.size === b.size;
|
|
215
223
|
if (isValueEqual && a.size) {
|
|
224
|
+
var matchedIndices_2 = {};
|
|
216
225
|
a.forEach(function (aValue) {
|
|
217
226
|
if (isValueEqual) {
|
|
218
|
-
|
|
227
|
+
var hasMatch_2 = false;
|
|
228
|
+
var matchIndex_2 = 0;
|
|
219
229
|
b.forEach(function (bValue) {
|
|
220
|
-
if (!
|
|
221
|
-
|
|
230
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_2]) {
|
|
231
|
+
hasMatch_2 = isEqual(aValue, bValue, meta);
|
|
232
|
+
if (hasMatch_2) {
|
|
233
|
+
matchedIndices_2[matchIndex_2] = true;
|
|
234
|
+
}
|
|
222
235
|
}
|
|
236
|
+
matchIndex_2++;
|
|
223
237
|
});
|
|
238
|
+
isValueEqual = hasMatch_2;
|
|
224
239
|
}
|
|
225
240
|
});
|
|
226
241
|
}
|
|
@@ -305,5 +320,5 @@
|
|
|
305
320
|
|
|
306
321
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
307
322
|
|
|
308
|
-
}))
|
|
323
|
+
}));
|
|
309
324
|
//# sourceMappingURL=fast-equals.js.map
|
package/dist/fast-equals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-equals.js","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue, bKey) => {\n if (!isValueEqual && isEqual(aKey, bKey, meta)) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue) => {\n if (!isValueEqual) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fast-equals.js","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch =\n isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch = isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
package/dist/fast-equals.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self)["fast-equals"]={})}(this,(function(n){"use strict";var e="function"==typeof WeakSet,t=Object.keys;function r(n,e){return n===e||n!=n&&e!=e}function o(n){return n.constructor===Object||null==n.constructor}function i(n){return!!n&&"function"==typeof n.then}function u(n){return!(!n||!n.$$typeof)}function f(){var n=[];return{add:function(e){n.push(e)},has:function(e){return-1!==n.indexOf(e)}}}var a=e?function(){return new WeakSet}:f;function c(n){return function(e){var t=n||e;return function(n,e,r){void 0===r&&(r=a());var o=!!n&&"object"==typeof n,i=!!e&&"object"==typeof e;if(o||i){var u=o&&r.has(n),f=i&&r.has(e);if(u||f)return u&&f;o&&r.add(n),i&&r.add(e)}return t(n,e,r)}}}var s=Function.prototype.bind.call(Function.prototype.call,Object.prototype.hasOwnProperty);function l(n,e,r,o){var i=t(n),f=i.length;if(t(e).length!==f)return!1;if(f)for(var a=void 0;f-- >0;){if("_owner"===(a=i[f])){var c=u(n),l=u(e);if((c||l)&&c!==l)return!1}if(!s(e,a)||!r(n[a],e[a],o))return!1}return!0}var p="function"==typeof Map,d="function"==typeof Set;function y(n){var e="function"==typeof n?n(t):t;function t(n,t,u){if(n===t)return!0;if(n&&t&&"object"==typeof n&&"object"==typeof t){if(o(n)&&o(t))return l(n,t,e,u);var f=Array.isArray(n),a=Array.isArray(t);return f||a?f===a&&function(n,e,t,r){var o=n.length;if(e.length!==o)return!1;for(;o-- >0;)if(!t(n[o],e[o],r))return!1;return!0}(n,t,e,u):(f=n instanceof Date,a=t instanceof Date,f||a?f===a&&r(n.getTime(),t.getTime()):(f=n instanceof RegExp,a=t instanceof RegExp,f||a?f===a&&function(n,e){return n.source===e.source&&n.global===e.global&&n.ignoreCase===e.ignoreCase&&n.multiline===e.multiline&&n.unicode===e.unicode&&n.sticky===e.sticky&&n.lastIndex===e.lastIndex}(n,t):i(n)||i(t)?n===t:p&&(f=n instanceof Map,a=t instanceof Map,f||a)?f===a&&function(n,e,t,r){var o=n.size===e.size;
|
|
1
|
+
!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((n="undefined"!=typeof globalThis?globalThis:n||self)["fast-equals"]={})}(this,(function(n){"use strict";var e="function"==typeof WeakSet,t=Object.keys;function r(n,e){return n===e||n!=n&&e!=e}function o(n){return n.constructor===Object||null==n.constructor}function i(n){return!!n&&"function"==typeof n.then}function u(n){return!(!n||!n.$$typeof)}function f(){var n=[];return{add:function(e){n.push(e)},has:function(e){return-1!==n.indexOf(e)}}}var a=e?function(){return new WeakSet}:f;function c(n){return function(e){var t=n||e;return function(n,e,r){void 0===r&&(r=a());var o=!!n&&"object"==typeof n,i=!!e&&"object"==typeof e;if(o||i){var u=o&&r.has(n),f=i&&r.has(e);if(u||f)return u&&f;o&&r.add(n),i&&r.add(e)}return t(n,e,r)}}}var s=Function.prototype.bind.call(Function.prototype.call,Object.prototype.hasOwnProperty);function l(n,e,r,o){var i=t(n),f=i.length;if(t(e).length!==f)return!1;if(f)for(var a=void 0;f-- >0;){if("_owner"===(a=i[f])){var c=u(n),l=u(e);if((c||l)&&c!==l)return!1}if(!s(e,a)||!r(n[a],e[a],o))return!1}return!0}var p="function"==typeof Map,d="function"==typeof Set;function y(n){var e="function"==typeof n?n(t):t;function t(n,t,u){if(n===t)return!0;if(n&&t&&"object"==typeof n&&"object"==typeof t){if(o(n)&&o(t))return l(n,t,e,u);var f=Array.isArray(n),a=Array.isArray(t);return f||a?f===a&&function(n,e,t,r){var o=n.length;if(e.length!==o)return!1;for(;o-- >0;)if(!t(n[o],e[o],r))return!1;return!0}(n,t,e,u):(f=n instanceof Date,a=t instanceof Date,f||a?f===a&&r(n.getTime(),t.getTime()):(f=n instanceof RegExp,a=t instanceof RegExp,f||a?f===a&&function(n,e){return n.source===e.source&&n.global===e.global&&n.ignoreCase===e.ignoreCase&&n.multiline===e.multiline&&n.unicode===e.unicode&&n.sticky===e.sticky&&n.lastIndex===e.lastIndex}(n,t):i(n)||i(t)?n===t:p&&(f=n instanceof Map,a=t instanceof Map,f||a)?f===a&&function(n,e,t,r){var o=n.size===e.size;if(o&&n.size){var i={};n.forEach((function(n,u){if(o){var f=!1,a=0;e.forEach((function(e,o){f||i[a]||(f=t(u,o,r)&&t(n,e,r))&&(i[a]=!0),a++})),o=f}}))}return o}(n,t,e,u):d&&(f=n instanceof Set,a=t instanceof Set,f||a)?f===a&&function(n,e,t,r){var o=n.size===e.size;if(o&&n.size){var i={};n.forEach((function(n){if(o){var u=!1,f=0;e.forEach((function(e){u||i[f]||(u=t(n,e,r))&&(i[f]=!0),f++})),o=u}}))}return o}(n,t,e,u):l(n,t,e,u)))}return n!=n&&t!=t}return t}var v=y(),h=y((function(){return r})),b=y(c()),g=y(c(r));n.circularDeepEqual=b,n.circularShallowEqual=g,n.createCustomEqual=y,n.deepEqual=v,n.sameValueZeroEqual=r,n.shallowEqual=h,Object.defineProperty(n,"__esModule",{value:!0})}));
|
package/dist/fast-equals.mjs
CHANGED
|
@@ -130,14 +130,22 @@ function areArraysEqual(a, b, isEqual, meta) {
|
|
|
130
130
|
function areMapsEqual(a, b, isEqual, meta) {
|
|
131
131
|
var isValueEqual = a.size === b.size;
|
|
132
132
|
if (isValueEqual && a.size) {
|
|
133
|
+
var matchedIndices_1 = {};
|
|
133
134
|
a.forEach(function (aValue, aKey) {
|
|
134
135
|
if (isValueEqual) {
|
|
135
|
-
|
|
136
|
+
var hasMatch_1 = false;
|
|
137
|
+
var matchIndex_1 = 0;
|
|
136
138
|
b.forEach(function (bValue, bKey) {
|
|
137
|
-
if (!
|
|
138
|
-
|
|
139
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndex_1]) {
|
|
140
|
+
hasMatch_1 =
|
|
141
|
+
isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);
|
|
142
|
+
if (hasMatch_1) {
|
|
143
|
+
matchedIndices_1[matchIndex_1] = true;
|
|
144
|
+
}
|
|
139
145
|
}
|
|
146
|
+
matchIndex_1++;
|
|
140
147
|
});
|
|
148
|
+
isValueEqual = hasMatch_1;
|
|
141
149
|
}
|
|
142
150
|
});
|
|
143
151
|
}
|
|
@@ -207,14 +215,21 @@ function areRegExpsEqual(a, b) {
|
|
|
207
215
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
208
216
|
var isValueEqual = a.size === b.size;
|
|
209
217
|
if (isValueEqual && a.size) {
|
|
218
|
+
var matchedIndices_2 = {};
|
|
210
219
|
a.forEach(function (aValue) {
|
|
211
220
|
if (isValueEqual) {
|
|
212
|
-
|
|
221
|
+
var hasMatch_2 = false;
|
|
222
|
+
var matchIndex_2 = 0;
|
|
213
223
|
b.forEach(function (bValue) {
|
|
214
|
-
if (!
|
|
215
|
-
|
|
224
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_2]) {
|
|
225
|
+
hasMatch_2 = isEqual(aValue, bValue, meta);
|
|
226
|
+
if (hasMatch_2) {
|
|
227
|
+
matchedIndices_2[matchIndex_2] = true;
|
|
228
|
+
}
|
|
216
229
|
}
|
|
230
|
+
matchIndex_2++;
|
|
217
231
|
});
|
|
232
|
+
isValueEqual = hasMatch_2;
|
|
218
233
|
}
|
|
219
234
|
});
|
|
220
235
|
}
|
package/dist/fast-equals.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fast-equals.mjs","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue, bKey) => {\n if (!isValueEqual && isEqual(aKey, bKey, meta)) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n a.forEach((aValue) => {\n if (isValueEqual) {\n isValueEqual = false;\n\n b.forEach((bValue) => {\n if (!isValueEqual) {\n isValueEqual = isEqual(aValue, bValue, meta);\n }\n });\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fast-equals.mjs","sources":["../src/utils.ts","../src/comparator.ts","../src/index.ts"],"sourcesContent":["const HAS_WEAKSET_SUPPORT = typeof WeakSet === 'function';\n\nconst { keys } = Object;\n\ntype Cache = {\n add: (value: any) => void;\n has: (value: any) => boolean;\n};\n\nexport type EqualityComparator = (a: any, b: any, meta?: any) => boolean;\n\n/**\n * are the values passed strictly equal or both NaN\n *\n * @param a the value to compare against\n * @param b the value to test\n * @returns are the values equal by the SameValueZero principle\n */\nexport function sameValueZeroEqual(a: any, b: any) {\n return a === b || (a !== a && b !== b);\n}\n\n/**\n * is the value a plain object\n *\n * @param value the value to test\n * @returns is the value a plain object\n */\nexport function isPlainObject(value: any) {\n return value.constructor === Object || value.constructor == null;\n}\n\n/**\n * is the value promise-like (meaning it is thenable)\n *\n * @param value the value to test\n * @returns is the value promise-like\n */\nexport function isPromiseLike(value: any) {\n return !!value && typeof value.then === 'function';\n}\n\n/**\n * is the value passed a react element\n *\n * @param value the value to test\n * @returns is the value a react element\n */\nexport function isReactElement(value: any) {\n return !!(value && value.$$typeof);\n}\n\n/**\n * in cases where WeakSet is not supported, creates a new custom\n * object that mimics the necessary API aspects for cache purposes\n *\n * @returns the new cache object\n */\nexport function getNewCacheFallback(): Cache {\n const values: any[] = [];\n\n return {\n add(value: any) {\n values.push(value);\n },\n\n has(value: any) {\n return values.indexOf(value) !== -1;\n },\n };\n}\n\n/**\n * get a new cache object to prevent circular references\n *\n * @returns the new cache object\n */\nexport const getNewCache = ((canUseWeakMap: boolean) => {\n if (canUseWeakMap) {\n return function _getNewCache(): Cache {\n return new WeakSet();\n };\n }\n\n return getNewCacheFallback;\n})(HAS_WEAKSET_SUPPORT);\n\n/**\n * create a custom isEqual handler specific to circular objects\n *\n * @param [isEqual] the isEqual comparator to use instead of isDeepEqual\n * @returns the method to create the `isEqual` function\n */\nexport function createCircularEqualCreator(isEqual?: EqualityComparator) {\n return function createCircularEqual(comparator: EqualityComparator) {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a: any,\n b: any,\n cache: Cache = getNewCache(),\n ) {\n const isCacheableA = !!a && typeof a === 'object';\n const isCacheableB = !!b && typeof b === 'object';\n\n if (isCacheableA || isCacheableB) {\n const hasA = isCacheableA && cache.has(a);\n const hasB = isCacheableB && cache.has(b);\n\n if (hasA || hasB) {\n return hasA && hasB;\n }\n\n if (isCacheableA) {\n cache.add(a);\n }\n\n if (isCacheableB) {\n cache.add(b);\n }\n }\n\n return _comparator(a, b, cache);\n };\n };\n}\n\n/**\n * are the arrays equal in value\n *\n * @param a the array to test\n * @param b the array to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the arrays equal\n */\nexport function areArraysEqual(\n a: any[],\n b: any[],\n isEqual: EqualityComparator,\n meta: any,\n) {\n let index = a.length;\n\n if (b.length !== index) {\n return false;\n }\n\n while (index-- > 0) {\n if (!isEqual(a[index], b[index], meta)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * are the maps equal in value\n *\n * @param a the map to test\n * @param b the map to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta map to pass through\n * @returns are the maps equal\n */\nexport function areMapsEqual(\n a: Map<any, any>,\n b: Map<any, any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch =\n isEqual(aKey, bKey, meta) && isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n\ntype Dictionary<Type> = {\n [key: string]: Type;\n [index: number]: Type;\n};\n\nconst OWNER = '_owner';\n\nconst hasOwnProperty = Function.prototype.bind.call(\n Function.prototype.call,\n Object.prototype.hasOwnProperty,\n);\n\n/**\n * are the objects equal in value\n *\n * @param a the object to test\n * @param b the object to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta object to pass through\n * @returns are the objects equal\n */\nexport function areObjectsEqual(\n a: Dictionary<any>,\n b: Dictionary<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n const keysA = keys(a);\n\n let index = keysA.length;\n\n if (keys(b).length !== index) {\n return false;\n }\n\n if (index) {\n let key: string;\n\n while (index-- > 0) {\n key = keysA[index];\n\n if (key === OWNER) {\n const reactElementA = isReactElement(a);\n const reactElementB = isReactElement(b);\n\n if (\n (reactElementA || reactElementB) &&\n reactElementA !== reactElementB\n ) {\n return false;\n }\n }\n\n if (!hasOwnProperty(b, key) || !isEqual(a[key], b[key], meta)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n/**\n * are the regExps equal in value\n *\n * @param a the regExp to test\n * @param b the regExp to test agains\n * @returns are the regExps equal\n */\nexport function areRegExpsEqual(a: RegExp, b: RegExp) {\n return (\n a.source === b.source &&\n a.global === b.global &&\n a.ignoreCase === b.ignoreCase &&\n a.multiline === b.multiline &&\n a.unicode === b.unicode &&\n a.sticky === b.sticky &&\n a.lastIndex === b.lastIndex\n );\n}\n\n/**\n * are the sets equal in value\n *\n * @param a the set to test\n * @param b the set to test against\n * @param isEqual the comparator to determine equality\n * @param meta the meta set to pass through\n * @returns are the sets equal\n */\nexport function areSetsEqual(\n a: Set<any>,\n b: Set<any>,\n isEqual: EqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n\n a.forEach((aValue) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndex = 0;\n\n b.forEach((bValue) => {\n if (!hasMatch && !matchedIndices[matchIndex]) {\n hasMatch = isEqual(aValue, bValue, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndex] = true;\n }\n }\n\n matchIndex++;\n });\n\n isValueEqual = hasMatch;\n }\n });\n }\n\n return isValueEqual;\n}\n","import {\n EqualityComparator,\n areArraysEqual,\n areMapsEqual,\n areObjectsEqual,\n areRegExpsEqual,\n areSetsEqual,\n isPlainObject,\n isPromiseLike,\n sameValueZeroEqual,\n} from './utils';\n\nconst HAS_MAP_SUPPORT = typeof Map === 'function';\nconst HAS_SET_SUPPORT = typeof Set === 'function';\n\ntype EqualityComparatorCreator = (fn: EqualityComparator) => EqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator) {\n const isEqual: EqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : comparator;\n /* eslint-enable */\n\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n *\n * @param a the value to test against\n * @param b the value to test\n * @param [meta] an optional meta object that is passed through to all equality test calls\n * @returns are a and b equivalent in value\n */\n function comparator(a: any, b: any, meta?: any) {\n if (a === b) {\n return true;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n if (isPlainObject(a) && isPlainObject(b)) {\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n let aShape = Array.isArray(a);\n let bShape = Array.isArray(b);\n\n if (aShape || bShape) {\n return aShape === bShape && areArraysEqual(a, b, isEqual, meta);\n }\n\n aShape = a instanceof Date;\n bShape = b instanceof Date;\n\n if (aShape || bShape) {\n return (\n aShape === bShape && sameValueZeroEqual(a.getTime(), b.getTime())\n );\n }\n\n aShape = a instanceof RegExp;\n bShape = b instanceof RegExp;\n\n if (aShape || bShape) {\n return aShape === bShape && areRegExpsEqual(a, b);\n }\n\n if (isPromiseLike(a) || isPromiseLike(b)) {\n return a === b;\n }\n\n if (HAS_MAP_SUPPORT) {\n aShape = a instanceof Map;\n bShape = b instanceof Map;\n\n if (aShape || bShape) {\n return aShape === bShape && areMapsEqual(a, b, isEqual, meta);\n }\n }\n\n if (HAS_SET_SUPPORT) {\n aShape = a instanceof Set;\n bShape = b instanceof Set;\n\n if (aShape || bShape) {\n return aShape === bShape && areSetsEqual(a, b, isEqual, meta);\n }\n }\n\n return areObjectsEqual(a, b, isEqual, meta);\n }\n\n return a !== a && b !== b;\n }\n\n return comparator;\n}\n","import { createComparator } from './comparator';\nimport { createCircularEqualCreator, sameValueZeroEqual } from './utils';\n\nexport { createComparator as createCustomEqual, sameValueZeroEqual };\n\nexport const deepEqual = createComparator();\nexport const shallowEqual = createComparator(() => sameValueZeroEqual);\n\nexport const circularDeepEqual = createComparator(createCircularEqualCreator());\nexport const circularShallowEqual = createComparator(\n createCircularEqualCreator(sameValueZeroEqual),\n);\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,46 +6,47 @@
|
|
|
6
6
|
},
|
|
7
7
|
"description": "A blazing fast equality comparison, either shallow or deep",
|
|
8
8
|
"devDependencies": {
|
|
9
|
-
"@rollup/plugin-node-resolve": "^
|
|
10
|
-
"@types/jest": "^
|
|
11
|
-
"@types/lodash": "^4.14.
|
|
12
|
-
"@types/node": "^
|
|
13
|
-
"@types/ramda": "^0.27.
|
|
14
|
-
"@types/react": "^17.0.
|
|
15
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
16
|
-
"@typescript-eslint/parser": "^
|
|
9
|
+
"@rollup/plugin-node-resolve": "^13.0.6",
|
|
10
|
+
"@types/jest": "^27.0.3",
|
|
11
|
+
"@types/lodash": "^4.14.177",
|
|
12
|
+
"@types/node": "^16.11.11",
|
|
13
|
+
"@types/ramda": "^0.27.59",
|
|
14
|
+
"@types/react": "^17.0.37",
|
|
15
|
+
"@typescript-eslint/eslint-plugin": "^5.5.0",
|
|
16
|
+
"@typescript-eslint/parser": "^5.5.0",
|
|
17
17
|
"benchee": "^1.1.0",
|
|
18
|
-
"cli-
|
|
18
|
+
"cli-table3": "^0.6.0",
|
|
19
19
|
"decircularize": "^1.0.0",
|
|
20
20
|
"deep-eql": "^4.0.0",
|
|
21
21
|
"deep-equal": "^2.0.5",
|
|
22
|
-
"eslint": "^
|
|
23
|
-
"eslint-config-airbnb": "^
|
|
24
|
-
"eslint-plugin-import": "^2.
|
|
25
|
-
"eslint-plugin-jsx-a11y": "^6.
|
|
26
|
-
"eslint-plugin-react": "^7.
|
|
27
|
-
"eslint-webpack-plugin": "^
|
|
22
|
+
"eslint": "^8.4.0",
|
|
23
|
+
"eslint-config-airbnb": "^19.0.2",
|
|
24
|
+
"eslint-plugin-import": "^2.25.3",
|
|
25
|
+
"eslint-plugin-jsx-a11y": "^6.5.1",
|
|
26
|
+
"eslint-plugin-react": "^7.27.1",
|
|
27
|
+
"eslint-webpack-plugin": "^3.1.1",
|
|
28
28
|
"fast-deep-equal": "^3.1.3",
|
|
29
|
-
"fs-extra": "^
|
|
30
|
-
"html-webpack-plugin": "^5.
|
|
29
|
+
"fs-extra": "^10.0.0",
|
|
30
|
+
"html-webpack-plugin": "^5.5.0",
|
|
31
31
|
"in-publish": "^2.0.0",
|
|
32
|
-
"jest": "^
|
|
32
|
+
"jest": "^27.4.3",
|
|
33
33
|
"lodash": "^4.17.21",
|
|
34
34
|
"nano-equal": "^2.0.2",
|
|
35
35
|
"react": "^17.0.2",
|
|
36
36
|
"react-dom": "^17.0.2",
|
|
37
37
|
"react-fast-compare": "^3.2.0",
|
|
38
|
-
"
|
|
38
|
+
"release-it": "^14.11.8",
|
|
39
|
+
"rollup": "^2.60.2",
|
|
39
40
|
"rollup-plugin-terser": "^7.0.2",
|
|
40
|
-
"rollup-plugin-typescript2": "^0.
|
|
41
|
+
"rollup-plugin-typescript2": "^0.31.1",
|
|
41
42
|
"shallow-equal-fuzzy": "^0.0.2",
|
|
42
|
-
"ts-jest": "^
|
|
43
|
-
"ts-loader": "^9.
|
|
44
|
-
"typescript": "^4.2
|
|
43
|
+
"ts-jest": "^27.1.0",
|
|
44
|
+
"ts-loader": "^9.2.6",
|
|
45
|
+
"typescript": "^4.5.2",
|
|
45
46
|
"underscore": "^1.13.1",
|
|
46
|
-
"webpack": "^5.
|
|
47
|
-
"webpack-cli": "^4.
|
|
48
|
-
"webpack-dev-server": "^
|
|
47
|
+
"webpack": "^5.64.4",
|
|
48
|
+
"webpack-cli": "^4.9.1",
|
|
49
|
+
"webpack-dev-server": "^4.6.0"
|
|
49
50
|
},
|
|
50
51
|
"homepage": "https://github.com/planttheidea/fast-equals#readme",
|
|
51
52
|
"keywords": [
|
|
@@ -72,14 +73,15 @@
|
|
|
72
73
|
"lint:fix": "npm run lint -- --fix",
|
|
73
74
|
"start": "npm run dev",
|
|
74
75
|
"prepublish": "if in-publish; then npm run prepublish:compile; fi",
|
|
75
|
-
"prepublish:compile": "npm run lint && npm run test && npm run dist",
|
|
76
|
+
"prepublish:compile": "npm run typecheck && npm run lint && npm run test && npm run dist",
|
|
76
77
|
"release": "release-it",
|
|
77
78
|
"release:beta": "release-it --config=.release-it.beta.json",
|
|
78
79
|
"test": "NODE_PATH=. jest",
|
|
79
80
|
"test:coverage": "npm test -- --coverage",
|
|
80
|
-
"test:watch": "npm test -- --watch"
|
|
81
|
+
"test:watch": "npm test -- --watch",
|
|
82
|
+
"typecheck": "tsc --noEmit"
|
|
81
83
|
},
|
|
82
84
|
"sideEffects": false,
|
|
83
85
|
"types": "index.d.ts",
|
|
84
|
-
"version": "2.0.
|
|
86
|
+
"version": "2.0.4"
|
|
85
87
|
}
|