fast-equals 2.0.3 → 3.0.1
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 +42 -3
- package/README.md +36 -17
- package/dist/fast-equals.cjs.js +31 -12
- package/dist/fast-equals.cjs.js.map +1 -1
- package/dist/fast-equals.esm.js +31 -12
- package/dist/fast-equals.esm.js.map +1 -1
- package/dist/fast-equals.js +34 -15
- package/dist/fast-equals.js.map +1 -1
- package/dist/fast-equals.min.js +1 -1
- package/dist/fast-equals.mjs +31 -12
- package/dist/fast-equals.mjs.map +1 -1
- package/index.d.ts +15 -9
- package/package.json +32 -30
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# fast-equals CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 3.0.1
|
|
4
|
+
|
|
5
|
+
- Fix [#71](https://github.com/planttheidea/fast-equals/pull/71) - use generic types for better type flow-through
|
|
6
|
+
|
|
7
|
+
## 3.0.0
|
|
8
|
+
|
|
9
|
+
### Breaking changes
|
|
10
|
+
|
|
11
|
+
When creating a custom equality comparator via `createCustomEqual`, the equality method has an expanded contract:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
// Before
|
|
15
|
+
type EqualityComparator = (objectA: any, objectB: any, meta: any) => boolean;
|
|
16
|
+
|
|
17
|
+
// After
|
|
18
|
+
type InternalEqualityComparator = (
|
|
19
|
+
objectA: any,
|
|
20
|
+
objectB: any,
|
|
21
|
+
indexOrKeyA: any,
|
|
22
|
+
indexOrKeyB: any,
|
|
23
|
+
parentA: any,
|
|
24
|
+
parentB: any,
|
|
25
|
+
meta: any,
|
|
26
|
+
) => boolean;
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
If you have a custom equality comparator, you can ignore the differences by just passing additional `undefined` parameters, or you can use the parameters to further improve / clarify the logic.
|
|
30
|
+
|
|
31
|
+
- Add [#57](https://github.com/planttheidea/fast-equals/pull/57) - support additional metadata for custom equality comparators
|
|
32
|
+
|
|
33
|
+
## 2.0.4
|
|
34
|
+
|
|
35
|
+
- Fix [#58](https://github.com/planttheidea/fast-equals/issues/58) - duplicate entries in `Map` / `Set` can create false equality success
|
|
36
|
+
- [#60](https://github.com/planttheidea/fast-equals/issues/60) - Add documentation for key equality of `Map` being a part of `deepEqual`
|
|
37
|
+
|
|
3
38
|
## 2.0.3
|
|
4
39
|
|
|
5
40
|
- Fix [#50](https://github.com/planttheidea/fast-equals/pull/50) - copy-pasta in cacheable check
|
|
@@ -17,7 +52,7 @@
|
|
|
17
52
|
|
|
18
53
|
## 2.0.0
|
|
19
54
|
|
|
20
|
-
|
|
55
|
+
### Breaking changes
|
|
21
56
|
|
|
22
57
|
- There are longer `fast-equals/es`, `fast-equals/lib`, `fast-equals/mjs` locations
|
|
23
58
|
- Instead, there are 3 builds in `dist` for different consumption types:
|
|
@@ -27,13 +62,13 @@
|
|
|
27
62
|
- There is no default export anymore, only the previously-existing named exports
|
|
28
63
|
- To get all into a namespace, use `import * as fe from 'fast-equals`
|
|
29
64
|
|
|
30
|
-
|
|
65
|
+
### Updates
|
|
31
66
|
|
|
32
67
|
- Rewritten completely in TypeScript
|
|
33
68
|
- Improve speed of `Map` / `Set` comparisons
|
|
34
69
|
- Improve speed of React element comparisons
|
|
35
70
|
|
|
36
|
-
|
|
71
|
+
### Fixes
|
|
37
72
|
|
|
38
73
|
- Consider pure objects (`Object.create(null)`) to be plain objects
|
|
39
74
|
- Fix typings for `createCustomEqual`
|
|
@@ -133,3 +168,7 @@
|
|
|
133
168
|
## 1.0.0
|
|
134
169
|
|
|
135
170
|
- Initial release
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```
|
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
|
|
|
@@ -157,16 +173,19 @@ The signature is as follows:
|
|
|
157
173
|
|
|
158
174
|
```typescript
|
|
159
175
|
type EqualityComparator = (a: any, b: any, meta?: any) => boolean;
|
|
176
|
+
type InternalEqualityComparator = (a: any, b: any, indexOrKeyA: any, indexOrKeyB: any, parentA: any, parentB: any, meta: any) => boolean;
|
|
160
177
|
type EqualityComparatorCreator = (
|
|
161
178
|
deepEqual: EqualityComparator,
|
|
162
|
-
) =>
|
|
179
|
+
) => InternalEqualityComparator;
|
|
163
180
|
|
|
164
181
|
function createCustomEqual(
|
|
165
182
|
createIsEqual?: EqualityComparatorCreator,
|
|
166
183
|
): EqualityComparator;
|
|
167
184
|
```
|
|
168
185
|
|
|
169
|
-
The `meta` parameter in `EqualityComparator` is whatever you want it to be. It will be passed through to all equality checks, and is meant specifically for use with custom equality methods. For example, with the `circularDeepEqual` and `circularShallowEqual` methods, it is used to pass through a cache of processed objects.
|
|
186
|
+
The `meta` parameter in `EqualityComparator` and `InternalEqualityComparator` is whatever you want it to be. It will be passed through to all equality checks, and is meant specifically for use with custom equality methods. For example, with the `circularDeepEqual` and `circularShallowEqual` methods, it is used to pass through a cache of processed objects.
|
|
187
|
+
|
|
188
|
+
_**NOTE**: `Map` implementations compare equality for both keys and value. When using a custom comparator and comparing equality of the keys, the iteration index is provided as both `indexOrKeyA` and `indexOrKeyB` to help use-cases where ordering of keys matters to equality._
|
|
170
189
|
|
|
171
190
|
An example for a custom equality comparison that also checks against values in the meta object:
|
|
172
191
|
|
|
@@ -174,7 +193,7 @@ An example for a custom equality comparison that also checks against values in t
|
|
|
174
193
|
import { createCustomEqual } from 'fast-equals';
|
|
175
194
|
|
|
176
195
|
const isDeepEqualOrFooMatchesMeta = createCustomEqual(
|
|
177
|
-
(deepEqual) => (objectA, objectB, meta) =>
|
|
196
|
+
(deepEqual) => (objectA, objectB, indexOrKeyA, indexOrKeyB, parentA, parentB, meta) =>
|
|
178
197
|
objectA.foo === meta ||
|
|
179
198
|
objectB.foo === meta ||
|
|
180
199
|
deepEqual(objectA, objectB, meta),
|
package/dist/fast-equals.cjs.js
CHANGED
|
@@ -80,7 +80,7 @@ var getNewCache = (function (canUseWeakMap) {
|
|
|
80
80
|
function createCircularEqualCreator(isEqual) {
|
|
81
81
|
return function createCircularEqual(comparator) {
|
|
82
82
|
var _comparator = isEqual || comparator;
|
|
83
|
-
return function circularEqual(a, b, cache) {
|
|
83
|
+
return function circularEqual(a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, cache) {
|
|
84
84
|
if (cache === void 0) { cache = getNewCache(); }
|
|
85
85
|
var isCacheableA = !!a && typeof a === 'object';
|
|
86
86
|
var isCacheableB = !!b && typeof b === 'object';
|
|
@@ -116,7 +116,7 @@ function areArraysEqual(a, b, isEqual, meta) {
|
|
|
116
116
|
return false;
|
|
117
117
|
}
|
|
118
118
|
while (index-- > 0) {
|
|
119
|
-
if (!isEqual(a[index], b[index], meta)) {
|
|
119
|
+
if (!isEqual(a[index], b[index], index, index, a, b, meta)) {
|
|
120
120
|
return false;
|
|
121
121
|
}
|
|
122
122
|
}
|
|
@@ -134,14 +134,25 @@ 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 = {};
|
|
138
|
+
var indexA_1 = 0;
|
|
137
139
|
a.forEach(function (aValue, aKey) {
|
|
138
140
|
if (isValueEqual) {
|
|
139
|
-
|
|
141
|
+
var hasMatch_1 = false;
|
|
142
|
+
var matchIndexB_1 = 0;
|
|
140
143
|
b.forEach(function (bValue, bKey) {
|
|
141
|
-
if (!
|
|
142
|
-
|
|
144
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndexB_1]) {
|
|
145
|
+
hasMatch_1 =
|
|
146
|
+
isEqual(aKey, bKey, indexA_1, matchIndexB_1, a, b, meta) &&
|
|
147
|
+
isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
148
|
+
if (hasMatch_1) {
|
|
149
|
+
matchedIndices_1[matchIndexB_1] = true;
|
|
150
|
+
}
|
|
143
151
|
}
|
|
152
|
+
matchIndexB_1++;
|
|
144
153
|
});
|
|
154
|
+
indexA_1++;
|
|
155
|
+
isValueEqual = hasMatch_1;
|
|
145
156
|
}
|
|
146
157
|
});
|
|
147
158
|
}
|
|
@@ -176,7 +187,8 @@ function areObjectsEqual(a, b, isEqual, meta) {
|
|
|
176
187
|
return false;
|
|
177
188
|
}
|
|
178
189
|
}
|
|
179
|
-
if (!hasOwnProperty(b, key) ||
|
|
190
|
+
if (!hasOwnProperty(b, key) ||
|
|
191
|
+
!isEqual(a[key], b[key], key, key, a, b, meta)) {
|
|
180
192
|
return false;
|
|
181
193
|
}
|
|
182
194
|
}
|
|
@@ -211,14 +223,21 @@ function areRegExpsEqual(a, b) {
|
|
|
211
223
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
212
224
|
var isValueEqual = a.size === b.size;
|
|
213
225
|
if (isValueEqual && a.size) {
|
|
214
|
-
|
|
226
|
+
var matchedIndices_2 = {};
|
|
227
|
+
a.forEach(function (aValue, aKey) {
|
|
215
228
|
if (isValueEqual) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
229
|
+
var hasMatch_2 = false;
|
|
230
|
+
var matchIndex_1 = 0;
|
|
231
|
+
b.forEach(function (bValue, bKey) {
|
|
232
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_1]) {
|
|
233
|
+
hasMatch_2 = isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
234
|
+
if (hasMatch_2) {
|
|
235
|
+
matchedIndices_2[matchIndex_1] = true;
|
|
236
|
+
}
|
|
220
237
|
}
|
|
238
|
+
matchIndex_1++;
|
|
221
239
|
});
|
|
240
|
+
isValueEqual = hasMatch_2;
|
|
222
241
|
}
|
|
223
242
|
});
|
|
224
243
|
}
|
|
@@ -232,7 +251,7 @@ function createComparator(createIsEqual) {
|
|
|
232
251
|
/* eslint-disable no-use-before-define */
|
|
233
252
|
typeof createIsEqual === 'function'
|
|
234
253
|
? createIsEqual(comparator)
|
|
235
|
-
: comparator;
|
|
254
|
+
: function (a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, meta) { return comparator(a, b, meta); };
|
|
236
255
|
/* eslint-enable */
|
|
237
256
|
/**
|
|
238
257
|
* compare the value of the two objects and return true if they are equivalent in values
|
|
@@ -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 InternalEqualityComparator = (\n objectA: any,\n objectB: any,\n indexOrKeyA: any,\n indexOrKeyB: any,\n parentA: any,\n parentB: any,\n meta: any,\n) => boolean;\n\nexport type EqualityComparator = <A, B, Meta>(\n objectA: A,\n objectB: B,\n meta?: Meta,\n) => 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(\n comparator: EqualityComparator,\n ): InternalEqualityComparator {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a,\n b,\n indexOrKeyA,\n indexOrKeyB,\n parentA,\n parentB,\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: InternalEqualityComparator,\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], index, index, a, b, 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: InternalEqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n let indexA = 0;\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndexB = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndexB]) {\n hasMatch =\n isEqual(aKey, bKey, indexA, matchIndexB, a, b, meta) &&\n isEqual(aValue, bValue, aKey, bKey, a, b, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndexB] = true;\n }\n }\n\n matchIndexB++;\n });\n\n indexA++;\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: InternalEqualityComparator,\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 (\n !hasOwnProperty(b, key) ||\n !isEqual(a[key], b[key], key, key, a, b, meta)\n ) {\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: InternalEqualityComparator,\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 = isEqual(aValue, bValue, aKey, bKey, a, b, 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 InternalEqualityComparator,\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\nexport type EqualityComparatorCreator = (fn: EqualityComparator) => InternalEqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator): EqualityComparator {\n const isEqual: InternalEqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : (a: any, b: any, indexOrKeyA: any, indexOrKeyB: any, parentA: any, parentB: any, meta: any) => comparator(a, b, meta);\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
|
@@ -76,7 +76,7 @@ var getNewCache = (function (canUseWeakMap) {
|
|
|
76
76
|
function createCircularEqualCreator(isEqual) {
|
|
77
77
|
return function createCircularEqual(comparator) {
|
|
78
78
|
var _comparator = isEqual || comparator;
|
|
79
|
-
return function circularEqual(a, b, cache) {
|
|
79
|
+
return function circularEqual(a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, cache) {
|
|
80
80
|
if (cache === void 0) { cache = getNewCache(); }
|
|
81
81
|
var isCacheableA = !!a && typeof a === 'object';
|
|
82
82
|
var isCacheableB = !!b && typeof b === 'object';
|
|
@@ -112,7 +112,7 @@ function areArraysEqual(a, b, isEqual, meta) {
|
|
|
112
112
|
return false;
|
|
113
113
|
}
|
|
114
114
|
while (index-- > 0) {
|
|
115
|
-
if (!isEqual(a[index], b[index], meta)) {
|
|
115
|
+
if (!isEqual(a[index], b[index], index, index, a, b, meta)) {
|
|
116
116
|
return false;
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -130,14 +130,25 @@ 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 = {};
|
|
134
|
+
var indexA_1 = 0;
|
|
133
135
|
a.forEach(function (aValue, aKey) {
|
|
134
136
|
if (isValueEqual) {
|
|
135
|
-
|
|
137
|
+
var hasMatch_1 = false;
|
|
138
|
+
var matchIndexB_1 = 0;
|
|
136
139
|
b.forEach(function (bValue, bKey) {
|
|
137
|
-
if (!
|
|
138
|
-
|
|
140
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndexB_1]) {
|
|
141
|
+
hasMatch_1 =
|
|
142
|
+
isEqual(aKey, bKey, indexA_1, matchIndexB_1, a, b, meta) &&
|
|
143
|
+
isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
144
|
+
if (hasMatch_1) {
|
|
145
|
+
matchedIndices_1[matchIndexB_1] = true;
|
|
146
|
+
}
|
|
139
147
|
}
|
|
148
|
+
matchIndexB_1++;
|
|
140
149
|
});
|
|
150
|
+
indexA_1++;
|
|
151
|
+
isValueEqual = hasMatch_1;
|
|
141
152
|
}
|
|
142
153
|
});
|
|
143
154
|
}
|
|
@@ -172,7 +183,8 @@ function areObjectsEqual(a, b, isEqual, meta) {
|
|
|
172
183
|
return false;
|
|
173
184
|
}
|
|
174
185
|
}
|
|
175
|
-
if (!hasOwnProperty(b, key) ||
|
|
186
|
+
if (!hasOwnProperty(b, key) ||
|
|
187
|
+
!isEqual(a[key], b[key], key, key, a, b, meta)) {
|
|
176
188
|
return false;
|
|
177
189
|
}
|
|
178
190
|
}
|
|
@@ -207,14 +219,21 @@ function areRegExpsEqual(a, b) {
|
|
|
207
219
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
208
220
|
var isValueEqual = a.size === b.size;
|
|
209
221
|
if (isValueEqual && a.size) {
|
|
210
|
-
|
|
222
|
+
var matchedIndices_2 = {};
|
|
223
|
+
a.forEach(function (aValue, aKey) {
|
|
211
224
|
if (isValueEqual) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
225
|
+
var hasMatch_2 = false;
|
|
226
|
+
var matchIndex_1 = 0;
|
|
227
|
+
b.forEach(function (bValue, bKey) {
|
|
228
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_1]) {
|
|
229
|
+
hasMatch_2 = isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
230
|
+
if (hasMatch_2) {
|
|
231
|
+
matchedIndices_2[matchIndex_1] = true;
|
|
232
|
+
}
|
|
216
233
|
}
|
|
234
|
+
matchIndex_1++;
|
|
217
235
|
});
|
|
236
|
+
isValueEqual = hasMatch_2;
|
|
218
237
|
}
|
|
219
238
|
});
|
|
220
239
|
}
|
|
@@ -228,7 +247,7 @@ function createComparator(createIsEqual) {
|
|
|
228
247
|
/* eslint-disable no-use-before-define */
|
|
229
248
|
typeof createIsEqual === 'function'
|
|
230
249
|
? createIsEqual(comparator)
|
|
231
|
-
: comparator;
|
|
250
|
+
: function (a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, meta) { return comparator(a, b, meta); };
|
|
232
251
|
/* eslint-enable */
|
|
233
252
|
/**
|
|
234
253
|
* compare the value of the two objects and return true if they are equivalent in values
|
|
@@ -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":"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"}
|
|
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 InternalEqualityComparator = (\n objectA: any,\n objectB: any,\n indexOrKeyA: any,\n indexOrKeyB: any,\n parentA: any,\n parentB: any,\n meta: any,\n) => boolean;\n\nexport type EqualityComparator = <A, B, Meta>(\n objectA: A,\n objectB: B,\n meta?: Meta,\n) => 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(\n comparator: EqualityComparator,\n ): InternalEqualityComparator {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a,\n b,\n indexOrKeyA,\n indexOrKeyB,\n parentA,\n parentB,\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: InternalEqualityComparator,\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], index, index, a, b, 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: InternalEqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n let indexA = 0;\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndexB = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndexB]) {\n hasMatch =\n isEqual(aKey, bKey, indexA, matchIndexB, a, b, meta) &&\n isEqual(aValue, bValue, aKey, bKey, a, b, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndexB] = true;\n }\n }\n\n matchIndexB++;\n });\n\n indexA++;\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: InternalEqualityComparator,\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 (\n !hasOwnProperty(b, key) ||\n !isEqual(a[key], b[key], key, key, a, b, meta)\n ) {\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: InternalEqualityComparator,\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 = isEqual(aValue, bValue, aKey, bKey, a, b, 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 InternalEqualityComparator,\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\nexport type EqualityComparatorCreator = (fn: EqualityComparator) => InternalEqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator): EqualityComparator {\n const isEqual: InternalEqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : (a: any, b: any, indexOrKeyA: any, indexOrKeyB: any, parentA: any, parentB: any, meta: any) => comparator(a, b, meta);\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;
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
function createCircularEqualCreator(isEqual) {
|
|
83
83
|
return function createCircularEqual(comparator) {
|
|
84
84
|
var _comparator = isEqual || comparator;
|
|
85
|
-
return function circularEqual(a, b, cache) {
|
|
85
|
+
return function circularEqual(a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, cache) {
|
|
86
86
|
if (cache === void 0) { cache = getNewCache(); }
|
|
87
87
|
var isCacheableA = !!a && typeof a === 'object';
|
|
88
88
|
var isCacheableB = !!b && typeof b === 'object';
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
return false;
|
|
119
119
|
}
|
|
120
120
|
while (index-- > 0) {
|
|
121
|
-
if (!isEqual(a[index], b[index], meta)) {
|
|
121
|
+
if (!isEqual(a[index], b[index], index, index, a, b, meta)) {
|
|
122
122
|
return false;
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -136,14 +136,25 @@
|
|
|
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 = {};
|
|
140
|
+
var indexA_1 = 0;
|
|
139
141
|
a.forEach(function (aValue, aKey) {
|
|
140
142
|
if (isValueEqual) {
|
|
141
|
-
|
|
143
|
+
var hasMatch_1 = false;
|
|
144
|
+
var matchIndexB_1 = 0;
|
|
142
145
|
b.forEach(function (bValue, bKey) {
|
|
143
|
-
if (!
|
|
144
|
-
|
|
146
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndexB_1]) {
|
|
147
|
+
hasMatch_1 =
|
|
148
|
+
isEqual(aKey, bKey, indexA_1, matchIndexB_1, a, b, meta) &&
|
|
149
|
+
isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
150
|
+
if (hasMatch_1) {
|
|
151
|
+
matchedIndices_1[matchIndexB_1] = true;
|
|
152
|
+
}
|
|
145
153
|
}
|
|
154
|
+
matchIndexB_1++;
|
|
146
155
|
});
|
|
156
|
+
indexA_1++;
|
|
157
|
+
isValueEqual = hasMatch_1;
|
|
147
158
|
}
|
|
148
159
|
});
|
|
149
160
|
}
|
|
@@ -178,7 +189,8 @@
|
|
|
178
189
|
return false;
|
|
179
190
|
}
|
|
180
191
|
}
|
|
181
|
-
if (!hasOwnProperty(b, key) ||
|
|
192
|
+
if (!hasOwnProperty(b, key) ||
|
|
193
|
+
!isEqual(a[key], b[key], key, key, a, b, meta)) {
|
|
182
194
|
return false;
|
|
183
195
|
}
|
|
184
196
|
}
|
|
@@ -213,14 +225,21 @@
|
|
|
213
225
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
214
226
|
var isValueEqual = a.size === b.size;
|
|
215
227
|
if (isValueEqual && a.size) {
|
|
216
|
-
|
|
228
|
+
var matchedIndices_2 = {};
|
|
229
|
+
a.forEach(function (aValue, aKey) {
|
|
217
230
|
if (isValueEqual) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
231
|
+
var hasMatch_2 = false;
|
|
232
|
+
var matchIndex_1 = 0;
|
|
233
|
+
b.forEach(function (bValue, bKey) {
|
|
234
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_1]) {
|
|
235
|
+
hasMatch_2 = isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
236
|
+
if (hasMatch_2) {
|
|
237
|
+
matchedIndices_2[matchIndex_1] = true;
|
|
238
|
+
}
|
|
222
239
|
}
|
|
240
|
+
matchIndex_1++;
|
|
223
241
|
});
|
|
242
|
+
isValueEqual = hasMatch_2;
|
|
224
243
|
}
|
|
225
244
|
});
|
|
226
245
|
}
|
|
@@ -234,7 +253,7 @@
|
|
|
234
253
|
/* eslint-disable no-use-before-define */
|
|
235
254
|
typeof createIsEqual === 'function'
|
|
236
255
|
? createIsEqual(comparator)
|
|
237
|
-
: comparator;
|
|
256
|
+
: function (a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, meta) { return comparator(a, b, meta); };
|
|
238
257
|
/* eslint-enable */
|
|
239
258
|
/**
|
|
240
259
|
* compare the value of the two objects and return true if they are equivalent in values
|
|
@@ -305,5 +324,5 @@
|
|
|
305
324
|
|
|
306
325
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
307
326
|
|
|
308
|
-
}))
|
|
327
|
+
}));
|
|
309
328
|
//# 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 InternalEqualityComparator = (\n objectA: any,\n objectB: any,\n indexOrKeyA: any,\n indexOrKeyB: any,\n parentA: any,\n parentB: any,\n meta: any,\n) => boolean;\n\nexport type EqualityComparator = <A, B, Meta>(\n objectA: A,\n objectB: B,\n meta?: Meta,\n) => 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(\n comparator: EqualityComparator,\n ): InternalEqualityComparator {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a,\n b,\n indexOrKeyA,\n indexOrKeyB,\n parentA,\n parentB,\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: InternalEqualityComparator,\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], index, index, a, b, 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: InternalEqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n let indexA = 0;\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndexB = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndexB]) {\n hasMatch =\n isEqual(aKey, bKey, indexA, matchIndexB, a, b, meta) &&\n isEqual(aValue, bValue, aKey, bKey, a, b, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndexB] = true;\n }\n }\n\n matchIndexB++;\n });\n\n indexA++;\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: InternalEqualityComparator,\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 (\n !hasOwnProperty(b, key) ||\n !isEqual(a[key], b[key], key, key, a, b, meta)\n ) {\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: InternalEqualityComparator,\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 = isEqual(aValue, bValue, aKey, bKey, a, b, 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 InternalEqualityComparator,\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\nexport type EqualityComparatorCreator = (fn: EqualityComparator) => InternalEqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator): EqualityComparator {\n const isEqual: InternalEqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : (a: any, b: any, indexOrKeyA: any, indexOrKeyB: any, parentA: any, parentB: any, meta: any) => comparator(a, b, meta);\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===
|
|
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,o,i,u,f){void 0===f&&(f=a());var c=!!n&&"object"==typeof n,s=!!e&&"object"==typeof e;if(c||s){var l=c&&f.has(n),p=s&&f.has(e);if(l||p)return l&&p;c&&f.add(n),s&&f.add(e)}return t(n,e,f)}}}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],a,a,n,e,o))return!1}return!0}var p="function"==typeof Map,d="function"==typeof Set;function y(n){var e="function"==typeof n?n(t):function(n,e,r,o,i,u,f){return t(n,e,f)};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],o,o,n,e,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={},u=0;n.forEach((function(f,a){if(o){var c=!1,s=0;e.forEach((function(o,l){c||i[s]||(c=t(a,l,u,s,n,e,r)&&t(f,o,a,l,n,e,r))&&(i[s]=!0),s++})),u++,o=c}}))}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(u,f){if(o){var a=!1,c=0;e.forEach((function(o,s){a||i[c]||(a=t(u,o,f,s,n,e,r))&&(i[c]=!0),c++})),o=a}}))}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
|
@@ -76,7 +76,7 @@ var getNewCache = (function (canUseWeakMap) {
|
|
|
76
76
|
function createCircularEqualCreator(isEqual) {
|
|
77
77
|
return function createCircularEqual(comparator) {
|
|
78
78
|
var _comparator = isEqual || comparator;
|
|
79
|
-
return function circularEqual(a, b, cache) {
|
|
79
|
+
return function circularEqual(a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, cache) {
|
|
80
80
|
if (cache === void 0) { cache = getNewCache(); }
|
|
81
81
|
var isCacheableA = !!a && typeof a === 'object';
|
|
82
82
|
var isCacheableB = !!b && typeof b === 'object';
|
|
@@ -112,7 +112,7 @@ function areArraysEqual(a, b, isEqual, meta) {
|
|
|
112
112
|
return false;
|
|
113
113
|
}
|
|
114
114
|
while (index-- > 0) {
|
|
115
|
-
if (!isEqual(a[index], b[index], meta)) {
|
|
115
|
+
if (!isEqual(a[index], b[index], index, index, a, b, meta)) {
|
|
116
116
|
return false;
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -130,14 +130,25 @@ 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 = {};
|
|
134
|
+
var indexA_1 = 0;
|
|
133
135
|
a.forEach(function (aValue, aKey) {
|
|
134
136
|
if (isValueEqual) {
|
|
135
|
-
|
|
137
|
+
var hasMatch_1 = false;
|
|
138
|
+
var matchIndexB_1 = 0;
|
|
136
139
|
b.forEach(function (bValue, bKey) {
|
|
137
|
-
if (!
|
|
138
|
-
|
|
140
|
+
if (!hasMatch_1 && !matchedIndices_1[matchIndexB_1]) {
|
|
141
|
+
hasMatch_1 =
|
|
142
|
+
isEqual(aKey, bKey, indexA_1, matchIndexB_1, a, b, meta) &&
|
|
143
|
+
isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
144
|
+
if (hasMatch_1) {
|
|
145
|
+
matchedIndices_1[matchIndexB_1] = true;
|
|
146
|
+
}
|
|
139
147
|
}
|
|
148
|
+
matchIndexB_1++;
|
|
140
149
|
});
|
|
150
|
+
indexA_1++;
|
|
151
|
+
isValueEqual = hasMatch_1;
|
|
141
152
|
}
|
|
142
153
|
});
|
|
143
154
|
}
|
|
@@ -172,7 +183,8 @@ function areObjectsEqual(a, b, isEqual, meta) {
|
|
|
172
183
|
return false;
|
|
173
184
|
}
|
|
174
185
|
}
|
|
175
|
-
if (!hasOwnProperty(b, key) ||
|
|
186
|
+
if (!hasOwnProperty(b, key) ||
|
|
187
|
+
!isEqual(a[key], b[key], key, key, a, b, meta)) {
|
|
176
188
|
return false;
|
|
177
189
|
}
|
|
178
190
|
}
|
|
@@ -207,14 +219,21 @@ function areRegExpsEqual(a, b) {
|
|
|
207
219
|
function areSetsEqual(a, b, isEqual, meta) {
|
|
208
220
|
var isValueEqual = a.size === b.size;
|
|
209
221
|
if (isValueEqual && a.size) {
|
|
210
|
-
|
|
222
|
+
var matchedIndices_2 = {};
|
|
223
|
+
a.forEach(function (aValue, aKey) {
|
|
211
224
|
if (isValueEqual) {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
225
|
+
var hasMatch_2 = false;
|
|
226
|
+
var matchIndex_1 = 0;
|
|
227
|
+
b.forEach(function (bValue, bKey) {
|
|
228
|
+
if (!hasMatch_2 && !matchedIndices_2[matchIndex_1]) {
|
|
229
|
+
hasMatch_2 = isEqual(aValue, bValue, aKey, bKey, a, b, meta);
|
|
230
|
+
if (hasMatch_2) {
|
|
231
|
+
matchedIndices_2[matchIndex_1] = true;
|
|
232
|
+
}
|
|
216
233
|
}
|
|
234
|
+
matchIndex_1++;
|
|
217
235
|
});
|
|
236
|
+
isValueEqual = hasMatch_2;
|
|
218
237
|
}
|
|
219
238
|
});
|
|
220
239
|
}
|
|
@@ -228,7 +247,7 @@ function createComparator(createIsEqual) {
|
|
|
228
247
|
/* eslint-disable no-use-before-define */
|
|
229
248
|
typeof createIsEqual === 'function'
|
|
230
249
|
? createIsEqual(comparator)
|
|
231
|
-
: comparator;
|
|
250
|
+
: function (a, b, indexOrKeyA, indexOrKeyB, parentA, parentB, meta) { return comparator(a, b, meta); };
|
|
232
251
|
/* eslint-enable */
|
|
233
252
|
/**
|
|
234
253
|
* compare the value of the two objects and return true if they are equivalent in values
|
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 InternalEqualityComparator = (\n objectA: any,\n objectB: any,\n indexOrKeyA: any,\n indexOrKeyB: any,\n parentA: any,\n parentB: any,\n meta: any,\n) => boolean;\n\nexport type EqualityComparator = <A, B, Meta>(\n objectA: A,\n objectB: B,\n meta?: Meta,\n) => 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(\n comparator: EqualityComparator,\n ): InternalEqualityComparator {\n const _comparator = isEqual || comparator;\n\n return function circularEqual(\n a,\n b,\n indexOrKeyA,\n indexOrKeyB,\n parentA,\n parentB,\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: InternalEqualityComparator,\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], index, index, a, b, 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: InternalEqualityComparator,\n meta: any,\n) {\n let isValueEqual = a.size === b.size;\n\n if (isValueEqual && a.size) {\n const matchedIndices: Record<number, true> = {};\n let indexA = 0;\n\n a.forEach((aValue, aKey) => {\n if (isValueEqual) {\n let hasMatch = false;\n let matchIndexB = 0;\n\n b.forEach((bValue, bKey) => {\n if (!hasMatch && !matchedIndices[matchIndexB]) {\n hasMatch =\n isEqual(aKey, bKey, indexA, matchIndexB, a, b, meta) &&\n isEqual(aValue, bValue, aKey, bKey, a, b, meta);\n\n if (hasMatch) {\n matchedIndices[matchIndexB] = true;\n }\n }\n\n matchIndexB++;\n });\n\n indexA++;\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: InternalEqualityComparator,\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 (\n !hasOwnProperty(b, key) ||\n !isEqual(a[key], b[key], key, key, a, b, meta)\n ) {\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: InternalEqualityComparator,\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 = isEqual(aValue, bValue, aKey, bKey, a, b, 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 InternalEqualityComparator,\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\nexport type EqualityComparatorCreator = (fn: EqualityComparator) => InternalEqualityComparator;\n\nexport function createComparator(createIsEqual?: EqualityComparatorCreator): EqualityComparator {\n const isEqual: InternalEqualityComparator =\n /* eslint-disable no-use-before-define */\n typeof createIsEqual === 'function'\n ? createIsEqual(comparator)\n : (a: any, b: any, indexOrKeyA: any, indexOrKeyB: any, parentA: any, parentB: any, meta: any) => comparator(a, b, meta);\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/index.d.ts
CHANGED
|
@@ -3,18 +3,24 @@ declare type EqualityComparator = (
|
|
|
3
3
|
objectB: any,
|
|
4
4
|
meta?: any,
|
|
5
5
|
) => boolean;
|
|
6
|
+
declare type InternalEqualityComparator = (
|
|
7
|
+
objectA: any,
|
|
8
|
+
objectB: any,
|
|
9
|
+
indexOrKeyA: any,
|
|
10
|
+
indexOrKeyB: any,
|
|
11
|
+
parentA: any,
|
|
12
|
+
parentB: any,
|
|
13
|
+
meta: any,
|
|
14
|
+
) => boolean;
|
|
6
15
|
declare type EqualityComparatorCreator = (
|
|
7
16
|
comparator: EqualityComparator,
|
|
8
|
-
) =>
|
|
17
|
+
) => InternalEqualityComparator;
|
|
9
18
|
|
|
10
19
|
export declare function createCustomEqual(
|
|
11
20
|
createIsEqual?: EqualityComparatorCreator,
|
|
12
21
|
): EqualityComparator;
|
|
13
|
-
export declare function circularDeepEqual(objectA:
|
|
14
|
-
export declare function circularShallowEqual(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
): boolean;
|
|
18
|
-
export declare function deepEqual(objectA: any, objectB: any): boolean;
|
|
19
|
-
export declare function shallowEqual(objectA: any, objectB: any): boolean;
|
|
20
|
-
export declare function sameValueZeroEqual(objectA: any, objectB: any): boolean;
|
|
22
|
+
export declare function circularDeepEqual<A, B>(objectA: A, objectB: B): boolean;
|
|
23
|
+
export declare function circularShallowEqual<A, B>(objectA: A, objectB: B): boolean;
|
|
24
|
+
export declare function deepEqual<A, B>(objectA: A, objectB: B): boolean;
|
|
25
|
+
export declare function shallowEqual<A, B>(objectA: A, objectB: B): boolean;
|
|
26
|
+
export declare function sameValueZeroEqual<A, B>(objectA: A, objectB: B): boolean;
|
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.1.3",
|
|
10
|
+
"@types/jest": "^27.4.0",
|
|
11
|
+
"@types/lodash": "^4.14.178",
|
|
12
|
+
"@types/node": "^17.0.17",
|
|
13
|
+
"@types/ramda": "^0.27.64",
|
|
14
|
+
"@types/react": "^17.0.39",
|
|
15
|
+
"@typescript-eslint/eslint-plugin": "^5.11.0",
|
|
16
|
+
"@typescript-eslint/parser": "^5.11.0",
|
|
17
17
|
"benchee": "^1.1.0",
|
|
18
|
-
"cli-
|
|
18
|
+
"cli-table3": "^0.6.1",
|
|
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.9.0",
|
|
23
|
+
"eslint-config-airbnb": "^19.0.4",
|
|
24
|
+
"eslint-plugin-import": "^2.25.4",
|
|
25
|
+
"eslint-plugin-jsx-a11y": "^6.5.1",
|
|
26
|
+
"eslint-plugin-react": "^7.28.0",
|
|
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.5.1",
|
|
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.12.4",
|
|
39
|
+
"rollup": "^2.67.2",
|
|
39
40
|
"rollup-plugin-terser": "^7.0.2",
|
|
40
|
-
"rollup-plugin-typescript2": "^0.
|
|
41
|
+
"rollup-plugin-typescript2": "^0.31.2",
|
|
41
42
|
"shallow-equal-fuzzy": "^0.0.2",
|
|
42
|
-
"ts-jest": "^
|
|
43
|
-
"ts-loader": "^9.
|
|
44
|
-
"typescript": "^4.
|
|
45
|
-
"underscore": "^1.13.
|
|
46
|
-
"webpack": "^5.
|
|
47
|
-
"webpack-cli": "^4.
|
|
48
|
-
"webpack-dev-server": "^
|
|
43
|
+
"ts-jest": "^27.1.3",
|
|
44
|
+
"ts-loader": "^9.2.6",
|
|
45
|
+
"typescript": "^4.5.5",
|
|
46
|
+
"underscore": "^1.13.2",
|
|
47
|
+
"webpack": "^5.68.0",
|
|
48
|
+
"webpack-cli": "^4.9.2",
|
|
49
|
+
"webpack-dev-server": "^4.7.4"
|
|
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": "
|
|
86
|
+
"version": "3.0.1"
|
|
85
87
|
}
|