Skip to content

Commit de9a937

Browse files
authoredJul 24, 2022
Fix preserving object descriptors (#22)
1 parent 2c35cf8 commit de9a937

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed
 

‎index.js

+4-13
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,17 @@ export function includeKeys(object, predicate) {
55
const set = new Set(predicate);
66
for (const key of Object.keys(object)) {
77
if (set.has(key)) {
8-
const value = object[key];
9-
Object.defineProperty(result, key, {
10-
value,
11-
writable: true,
12-
enumerable: true,
13-
configurable: true,
14-
});
8+
const descriptor = Object.getOwnPropertyDescriptor(object, key);
9+
Object.defineProperty(result, key, descriptor);
1510
}
1611
}
1712
} else {
1813
// `for ... of Object.keys()` is faster than `for ... of Object.entries()`.
1914
for (const key of Object.keys(object)) {
2015
const value = object[key];
2116
if (predicate(key, value, object)) {
22-
Object.defineProperty(result, key, {
23-
value,
24-
writable: true,
25-
enumerable: true,
26-
configurable: true,
27-
});
17+
const descriptor = Object.getOwnPropertyDescriptor(object, key);
18+
Object.defineProperty(result, key, descriptor);
2819
}
2920
}
3021
}

‎test.js

+14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ test('includeKeys: non-enumerable properties are omitted', t => {
3333
t.is(includeKeys(input, () => true).test, undefined);
3434
});
3535

36+
test('includeKeys: descriptors are kept as is', t => {
37+
const descriptor = {get() {}, set() {}, enumerable: true, configurable: false};
38+
const input = Object.defineProperty({}, 'test', descriptor);
39+
t.deepEqual(Object.getOwnPropertyDescriptor(includeKeys(input, () => true), 'test'), descriptor);
40+
t.deepEqual(Object.getOwnPropertyDescriptor(includeKeys(input, ['test']), 'test'), descriptor);
41+
});
42+
3643
test('includeKeys: inherited properties are omitted', t => {
3744
const Parent = class {
3845
test() {}
@@ -79,6 +86,13 @@ test('excludeKeys: non-enumerable properties are omitted', t => {
7986
t.is(excludeKeys(input, () => false).test, undefined);
8087
});
8188

89+
test('excludeKeys: descriptors are kept as is', t => {
90+
const descriptor = {get() {}, set() {}, enumerable: true, configurable: false};
91+
const input = Object.defineProperty({}, 'test', descriptor);
92+
t.deepEqual(Object.getOwnPropertyDescriptor(excludeKeys(input, () => false), 'test'), descriptor);
93+
t.deepEqual(Object.getOwnPropertyDescriptor(excludeKeys(input, []), 'test'), descriptor);
94+
});
95+
8296
test('excludeKeys: inherited properties are omitted', t => {
8397
const Parent = class {
8498
test() {}

0 commit comments

Comments
 (0)
Please sign in to comment.