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

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