ava 5.3.0 → 5.3.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/lib/like-selector.js +26 -17
- package/package.json +1 -1
package/lib/like-selector.js
CHANGED
|
@@ -1,32 +1,41 @@
|
|
|
1
|
-
const
|
|
1
|
+
const isPrimitive = value => value === null || typeof value !== 'object';
|
|
2
2
|
|
|
3
3
|
export function isLikeSelector(selector) {
|
|
4
|
-
|
|
4
|
+
// Require selector to be an array or plain object.
|
|
5
|
+
if (
|
|
6
|
+
isPrimitive(selector)
|
|
7
|
+
|| (!Array.isArray(selector) && Reflect.getPrototypeOf(selector) !== Object.prototype)
|
|
8
|
+
) {
|
|
5
9
|
return false;
|
|
6
10
|
}
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
|
|
12
|
+
// Also require at least one enumerable property.
|
|
13
|
+
const descriptors = Object.getOwnPropertyDescriptors(selector);
|
|
14
|
+
return Reflect.ownKeys(descriptors).some(key => descriptors[key].enumerable === true);
|
|
10
15
|
}
|
|
11
16
|
|
|
12
17
|
export const CIRCULAR_SELECTOR = new Error('Encountered a circular selector');
|
|
13
18
|
|
|
14
|
-
export function selectComparable(
|
|
15
|
-
if (
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
circular.add(selector);
|
|
20
|
-
|
|
21
|
-
if (lhs === null || typeof lhs !== 'object') {
|
|
22
|
-
return lhs;
|
|
19
|
+
export function selectComparable(actual, selector, circular = [selector]) {
|
|
20
|
+
if (isPrimitive(actual)) {
|
|
21
|
+
return actual;
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
const comparable = Array.isArray(selector) ? [] : {};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
const enumerableKeys = Reflect.ownKeys(selector).filter(key => Reflect.getOwnPropertyDescriptor(selector, key).enumerable);
|
|
26
|
+
for (const key of enumerableKeys) {
|
|
27
|
+
const subselector = Reflect.get(selector, key);
|
|
28
|
+
if (isLikeSelector(subselector)) {
|
|
29
|
+
if (circular.includes(subselector)) {
|
|
30
|
+
throw CIRCULAR_SELECTOR;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
circular.push(subselector);
|
|
34
|
+
comparable[key] = selectComparable(Reflect.get(actual, key), subselector, circular);
|
|
35
|
+
circular.pop();
|
|
36
|
+
} else {
|
|
37
|
+
comparable[key] = Reflect.get(actual, key);
|
|
38
|
+
}
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
return comparable;
|