# @armit/babel-merge

> `@armit/babel-merge` merges multiple Babel configuration objects into a single copy. Plugin and preset objects and arrays will be merged together.

Latest version **0.3.0** (published 2025-06-01) · MIT license · 0 weekly downloads

## Install

```sh
npm install @armit/babel-merge
pnpm add @armit/babel-merge
yarn add @armit/babel-merge
bun add @armit/babel-merge
```

## Health

**Score 40/100 (D)** — status: maintenance-mode.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: stale; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.3.0 |
| Published | 2025-06-01 |
| First published | 2024-02-23 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM |
| Node | >=18.0.0 |
| Dependencies | 2 |
| Unpacked size | 19.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Yingchun Tian |
| Maintainers | tianyingchun, hyperse.net |

## Links

- npm: https://www.npmjs.com/package/@armit/babel-merge
- Repository: https://github.com/armitjs/armit
- Issues: https://github.com/armitjs/armit/issues
- npm.io page: https://npm.io/package/@armit/babel-merge

## Dependencies (2)

- [deepmerge](https://npm.io/package/deepmerge.md) ^4.3.1
- [object.omit](https://npm.io/package/object.omit.md) ^3.0.0

## Recent versions

- 0.3.0 (latest) — 2025-06-01
- 0.2.11 — 2025-03-31
- 0.2.10 — 2025-03-11
- 0.2.9 — 2025-02-10
- 0.2.8 — 2024-12-24
- 0.2.7 — 2024-11-21
- 0.2.6 — 2024-10-13
- 0.2.5 — 2024-09-06
- 0.2.4 — 2024-07-24
- 0.2.3 — 2024-07-15
- 0.2.2 — 2024-06-20
- 0.2.1 — 2024-06-13
- 0.2.0 — 2024-06-12
- 0.1.6 — 2024-05-13
- 0.1.5 — 2024-04-02
- … 1 more at https://npm.io/package/@armit/babel-merge/versions

## README

# @armit/babel-merge

`@armit/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 v18+
- Yarn or npm client

## Installation

`@armit/babel-merge` can be installed via the Yarn or npm clients.

#### Yarn

```bash
❯ yarn add @armit/babel-merge
```

#### npm

```bash
❯ npm install --save @armit/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
import { babelMerge } from '@armit/babel-merge';

const together = babelMerge(
  {
    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
import { babelMerge } from '@armit/babel-merge';

const together = babelMerge(
  {
    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
import { babelMerge } from '@armit/babel-merge';

const together = babelMerge(
  {
    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
import { babelMerge } from '@armit/babel-merge';

const together = babelMerge(
  {
    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

---
_Source: https://npm.io/package/@armit/babel-merge · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
