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.
		
		
		
		
		
			
		
			
				
					
					
						
							81 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							81 lines
						
					
					
						
							1.9 KiB
						
					
					
				/*! | 
						|
 * 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]'; | 
						|
} | 
						|
 | 
						|
 |