import assert from 'assert';
|
|
|
|
import * as babel from '@babel/core';
|
|
import omit from 'object.omit';
|
|
|
|
import babelMerge from '../src';
|
|
|
|
function formatBabelConfig({ file, options }) {
|
|
return options ? [file.resolved, options] : file.resolved;
|
|
}
|
|
|
|
describe('babel-merge', () => {
|
|
it('should deeply merge preset options', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge(
|
|
{
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Firefox'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
),
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Firefox'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should merge by resolved name', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge(
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Firefox'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
),
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Firefox'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should merge env options', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge(
|
|
{
|
|
env: {
|
|
development: {
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
env: {
|
|
development: {
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Firefox'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
}
|
|
}
|
|
),
|
|
{
|
|
env: {
|
|
development: {
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Firefox'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
}
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should preserve plugin / preset order', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge(
|
|
{
|
|
presets: [
|
|
'./test/local-preset'
|
|
],
|
|
plugins: [
|
|
'module:fast-async',
|
|
'@babel/plugin-syntax-dynamic-import',
|
|
'./test/local-plugin'
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
'@babel/env'
|
|
],
|
|
plugins: [
|
|
['./test/local-plugin', { foo: 'bar' }],
|
|
'@babel/plugin-proposal-object-rest-spread',
|
|
['module:fast-async', { spec: true }],
|
|
'@babel/plugin-proposal-class-properties'
|
|
]
|
|
}
|
|
),
|
|
{
|
|
presets: [
|
|
require.resolve('./local-preset'),
|
|
require.resolve('@babel/preset-env')
|
|
],
|
|
plugins: [
|
|
[require.resolve('fast-async'), { 'spec': true }],
|
|
require.resolve('@babel/plugin-syntax-dynamic-import'),
|
|
[require.resolve('./local-plugin'), { foo: 'bar' }],
|
|
require.resolve('@babel/plugin-proposal-object-rest-spread'),
|
|
require.resolve('@babel/plugin-proposal-class-properties')
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should merge an array of config objects', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge.all([
|
|
{
|
|
presets: [
|
|
require.resolve('@babel/preset-env')
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
'@babel/preset-env'
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
'@babel/env'
|
|
]
|
|
}
|
|
]),
|
|
{
|
|
presets: [
|
|
require.resolve('@babel/preset-env')
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should dedupe merged arrays', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge.all([
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
['@babel/preset-env', {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
},
|
|
{
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
]),
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: [
|
|
'latest 1 Chrome'
|
|
]
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should support ES6+ data structures', () => {
|
|
const a = {
|
|
Map: new Map([['a', 'a']]),
|
|
Set: new Set(['a']),
|
|
WeakMap: new WeakMap([[{ a: true }, 'a']]),
|
|
WeakSet: new WeakSet([{ a: true }])
|
|
};
|
|
|
|
const b = {
|
|
Map: new Map([['b', 'b']]),
|
|
Set: new Set(['b']),
|
|
WeakMap: new WeakMap([[{ b: true }, 'b']]),
|
|
WeakSet: new WeakSet([{ b: true }])
|
|
};
|
|
|
|
const c = {
|
|
Map: new Map([['c', 'c']]),
|
|
Set: new Set(['c']),
|
|
WeakMap: new WeakMap([[{ c: true }, 'c']]),
|
|
WeakSet: new WeakSet([{ c: true }])
|
|
};
|
|
|
|
assert.deepStrictEqual(
|
|
babelMerge.all([
|
|
{ presets: [[require.resolve('@babel/preset-env'), a]] },
|
|
{ presets: [['@babel/preset-env', b]] },
|
|
{ presets: [['@babel/env', c]] }
|
|
]),
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), c]
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it('should support deepmerge option overrides', () => {
|
|
assert.deepStrictEqual(
|
|
babelMerge(
|
|
{
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: new Set()
|
|
}
|
|
}]
|
|
]
|
|
},
|
|
undefined,
|
|
{ isMergeableObject: () => true }
|
|
),
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: {}
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
babelMerge.all(
|
|
[{
|
|
presets: [
|
|
['@babel/env', {
|
|
targets: {
|
|
browsers: new Set()
|
|
}
|
|
}]
|
|
]
|
|
}],
|
|
{ isMergeableObject: () => true }
|
|
),
|
|
{
|
|
presets: [
|
|
[require.resolve('@babel/preset-env'), {
|
|
targets: {
|
|
browsers: {}
|
|
}
|
|
}]
|
|
]
|
|
}
|
|
);
|
|
});
|
|
|
|
it("should mirror babel's merge behavior", () => {
|
|
function getOverrides() {
|
|
return {
|
|
presets: [
|
|
['./test/local-preset', { foo: 'bar' }],
|
|
[
|
|
'@babel/env',
|
|
{
|
|
targets: {
|
|
browsers: ['>= 0.25%', 'not dead']
|
|
}
|
|
}
|
|
]
|
|
],
|
|
plugins: [
|
|
'@babel/plugin-proposal-object-rest-spread',
|
|
['module:fast-async', { spec: true }],
|
|
'@babel/plugin-proposal-class-properties'
|
|
]
|
|
};
|
|
}
|
|
|
|
const { options: { presets, plugins } } = babel.loadPartialConfig({
|
|
...getOverrides(),
|
|
configFile: require.resolve('./.babelrc.test')
|
|
});
|
|
|
|
delete require.cache[require.resolve('./.babelrc.test')];
|
|
|
|
const babelrc = require('./.babelrc.test');
|
|
|
|
assert.deepStrictEqual(
|
|
{
|
|
presets: presets.map(formatBabelConfig),
|
|
plugins: plugins.map(formatBabelConfig)
|
|
},
|
|
omit(babelMerge.all([babelrc, babelrc.env.test, getOverrides()]), ['env'])
|
|
);
|
|
});
|
|
});
|