| /*! |
| * copy-descriptor <https://github.com/jonschlinkert/copy-descriptor> |
| * |
| * Copyright (c) 2015, Jon Schlinkert. |
| * Licensed under the MIT License. |
| */ |
| |
| 'use strict'; |
| |
| /** |
| * Copy a descriptor from one object to another. |
| * |
| * ```js |
| * function App() { |
| * this.cache = {}; |
| * } |
| * App.prototype.set = function(key, val) { |
| * this.cache[key] = val; |
| * return this; |
| * }; |
| * Object.defineProperty(App.prototype, 'count', { |
| * get: function() { |
| * return Object.keys(this.cache).length; |
| * } |
| * }); |
| * |
| * copy(App.prototype, 'count', 'len'); |
| * |
| * // create an instance |
| * var app = new App(); |
| * |
| * app.set('a', true); |
| * app.set('b', true); |
| * app.set('c', true); |
| * |
| * console.log(app.count); |
| * //=> 3 |
| * console.log(app.len); |
| * //=> 3 |
| * ``` |
| * @name copy |
| * @param {Object} `receiver` The target object |
| * @param {Object} `provider` The provider object |
| * @param {String} `from` The key to copy on provider. |
| * @param {String} `to` Optionally specify a new key name to use. |
| * @return {Object} |
| * @api public |
| */ |
| |
| module.exports = function copyDescriptor(receiver, provider, from, to) { |
| if (!isObject(provider) && typeof provider !== 'function') { |
| to = from; |
| from = provider; |
| provider = receiver; |
| } |
| if (!isObject(receiver) && typeof receiver !== 'function') { |
| throw new TypeError('expected the first argument to be an object'); |
| } |
| if (!isObject(provider) && typeof provider !== 'function') { |
| throw new TypeError('expected provider to be an object'); |
| } |
| |
| if (typeof to !== 'string') { |
| to = from; |
| } |
| if (typeof from !== 'string') { |
| throw new TypeError('expected key to be a string'); |
| } |
| |
| if (!(from in provider)) { |
| throw new Error('property "' + from + '" does not exist'); |
| } |
| |
| var val = Object.getOwnPropertyDescriptor(provider, from); |
| if (val) Object.defineProperty(receiver, to, val); |
| }; |
| |
| function isObject(val) { |
| return {}.toString.call(val) === '[object Object]'; |
| } |
| |