1 | /*!
|
---|
2 | * is-accessor-descriptor <https://github.com/jonschlinkert/is-accessor-descriptor>
|
---|
3 | *
|
---|
4 | * Copyright (c) 2015, Jon Schlinkert.
|
---|
5 | * Licensed under the MIT License.
|
---|
6 | */
|
---|
7 |
|
---|
8 | 'use strict';
|
---|
9 |
|
---|
10 | var typeOf = require('kind-of');
|
---|
11 |
|
---|
12 | // accessor descriptor properties
|
---|
13 | var accessor = {
|
---|
14 | get: 'function',
|
---|
15 | set: 'function',
|
---|
16 | configurable: 'boolean',
|
---|
17 | enumerable: 'boolean'
|
---|
18 | };
|
---|
19 |
|
---|
20 | function isAccessorDescriptor(obj, prop) {
|
---|
21 | if (typeof prop === 'string') {
|
---|
22 | var val = Object.getOwnPropertyDescriptor(obj, prop);
|
---|
23 | return typeof val !== 'undefined';
|
---|
24 | }
|
---|
25 |
|
---|
26 | if (typeOf(obj) !== 'object') {
|
---|
27 | return false;
|
---|
28 | }
|
---|
29 |
|
---|
30 | if (has(obj, 'value') || has(obj, 'writable')) {
|
---|
31 | return false;
|
---|
32 | }
|
---|
33 |
|
---|
34 | if (!has(obj, 'get') || typeof obj.get !== 'function') {
|
---|
35 | return false;
|
---|
36 | }
|
---|
37 |
|
---|
38 | // tldr: it's valid to have "set" be undefined
|
---|
39 | // "set" might be undefined if `Object.getOwnPropertyDescriptor`
|
---|
40 | // was used to get the value, and only `get` was defined by the user
|
---|
41 | if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') {
|
---|
42 | return false;
|
---|
43 | }
|
---|
44 |
|
---|
45 | for (var key in obj) {
|
---|
46 | if (!accessor.hasOwnProperty(key)) {
|
---|
47 | continue;
|
---|
48 | }
|
---|
49 |
|
---|
50 | if (typeOf(obj[key]) === accessor[key]) {
|
---|
51 | continue;
|
---|
52 | }
|
---|
53 |
|
---|
54 | if (typeof obj[key] !== 'undefined') {
|
---|
55 | return false;
|
---|
56 | }
|
---|
57 | }
|
---|
58 | return true;
|
---|
59 | }
|
---|
60 |
|
---|
61 | function has(obj, key) {
|
---|
62 | return {}.hasOwnProperty.call(obj, key);
|
---|
63 | }
|
---|
64 |
|
---|
65 | /**
|
---|
66 | * Expose `isAccessorDescriptor`
|
---|
67 | */
|
---|
68 |
|
---|
69 | module.exports = isAccessorDescriptor;
|
---|