12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /*!
- * 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]';
- }
-
|