You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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