pax_global_header00006660000000000000000000000064131237214010014504gustar00rootroot0000000000000052 comment=45c79022e7b56e2f6456cac9ff44d6876fc7738b object-copy-1.0.0/000077500000000000000000000000001312372140100137205ustar00rootroot00000000000000object-copy-1.0.0/.editorconfig000066400000000000000000000004051312372140100163740ustar00rootroot00000000000000root = true [*] indent_style = space end_of_line = lf charset = utf-8 indent_size = 2 trim_trailing_whitespace = true insert_final_newline = true [{**/{actual,fixtures,expected,templates}/**,*.md}] trim_trailing_whitespace = false insert_final_newline = falseobject-copy-1.0.0/.eslintrc.json000066400000000000000000000067751312372140100165330ustar00rootroot00000000000000{ "env": { "browser": false, "es6": true, "node": true, "mocha": true }, "globals": { "document": false, "navigator": false, "window": false }, "rules": { "accessor-pairs": 2, "arrow-spacing": [2, { "before": true, "after": true }], "block-spacing": [2, "always"], "brace-style": [2, "1tbs", { "allowSingleLine": true }], "comma-dangle": [2, "never"], "comma-spacing": [2, { "before": false, "after": true }], "comma-style": [2, "last"], "constructor-super": 2, "curly": [2, "multi-line"], "dot-location": [2, "property"], "eol-last": 2, "eqeqeq": [2, "allow-null"], "generator-star-spacing": [2, { "before": true, "after": true }], "handle-callback-err": [2, "^(err|error)$" ], "indent": [2, 2, { "SwitchCase": 1 }], "key-spacing": [2, { "beforeColon": false, "afterColon": true }], "keyword-spacing": [2, { "before": true, "after": true }], "new-cap": [2, { "newIsCap": true, "capIsNew": false }], "new-parens": 2, "no-array-constructor": 2, "no-caller": 2, "no-class-assign": 2, "no-cond-assign": 2, "no-const-assign": 2, "no-control-regex": 2, "no-debugger": 2, "no-delete-var": 2, "no-dupe-args": 2, "no-dupe-class-members": 2, "no-dupe-keys": 2, "no-duplicate-case": 2, "no-empty-character-class": 2, "no-eval": 2, "no-ex-assign": 2, "no-extend-native": 2, "no-extra-bind": 2, "no-extra-boolean-cast": 2, "no-extra-parens": [2, "functions"], "no-fallthrough": 2, "no-floating-decimal": 2, "no-func-assign": 2, "no-implied-eval": 2, "no-inner-declarations": [2, "functions"], "no-invalid-regexp": 2, "no-irregular-whitespace": 2, "no-iterator": 2, "no-label-var": 2, "no-labels": 2, "no-lone-blocks": 2, "no-mixed-spaces-and-tabs": 2, "no-multi-spaces": 2, "no-multi-str": 2, "no-multiple-empty-lines": [2, { "max": 1 }], "no-native-reassign": 0, "no-negated-in-lhs": 2, "no-new": 2, "no-new-func": 2, "no-new-object": 2, "no-new-require": 2, "no-new-wrappers": 2, "no-obj-calls": 2, "no-octal": 2, "no-octal-escape": 2, "no-proto": 0, "no-redeclare": 2, "no-regex-spaces": 2, "no-return-assign": 2, "no-self-compare": 2, "no-sequences": 2, "no-shadow-restricted-names": 2, "no-spaced-func": 2, "no-sparse-arrays": 2, "no-this-before-super": 2, "no-throw-literal": 2, "no-trailing-spaces": 0, "no-undef": 2, "no-undef-init": 2, "no-unexpected-multiline": 2, "no-unneeded-ternary": [2, { "defaultAssignment": false }], "no-unreachable": 2, "no-unused-vars": [2, { "vars": "all", "args": "none" }], "no-useless-call": 0, "no-with": 2, "one-var": [0, { "initialized": "never" }], "operator-linebreak": [0, "after", { "overrides": { "?": "before", ":": "before" } }], "padded-blocks": [0, "never"], "quotes": [2, "single", "avoid-escape"], "radix": 2, "semi": [2, "always"], "semi-spacing": [2, { "before": false, "after": true }], "space-before-blocks": [2, "always"], "space-before-function-paren": [2, "never"], "space-in-parens": [2, "never"], "space-infix-ops": 2, "space-unary-ops": [2, { "words": true, "nonwords": false }], "spaced-comment": [0, "always", { "markers": ["global", "globals", "eslint", "eslint-disable", "*package", "!", ","] }], "use-isnan": 2, "valid-typeof": 2, "wrap-iife": [2, "any"], "yoda": [2, "never"] } } object-copy-1.0.0/.gitattributes000066400000000000000000000002001312372140100166030ustar00rootroot00000000000000# Enforce Unix newlines * text eol=lf # binaries *.ai binary *.psd binary *.jpg binary *.gif binary *.png binary *.jpeg binary object-copy-1.0.0/.gitignore000066400000000000000000000004401312372140100157060ustar00rootroot00000000000000# always ignore files *.DS_Store *.sublime-* # test related, or directories generated by tests test/actual actual coverage .nyc* # npm node_modules npm-debug.log # yarn yarn.lock yarn-error.log # misc _gh_pages _draft _drafts bower_components vendor temp tmp TODO.md package-lock.jsonobject-copy-1.0.0/.travis.yml000066400000000000000000000002041312372140100160250ustar00rootroot00000000000000sudo: false os: - linux - osx language: node_js node_js: - node - '8' - '7' - '6' - '5' - '4' - '0.12' - '0.10' object-copy-1.0.0/.verb.md000066400000000000000000000001321312372140100152520ustar00rootroot00000000000000## Usage ```js var copy = require('{%= name %}'); ``` ## API {%= apidocs("index.js") %} object-copy-1.0.0/LICENSE000066400000000000000000000020771312372140100147330ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016-2017, Jon Schlinkert Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. object-copy-1.0.0/README.md000066400000000000000000000063151312372140100152040ustar00rootroot00000000000000# object-copy [![NPM version](https://img.shields.io/npm/v/object-copy.svg?style=flat)](https://www.npmjs.com/package/object-copy) [![NPM monthly downloads](https://img.shields.io/npm/dm/object-copy.svg?style=flat)](https://npmjs.org/package/object-copy) [![NPM total downloads](https://img.shields.io/npm/dt/object-copy.svg?style=flat)](https://npmjs.org/package/object-copy) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/object-copy.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/object-copy) > Copy static properties, prototype properties, and descriptors from one object to another. ## Install Install with [npm](https://www.npmjs.com/): ```sh $ npm install --save object-copy ``` ## Usage ```js var copy = require('object-copy'); ``` ## API ### [copy](index.js#L32) Copy static properties, prototype properties, and descriptors from one object to another. **Params** * `receiver` **{Object}** * `provider` **{Object}** * `omit` **{String|Array}**: (optional) One or more properties to omit * `filter` **{Function}**: (optional) Called on each key before copying the property. If the function returns false, the property will not be copied. * `returns` **{Object}** **Example** ```js function App() {} var proto = App.prototype; App.prototype.set = function() {}; App.prototype.get = function() {}; var obj = {}; copy(obj, proto); // filter out keys copy(obj, proto, function(key) { return key !== 'index'; }); ``` ## About ### Related projects * [copy-descriptor](https://www.npmjs.com/package/copy-descriptor): Copy a descriptor from object A to object B | [homepage](https://github.com/jonschlinkert/copy-descriptor "Copy a descriptor from object A to object B") * [define-property](https://www.npmjs.com/package/define-property): Define a non-enumerable property on an object. | [homepage](https://github.com/jonschlinkert/define-property "Define a non-enumerable property on an object.") * [kind-of](https://www.npmjs.com/package/kind-of): Get the native type of a value. | [homepage](https://github.com/jonschlinkert/kind-of "Get the native type of a value.") ### Contributing Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). ### Building docs _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ To generate the readme, run the following command: ```sh $ npm install -g verbose/verb#dev verb-generate-readme && verb ``` ### Running tests Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: ```sh $ npm install && npm test ``` ### Author **Jon Schlinkert** * [github/jonschlinkert](https://github.com/jonschlinkert) * [twitter/jonschlinkert](https://twitter.com/jonschlinkert) ### License Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). Released under the [MIT License](LICENSE). *** _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 25, 2017._object-copy-1.0.0/fixtures/000077500000000000000000000000001312372140100155715ustar00rootroot00000000000000object-copy-1.0.0/fixtures/app.js000066400000000000000000000006441312372140100167130ustar00rootroot00000000000000function App(options) { this.options = options || {}; } App.prototype.set = function(key, value) { this[key] = value; return this; }; App.prototype.get = function(key) { return this[key]; }; App.prototype.del = function(key) { delete this[key]; }; Object.defineProperty(App.prototype, 'count', { get: function () { return Object.keys(this).length; }, set: function () { } }); module.exports = App;object-copy-1.0.0/index.js000066400000000000000000000073711312372140100153750ustar00rootroot00000000000000'use strict'; var typeOf = require('kind-of'); var copyDescriptor = require('copy-descriptor'); var define = require('define-property'); /** * Copy static properties, prototype properties, and descriptors from one object to another. * * ```js * function App() {} * var proto = App.prototype; * App.prototype.set = function() {}; * App.prototype.get = function() {}; * * var obj = {}; * copy(obj, proto); * * // filter out keys * copy(obj, proto, function(key) { * return key !== 'index'; * }); * ``` * @param {Object} `receiver` * @param {Object} `provider` * @param {String|Array} `omit` (optional) One or more properties to omit * @param {Function} `filter` (optional) Called on each key before copying the property. If the function returns false, the property will not be copied. * @return {Object} * @api public */ function copy(receiver, provider, omit, fn) { if (!isObject(receiver)) { throw new TypeError('expected receiving object to be an object.'); } if (!isObject(provider)) { throw new TypeError('expected providing object to be an object.'); } if (typeof omit === 'function') { fn = omit; omit = []; } var props = nativeKeys(provider); var keys = Object.keys(provider); var len = props.length; omit = arrayify(omit); while (len--) { var key = props[len]; if (typeof fn === 'function' && fn(key) === false) { continue; } if (has(keys, key)) { define(receiver, key, provider[key]); } else if (!(key in receiver) && !has(omit, key)) { copyDescriptor(receiver, provider, key); } } }; /** * Return true if the given value is an object or function */ function isObject(val) { return typeOf(val) === 'object' || typeof val === 'function'; } /** * Returns true if an array has any of the given elements, or an * object has any of the given keys. * * ```js * has(['a', 'b', 'c'], 'c'); * //=> true * * has(['a', 'b', 'c'], ['c', 'z']); * //=> true * * has({a: 'b', c: 'd'}, ['c', 'z']); * //=> true * ``` * @param {Object} `obj` * @param {String|Array} `val` * @return {Boolean} */ function has(obj, val) { val = arrayify(val); var len = val.length; if (isObject(obj)) { for (var key in obj) { if (val.indexOf(key) > -1) { return true; } } var keys = nativeKeys(obj); return has(keys, val); } if (Array.isArray(obj)) { var arr = obj; while (len--) { if (arr.indexOf(val[len]) > -1) { return true; } } return false; } throw new TypeError('expected an array or object.'); } /** * Cast the given value to an array. * * ```js * arrayify('foo'); * //=> ['foo'] * * arrayify(['foo']); * //=> ['foo'] * ``` * * @param {String|Array} `val` * @return {Array} */ function arrayify(val) { return val ? (Array.isArray(val) ? val : [val]) : []; } /** * Returns true if a value has a `contructor` * * ```js * hasConstructor({}); * //=> true * * hasConstructor(Object.create(null)); * //=> false * ``` * @param {Object} `value` * @return {Boolean} */ function hasConstructor(val) { return isObject(val) && typeof val.constructor !== 'undefined'; } /** * Get the native `ownPropertyNames` from the constructor of the * given `object`. An empty array is returned if the object does * not have a constructor. * * ```js * nativeKeys({a: 'b', b: 'c', c: 'd'}) * //=> ['a', 'b', 'c'] * * nativeKeys(function(){}) * //=> ['length', 'caller'] * ``` * * @param {Object} `obj` Object that has a `constructor`. * @return {Array} Array of keys. */ function nativeKeys(val) { if (!hasConstructor(val)) return []; return Object.getOwnPropertyNames(val); } /** * Expose `copy` */ module.exports = copy; /** * Expose `copy.has` for tests */ module.exports.has = has; object-copy-1.0.0/package.json000066400000000000000000000020461312372140100162100ustar00rootroot00000000000000{ "name": "object-copy", "description": "Copy static properties, prototype properties, and descriptors from one object to another.", "version": "1.0.0", "homepage": "https://github.com/jonschlinkert/object-copy", "author": "Jon Schlinkert (https://github.com/jonschlinkert)", "repository": "jonschlinkert/object-copy", "bugs": { "url": "https://github.com/jonschlinkert/object-copy/issues" }, "license": "MIT", "files": [ "index.js" ], "main": "index.js", "engines": { "node": ">=0.10.0" }, "scripts": { "test": "mocha" }, "dependencies": { "copy-descriptor": "^0.1.1", "define-property": "^1.0.0", "kind-of": "^5.0.0" }, "devDependencies": { "gulp-format-md": "^0.1.12", "mocha": "^3.4.2" }, "keywords": [ "copy", "object" ], "verb": { "layout": "default", "plugins": [ "gulp-format-md" ], "related": { "list": [ "copy-descriptor", "define-property", "kind-of" ] }, "reflinks": [ "verb" ] } } object-copy-1.0.0/test.js000066400000000000000000000023431312372140100152370ustar00rootroot00000000000000'use strict'; require('mocha'); var assert = require('assert'); var App = require('./fixtures/app'); var copy = require('./'); describe('object-copy', function() { it('should export a function', function() { assert.equal(typeof copy, 'function'); }); it('should copy a descriptor from the provider to receiver:', function() { var proto = App.prototype; var obj = {}; copy(obj, proto, 'count'); assert(!('count' in obj)); assert('get' in obj); assert('set' in obj); }); it('should do nothing when the descriptor does not exist:', function() { var proto = App.prototype; var obj = {}; copy(obj, proto, 'foo'); assert.deepEqual(obj, {}); }); it('should throw an error when receiver is not an object:', function(cb) { try { copy('foo'); cb(new Error('expected an error')); } catch (err) { assert.equal(err.message, 'expected receiving object to be an object.'); cb(); } }); it('should throw an error when provider is not an object:', function(cb) { try { copy({}, 'foo'); cb(new Error('expected an error')); } catch (err) { assert.equal(err.message, 'expected providing object to be an object.'); cb(); } }); });