0.2.6 • Published 9 months ago

@armit/babel-merge v0.2.6

Weekly downloads
-
License
MIT
Repository
github
Last release
9 months ago

@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 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 v18+
  • Yarn or npm client

Installation

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

Yarn

❯ yarn add @armit/babel-merge

npm

❯ npm install --save @armit/babel-merge

Usage

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

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:

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:

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:

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',
  ];
}
0.2.6

9 months ago

0.2.5

10 months ago

0.2.1

1 year ago

0.2.0

1 year ago

0.2.3

12 months ago

0.2.2

1 year ago

0.2.4

12 months ago

0.1.6

1 year ago

0.1.5

1 year ago

0.1.4

1 year ago