239 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| <p align="center">
 | |
|   <a href="http://gulpjs.com">
 | |
|     <img height="257" width="114" src="https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png">
 | |
|   </a>
 | |
| </p>
 | |
| 
 | |
| # copy-props
 | |
| 
 | |
| [![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Coveralls Status][coveralls-image]][coveralls-url]
 | |
| 
 | |
| Copy properties between two objects deeply.
 | |
| 
 | |
| ## Install
 | |
| 
 | |
| To install from npm:
 | |
| 
 | |
| ```sh
 | |
| $ npm i copy-props --save
 | |
| ```
 | |
| 
 | |
| ## Usage
 | |
| 
 | |
| Copy _src_ to _dst_ simply (and return _dst_) :
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc' };
 | |
| var dst = { a: 2, b: { b1: 'xxx', b2: 'yyy' } };
 | |
| 
 | |
| copyProps(src, dst);
 | |
| // => { a: 1, b: { b1: 'bbb', b2: 'yyy' }, c: 'ccc' }
 | |
| ```
 | |
| 
 | |
| Copy _src_ to _dst_ with property mapping (and return _dst_) :
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc', d: 'ddd' };
 | |
| var dst = { f: { a: 2, b1: 'xxx', b2: 'yyy' }, e: 'zzz' };
 | |
| 
 | |
| copyProps(src, dst, {
 | |
|   a: 'f.a',
 | |
|   'b.b1': 'f.b1',
 | |
|   'b.b2': 'f.b2',
 | |
|   c: 'f.c',
 | |
| });
 | |
| // => { f: { a: 1, b1: 'bbb', b2: 'yyy', c: 'ccc' }, e: 'zzz' }
 | |
| ```
 | |
| 
 | |
| Copy _src_ to _dst_ with convert function (and return _dst_) :
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: { b1: 'bbb' } };
 | |
| var dst = { a: 0 };
 | |
| 
 | |
| copyProps(src, dst, function (srcInfo) {
 | |
|   if (srcInfo.keyChain === 'a') {
 | |
|     return srcInfo.value * 2;
 | |
|   }
 | |
|   if (srcInfo.keyChain === 'b.b1') {
 | |
|     return srcInfo.value.toUpperCase();
 | |
|   }
 | |
| });
 | |
| // => { a: 2, b: { b1: 'BBB' } }
 | |
| ```
 | |
| 
 | |
| Can use an array instead of a map as property mapping :
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: { c: 'CCC' }, d: { e: 'EEE' } };
 | |
| var dst = { a: 9, b: { c: 'xxx' }, d: { e: 'yyy' } };
 | |
| var fromto = ['b.c', 'd.e'];
 | |
| copyProps(src, dst, fromto);
 | |
| // => { a: 9, b: { c: 'CCC' }, d: { e: 'EEE' } }
 | |
| ```
 | |
| 
 | |
| Can copy reversively (from _dst_ to _src_) by reverse flag (and return _src_):
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc' };
 | |
| var dst = { a: 2, b: { b1: 'xxx', b2: 'yyy' } };
 | |
| 
 | |
| copyProps(src, dst, true);
 | |
| // => { a: 2, b: { b1: 'xxx', b2: 'yyy' }, c: 'ccc' }
 | |
| ```
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: { b1: 'bbb' }, c: 'ccc', d: 'ddd' };
 | |
| var dst = { f: { a: 2, b1: 'xxx', b2: 'yyy' }, e: 'zzz' };
 | |
| 
 | |
| copyProps(
 | |
|   src,
 | |
|   dst,
 | |
|   {
 | |
|     a: 'f.a',
 | |
|     'b.b2': 'f.b2',
 | |
|     c: 'f.c',
 | |
|   },
 | |
|   true
 | |
| );
 | |
| // => { a: 2, b: { b1: 'bbb', b2: 'yyy' }, c: 'ccc', d: 'ddd' }
 | |
| ```
 | |
| 
 | |
| If a value of source property is undefined (when not using converter), or a result of converter is undefined (when using converter), the value is not copied.
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 'A', b: undefined, c: null, d: 1 };
 | |
| var dst = { a: 'a', b: 'b', c: 'c' };
 | |
| 
 | |
| copyProps(src, dst, function (srcInfo) {
 | |
|   if (srcInfo.keyChain === 'd') {
 | |
|     return undefined;
 | |
|   } else {
 | |
|     return srcInfo.value;
 | |
|   }
 | |
| });
 | |
| // => { a: 'A', b: 'b', c: null }
 | |
| ```
 | |
| 
 | |
| You can operate the parent node object directly in converter.
 | |
| 
 | |
| ```js
 | |
| const copyProps = require('copy-props');
 | |
| 
 | |
| var src = { a: 1, b: 2 };
 | |
| var dst = {};
 | |
| 
 | |
| copyProps(src, dst, function (srcInfo, dstInfo) {
 | |
|   Object.defineProperty(dstInfo.parent, dstInfo.key, {
 | |
|     writable: false,
 | |
|     enumerable: true,
 | |
|     configurable: false,
 | |
|     value: srcInfo.value * 2,
 | |
|   });
 | |
| }); // => { a: 2, b: 4 }
 | |
| 
 | |
| dst; // => { a: 2, b: 4 }
 | |
| dst.a = 9;
 | |
| dst; // -> { a: 2, b: 4 }
 | |
| ```
 | |
| 
 | |
| ## API
 | |
| 
 | |
| ### <u>copyProps(src, dst [, fromto] [, converter] [, reverse]) => object</u>
 | |
| 
 | |
| Copy properties of _src_ to _dst_ deeply.
 | |
| If _fromto_ is given, it is able to copy between different properties.
 | |
| If _converter_ is given, it is able to convert the terminal values.
 | |
| 
 | |
| #### Parameters:
 | |
| 
 | |
| | Parameter   |        Type         | Description                                                                                                                                                         |
 | |
| | :---------- | :-----------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
 | |
| | _src_       |       object        | A source object of copy.                                                                                                                                            |
 | |
| | _dst_       |       object        | A destinate object of copy.                                                                                                                                         |
 | |
| | _fromto_    | object | array | An object mapping properties between _src_ and _dst_. (Optional)                                                                                                    |
 | |
| | _converter_ |      function       | A function to convert terminal values in _src_. (Optional)                                                                                                          |
 | |
| | _reverse_   |       boolean       | True, if copying reversively from dst to src and returns src object. `fromto` is also reversively used from value to key. This default value is `false`. (Optional) |
 | |
| 
 | |
| #### Returns:
 | |
| 
 | |
| _dst_ object after copying.
 | |
| 
 | |
| **Type:** object
 | |
| 
 | |
| - **Format of <i>fromto</i>**
 | |
| 
 | |
|   _fromto_ is a non-nested key-value object. And the *key*s are property key chains of _src_ and the *value*s are property key chains of _dst_.
 | |
|   The key chain is a string which is concatenated property keys on each level with dots, like `'aaa.bbb.ccc'`.
 | |
| 
 | |
|   The following example copys the value of `src.aaa.bbb.ccc` to `dst.xxx.yyy`.
 | |
| 
 | |
|   ```js
 | |
|   copyProps(src, dst, {
 | |
|     'aaa.bbb.ccc': 'xxx.yyy',
 | |
|   });
 | |
|   ```
 | |
| 
 | |
|   _fromto_ can be an array. In that case, the array works as a map which has pairs of same key and value.
 | |
| 
 | |
| - **API of <i>converter</i>**
 | |
| 
 | |
|   **<u>converter(srcInfo, dstInfo) : Any</u>**
 | |
| 
 | |
|   _converter_ is a function to convert terminal values of propeerties of _src_.
 | |
| 
 | |
|   **Parameters:**
 | |
| 
 | |
|   | Parameter |  Type  | Description                                                       |
 | |
|   | :-------- | :----: | :---------------------------------------------------------------- |
 | |
|   | _srcInfo_ | object | An object which has informations about the current node of _src_. |
 | |
|   | _dstInfo_ | object | An object which has informations about the current node of _dst_. |
 | |
| 
 | |
|   **Return:**
 | |
| 
 | |
|   The converted value to be set as a destination property value. If this value is undefined, the destination property is not set to the destination node object.
 | |
| 
 | |
|   **Type:** _Any_
 | |
| 
 | |
|   - **Properties of <i>srcInfo</i> and <i>dstInfo</i>**
 | |
| 
 | |
|     _srcInfo_ and _dstInfo_ has same properties, as follows:
 | |
| 
 | |
|     | Property   |  Type  | Description                                             |
 | |
|     | :--------- | :----: | :------------------------------------------------------ |
 | |
|     | _value_    | _Any_  | The value of the current node.                          |
 | |
|     | _key_      | string | The key name of the current node.                       |
 | |
|     | _keyChain_ | string | The full key of the current node concatenated with dot. |
 | |
|     | _depth_    | number | The depth of the current node.                          |
 | |
|     | _parent_   | object | The parent node of the current node.                    |
 | |
| 
 | |
| ## License
 | |
| 
 | |
| MIT
 | |
| 
 | |
| <!-- prettier-ignore-start -->
 | |
| [downloads-image]: https://img.shields.io/npm/dm/copy-props.svg?style=flat-square
 | |
| [npm-url]: https://www.npmjs.org/package/copy-props
 | |
| [npm-image]: https://img.shields.io/npm/v/copy-props.svg?style=flat-square
 | |
| 
 | |
| [ci-url]: https://github.com/gulpjs/copy-props/actions?query=workflow:dev
 | |
| [ci-image]: https://img.shields.io/github/workflow/status/gulpjs/copy-props/dev?style=flat-square
 | |
| 
 | |
| [coveralls-url]: https://coveralls.io/r/gulpjs/copy-props
 | |
| [coveralls-image]: https://img.shields.io/coveralls/gulpjs/copy-props/master.svg
 | |
| <!-- prettier-ignore-end -->
 |