pax_global_header00006660000000000000000000000064127263301530014514gustar00rootroot0000000000000052 comment=15b972a4a7137f6bf47886c68e73a2fffa8eacf2 object-copy-0.1.0/000077500000000000000000000000001272633015300137305ustar00rootroot00000000000000object-copy-0.1.0/.editorconfig000066400000000000000000000006461272633015300164130ustar00rootroot00000000000000# http://editorconfig.org root = true [*] indent_style = space end_of_line = lf charset = utf-8 indent_size = 2 trim_trailing_whitespace = true insert_final_newline = true [*.md] trim_trailing_whitespace = false insert_final_newline = false [**/{actual,fixtures,expected}/**] trim_trailing_whitespace = false insert_final_newline = false [**/templates/**] trim_trailing_whitespace = false insert_final_newline = false object-copy-0.1.0/.eslintrc.json000066400000000000000000000071251272633015300165310ustar00rootroot00000000000000{ "ecmaFeatures": { "modules": true, "experimentalObjectRestSpread": true }, "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-0.1.0/.gitattributes000066400000000000000000000002001272633015300166130ustar00rootroot00000000000000# Enforce Unix newlines * text eol=lf # binaries *.ai binary *.psd binary *.jpg binary *.gif binary *.png binary *.jpeg binary object-copy-0.1.0/.gitignore000066400000000000000000000003431272633015300157200ustar00rootroot00000000000000# always ignore files *.DS_Store *.sublime-* # test related, or directories generated by tests test/actual actual coverage # npm node_modules npm-debug.log # misc _gh_pages benchmark bower_components vendor temp tmp TODO.md object-copy-0.1.0/.travis.yml000066400000000000000000000002471272633015300160440ustar00rootroot00000000000000sudo: false language: node_js node_js: - '5' - '4' - '0.12' - '0.10' matrix: fast_finish: true allow_failures: - node_js: '0.10' - node_js: '0.12' object-copy-0.1.0/.verb.md000066400000000000000000000001321272633015300152620ustar00rootroot00000000000000## Usage ```js var copy = require('{%= name %}'); ``` ## API {%= apidocs("index.js") %} object-copy-0.1.0/LICENSE000066400000000000000000000020731272633015300147370ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2016, 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-0.1.0/README.md000066400000000000000000000043311272633015300152100ustar00rootroot00000000000000# object-copy [![NPM version](https://img.shields.io/npm/v/object-copy.svg?style=flat)](https://www.npmjs.com/package/object-copy) [![NPM downloads](https://img.shields.io/npm/dm/object-copy.svg?style=flat)](https://npmjs.org/package/object-copy) [![Build Status](https://img.shields.io/travis/jonschlinkert/object-copy.svg?style=flat)](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 object-copy --save ``` ## Usage ```js var copy = require('object-copy'); ``` ## API ### [copy](index.js#L26) Copy static properties, prototype properties, and descriptors from one object to another. **Params** * `receiver` **{Object}** * `provider` **{Object}** * `omit` **{String|Array}**: One or more properties to omit * `returns` **{Object}** **Example** ```js function App() {} var proto = App.prototype; App.prototype.set = function() {}; App.prototype.get = function() {}; var obj = {}; copy(obj, proto); ``` ## Contributing This document was generated by [verb-readme-generator][] (a [verb](https://github.com/verbose/verb) generator), please don't edit directly. Any changes to the readme must be made in [.verb.md](.verb.md). See [Building Docs](#building-docs). Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). Or visit the [verb-readme-generator][] project to submit bug reports or pull requests for the readme layout template. ## Building docs Generate readme and API documentation with [verb](https://github.com/verbose/verb): ```sh $ npm install -g verb verb-readme-generator && verb ``` ## Running tests Install dev dependencies: ```sh $ npm install -d && npm test ``` ## Author **Jon Schlinkert** * [github/jonschlinkert](https://github.com/jonschlinkert) * [twitter/jonschlinkert](http://twitter.com/jonschlinkert) ## License Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). Released under the [MIT license](https://github.com/jonschlinkert/object-copy/blob/master/LICENSE). *** _This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on June 09, 2016._object-copy-0.1.0/fixtures/000077500000000000000000000000001272633015300156015ustar00rootroot00000000000000object-copy-0.1.0/fixtures/app.js000066400000000000000000000006441272633015300167230ustar00rootroot00000000000000function 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-0.1.0/index.js000066400000000000000000000065311272633015300154020ustar00rootroot00000000000000'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); * ``` * @param {Object} `receiver` * @param {Object} `provider` * @param {String|Array} `omit` One or more properties to omit * @return {Object} * @api public */ function copy(receiver, provider, omit) { 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.'); } var props = nativeKeys(provider); var keys = Object.keys(provider); var len = props.length; omit = arrayify(omit); while (len--) { var key = props[len]; 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 give 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-0.1.0/package.json000066400000000000000000000017141272633015300162210ustar00rootroot00000000000000{ "name": "object-copy", "description": "Copy static properties, prototype properties, and descriptors from one object to another.", "version": "0.1.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.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, "devDependencies": { "gulp-format-md": "*", "mocha": "*" }, "keywords": [ "copy", "object" ], "verb": { "layout": "default", "plugins": [ "gulp-format-md" ], "related": { "list": [] }, "reflinks": [ "verb" ] } } object-copy-0.1.0/test.js000066400000000000000000000023431272633015300152470ustar00rootroot00000000000000'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(); } }); });