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.
@@ -1,32 +1,41 @@
1
- const isObject = selector => Reflect.getPrototypeOf(selector) === Object.prototype;
1
+ const isPrimitive = value => value === null || typeof value !== 'object';
2
2
 
3
3
  export function isLikeSelector(selector) {
4
- if (selector === null || typeof selector !== 'object') {
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
- const keyCount = Reflect.ownKeys(selector).length;
9
- return (Array.isArray(selector) && keyCount > 1) || (isObject(selector) && keyCount > 0);
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(lhs, selector, circular = new Set()) {
15
- if (circular.has(selector)) {
16
- throw CIRCULAR_SELECTOR;
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
- for (const [key, rhs] of Object.entries(selector)) {
27
- comparable[key] = isLikeSelector(rhs)
28
- ? selectComparable(Reflect.get(lhs, key), rhs, circular)
29
- : Reflect.get(lhs, key);
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ava",
3
- "version": "5.3.0",
3
+ "version": "5.3.1",
4
4
  "description": "Node.js test runner that lets you develop with confidence.",
5
5
  "license": "MIT",
6
6
  "repository": "avajs/ava",