UNPKG

1.16 kBJavaScriptView Raw
1'use strict';
2
3const isObject = val => val !== null && typeof val === 'object';
4const dataDesc = new Set(['configurable', 'enumerable', 'get', 'set']);
5const accDesc = new Set(['configurable', 'enumerable', 'writable', 'value']);
6
7module.exports = (obj, key, checkProto) => {
8 if (!isObject(obj)) return false;
9 let desc = key ? Object.getOwnPropertyDescriptor(obj, key) : obj;
10
11 if (!desc && key && checkProto !== false && obj.constructor) {
12 desc = Object.getOwnPropertyDescriptor(obj.constructor.prototype, key);
13 }
14
15 if (!isObject(desc)) return false;
16 if (typeof desc.configurable !== 'boolean' || typeof desc.enumerable !== 'boolean') {
17 return false;
18 }
19
20 let keys = Object.keys(desc);
21 if (isDataDesc(keys)) {
22 if (typeof desc.get !== 'function' && desc.get !== void 0) return false;
23 if (typeof desc.set !== 'function' && desc.set !== void 0) return false;
24 return true;
25 }
26
27 if (isAccessorDesc(keys)) {
28 return typeof desc.writable === 'boolean';
29 }
30 return false;
31};
32
33function isDataDesc(keys) {
34 return keys.every(k => dataDesc.has(k));
35}
36
37function isAccessorDesc(keys) {
38 return keys.every(k => accDesc.has(k));
39}