babel-merge

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

Usage no npm install needed!

<script type="module">
  import babelMerge from 'https://cdn.skypack.dev/babel-merge';
</script>

README

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 downloads

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

❯ yarn add babel-merge

npm

❯ npm install --save babel-merge

Usage

  • merge(a, b, options)
  • merge.all([a, b, ..., z], options)

Where a, b, z are Babel configuration objects and options is a deepmerge options object.

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:

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:

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:

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'
  ]
}