| # SMOB ๐งช |
| |
| [](https://badge.fury.io/js/smob) |
| [](https://github.com/tada5hi/smob/actions/workflows/main.yml) |
| [](https://codecov.io/gh/tada5hi/smob) |
| [](https://snyk.io/test/github/Tada5hi/smob?targetFile=package.json) |
| [](https://github.com/semantic-release/semantic-release) |
| |
| A zero dependency library to **s**afe **m**erge **ob**jects and arrays with customizable behavior. |
| |
| **Table of Contents** |
| |
| - [Installation](#installation) |
| - [Usage](#usage) |
| - [Merger](#merger) |
| - [Utils](#utils) |
| - [License](#license) |
| |
| ## Installation |
| |
| ```bash |
| npm install smob --save |
| ``` |
| |
| ## Usage |
| |
| ```typescript |
| import { merge } from "smob"; |
| |
| const output = merge(...sources); |
| ``` |
| |
| The following merge options are set by default: |
| - **array**: `true` Merge object array properties. |
| - **arrayDistinct**: `false` Remove duplicates, when merging array elements. |
| - **arrayPriority**: `left` (options.priority) The source aka leftmost array has by **default** the highest priority. |
| - **clone**: `false` Deep clone input sources. |
| - **inPlace**: `false` Merge sources in place. |
| - **priority**: `left` The source aka leftmost object has by **default** the highest priority. |
| |
| The merge behaviour can be changed by creating a custom [merger](#merger). |
| |
| **Arguments** |
| - sources `(any[] | Record<string, any>)[]`: The source arrays/objects. |
| |
| ```typescript |
| import { merge } from 'smob'; |
| |
| merge({ a: 1 }, { b: 2 }, { c: 3 }); |
| // { a: 1, b: 2, c: 3 } |
| |
| merge(['foo'], ['bar']); |
| // ['foo', 'bar'] |
| |
| ``` |
| |
| ### Merger |
| |
| A custom merger can simply be created by using the `createMerger` method. |
| |
| **Array** |
| ```typescript |
| import { createMerger } from 'smob'; |
| |
| const merge = createMerger({ array: false }); |
| |
| merge({ a: [1,2,3] }, { a: [4,5,6] }); |
| // { a: [1,2,3] } |
| ``` |
| |
| **ArrayDistinct** |
| ```typescript |
| import { createMerger } from 'smob'; |
| |
| const merge = createMerger({ arrayDistinct: true }); |
| |
| merge({ a: [1,2,3] }, { a: [3,4,5] }); |
| // { a: [1,2,3,4,5] } |
| ``` |
| |
| **Priority** |
| ```typescript |
| import { createMerger } from 'smob'; |
| |
| const merge = createMerger({ priority: 'right' }); |
| |
| merge({ a: 1 }, { a: 2 }, { a: 3 }) |
| // { a: 3 } |
| ``` |
| |
| **Strategy** |
| ```typescript |
| import { createMerger } from 'smob'; |
| |
| const merge = createMerger({ |
| strategy: (target, key, value) => { |
| if ( |
| typeof target[key] === 'number' && |
| typeof value === 'number' |
| ) { |
| target[key] += value; |
| return target; |
| } |
| } |
| }); |
| |
| merge({ a: 1 }, { a: 2 }, { a: 3 }); |
| // { a: 6 } |
| ``` |
| |
| A returned value indicates that the strategy has been applied. |
| |
| ## Utils |
| |
| ### distinctArray |
| |
| ```typescript |
| import { distinctArray } from 'smob'; |
| |
| distnctArray(['foo', 'bar', 'foo']); |
| // ['foo', 'bar'] |
| ``` |
| |
| The function also removes non-primitive |
| elements that are identical by value or reference. |
| |
| **Objects** |
| ```typescript |
| import { distinctArray } from 'smob'; |
| |
| distinctArray([{ foo: 'bar' }, { foo: 'bar' }]); |
| // [{ foo: 'bar' }] |
| ``` |
| |
| **Arrays** |
| ```typescript |
| import { distinctArray } from 'smob'; |
| |
| distinctArray([['foo', 'bar'], ['foo', 'bar']]); |
| // [['foo', 'bar']] |
| ``` |
| |
| ### isEqual |
| |
| Checks if two (non-primitive) elements |
| are identical by value or reference. |
| |
| ````typescript |
| import { isEqual } from 'smob'; |
| |
| isEqual({foo: 'bar'}, {foo: 'bar'}); |
| // true |
| |
| isEqual(['foo', 'bar'], ['foo', 'bar']); |
| // true |
| ```` |
| |
| ## License |
| |
| Made with ๐ |
| |
| Published under [MIT License](./LICENSE). |