# babel-merge `babel-merge` merges multiple Babel configuration objects into a single copy. Plugin and preset objects and arrays will be merged together. [![NPM version][npm-image]][npm-url] [![NPM downloads][npm-downloads]][npm-url] _Note: **options** to plugins and presets **will not be merged**, but instead replaced by the last matching item's options. This makes the behavior consistent with how Babel works._ ## Requirements - Node.js v6.10+ - Yarn or npm client ## Installation `babel-merge` can be installed via the Yarn or npm clients. #### Yarn ```bash ❯ yarn add babel-merge ``` #### npm ```bash ❯ npm install --save babel-merge ``` ## Usage * __merge(a, b, _options_)__ * __merge.all([a, b, ..., z], _options_)__ Where `a`, `b`, `z` are [Babel configuration objects](https://babeljs.io/docs/usage/api/#options) and `options` is a [deepmerge](https://github.com/KyleAMathews/deepmerge#api) options object. ```js const merge = require('babel-merge'); const together = merge( { presets: [ ['@babel/preset-env', { targets: { browsers: ['latest 1 Chrome'] } }] ] }, { presets: [ ['@babel/preset-env', { targets: { browsers: ['latest 1 Firefox'] } }] ] } ) console.log(together); { presets: [ ['@babel/preset-env', { targets: { browsers: [ 'latest 1 Firefox' ] } }] ] } ``` If a pathname was used in an earlier merge, you can still merge by exact name: ```js const merge = require('babel-merge'); const together = merge( { presets: [ [require.resolve('@babel/preset-env'), { targets: { browsers: ['latest 1 Chrome'] } }] ] }, { presets: [ ['@babel/preset-env', { targets: { browsers: ['latest 1 Firefox'] } }] ] } ) console.log(together); { presets: [ ['/Users/me/code/app/node_modules/@babel/preset-env/lib/index.js', { targets: { browsers: [ 'latest 1 Firefox' ] } }] ] } ``` Even works for plugins and presets within environments: ```js const merge = require('babel-merge'); const together = merge( { env: { development: { presets: [ [require.resolve('@babel/preset-env'), { targets: { browsers: ['latest 1 Chrome'] } }] ] } } }, { env: { development: { presets: [ ['@babel/preset-env', { targets: { browsers: ['latest 1 Firefox'] } }] ] } } } ) console.log(together); { env: { development: { presets: [ ['/Users/me/code/app/node_modules/@babel/preset-env/lib/index.js', { targets: { browsers: [ 'latest 1 Firefox' ] } }] ] } } } ``` Order is preserved between non-option plugins and presets and ones with options: ```js const merge = require('babel-merge'); const together = merge( { plugins: [ 'module:fast-async', '@babel/plugin-syntax-dynamic-import' ] }, { plugins: [ '@babel/plugin-proposal-object-rest-spread', ['module:fast-async', { spec: true }], '@babel/plugin-proposal-class-properties' ] } ) console.log(together); { plugins: [ ['module:fast-async', { spec: true }], '@babel/plugin-syntax-dynamic-import', '@babel/plugin-proposal-object-rest-spread', '@babel/plugin-proposal-class-properties' ] } ``` [npm-image]: https://img.shields.io/npm/v/babel-merge.svg [npm-downloads]: https://img.shields.io/npm/dt/babel-merge.svg [npm-url]: https://npmjs.org/package/babel-merge