You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					82 lines
				
				1.9 KiB
			
		
		
			
		
	
	
					82 lines
				
				1.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/*!
							 | 
						||
| 
								 | 
							
								 * 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]';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |