mirror of https://github.com/webpack/webpack.git
572 lines
8.7 KiB
JavaScript
572 lines
8.7 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
const {
|
||
|
cleverMerge,
|
||
|
DELETE,
|
||
|
removeOperations
|
||
|
} = require("../lib/util/cleverMerge");
|
||
|
|
||
|
describe("cleverMerge", () => {
|
||
|
const base = {
|
||
|
a1: [1],
|
||
|
a2: [1],
|
||
|
a3: [1],
|
||
|
b1: [1, "...", 2],
|
||
|
b2: [1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a2: [5],
|
||
|
a3: [5, "...", 6],
|
||
|
a4: [5],
|
||
|
a5: [5, "...", 6],
|
||
|
b2: [5],
|
||
|
b3: [5, "...", 6],
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const cases = {
|
||
|
"different properties": [{ a: 1 }, { b: 2 }, { a: 1, b: 2 }],
|
||
|
"same property": [{ a: 1 }, { a: 2 }, { a: 2 }],
|
||
|
arrays: [
|
||
|
{ a1: 1, a2: 1, b1: [], b2: [], c1: [1], c2: [1] },
|
||
|
{
|
||
|
a1: [2],
|
||
|
a2: [2, "...", 3],
|
||
|
b1: [2],
|
||
|
b2: [2, "...", 3],
|
||
|
c1: [2],
|
||
|
c2: [2, "...", 3]
|
||
|
},
|
||
|
{
|
||
|
a1: [2],
|
||
|
a2: [2, 1, 3],
|
||
|
b1: [2],
|
||
|
b2: [2, 3],
|
||
|
c1: [2],
|
||
|
c2: [2, 1, 3]
|
||
|
}
|
||
|
],
|
||
|
"by field override": [
|
||
|
base,
|
||
|
{
|
||
|
a1: [8],
|
||
|
a2: [8],
|
||
|
a3: [8],
|
||
|
a4: [8],
|
||
|
a5: [8],
|
||
|
b1: [8],
|
||
|
b2: [8],
|
||
|
b3: [8],
|
||
|
b4: [8],
|
||
|
b5: [8]
|
||
|
},
|
||
|
{
|
||
|
a1: [8],
|
||
|
a2: [8],
|
||
|
a3: [8],
|
||
|
a4: [8],
|
||
|
a5: [8],
|
||
|
b1: [8],
|
||
|
b2: [8],
|
||
|
b3: [8],
|
||
|
b4: [8],
|
||
|
b5: [8]
|
||
|
}
|
||
|
],
|
||
|
"by field extend default": [
|
||
|
base,
|
||
|
{
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, "..."],
|
||
|
a3: [8, "..."],
|
||
|
a4: [8, "..."],
|
||
|
a5: [8, "..."],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, "..."],
|
||
|
b3: [8, "..."]
|
||
|
},
|
||
|
{
|
||
|
a1: [8, 1],
|
||
|
a2: [8, 1],
|
||
|
a3: [1],
|
||
|
a4: [8, "..."],
|
||
|
b1: [8, 1, "...", 2],
|
||
|
b2: [8, 1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a2: [8, 5],
|
||
|
a3: [8, 5, "...", 6],
|
||
|
a4: [8, 5],
|
||
|
a5: [8, 5, "...", 6],
|
||
|
b2: [8, 5],
|
||
|
b3: [8, 5, "...", 6],
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
},
|
||
|
default: {
|
||
|
a3: [8, "..."],
|
||
|
a5: [8, "..."],
|
||
|
b3: [8, "..."]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field override other": [
|
||
|
base,
|
||
|
{
|
||
|
bySomething: {
|
||
|
y: {
|
||
|
a1: [8],
|
||
|
a2: [8],
|
||
|
a3: [8],
|
||
|
a4: [8],
|
||
|
a5: [8],
|
||
|
b1: [8],
|
||
|
b2: [8],
|
||
|
b3: [8],
|
||
|
b4: [8],
|
||
|
b5: [8]
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a1: [1],
|
||
|
a2: [1],
|
||
|
a3: [1],
|
||
|
b1: [1, "...", 2],
|
||
|
b2: [1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a2: [5],
|
||
|
a3: [5, "...", 6],
|
||
|
a4: [5],
|
||
|
a5: [5, "...", 6],
|
||
|
b2: [5],
|
||
|
b3: [5, "...", 6],
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
},
|
||
|
y: {
|
||
|
a1: [8],
|
||
|
a2: [8],
|
||
|
a3: [8],
|
||
|
a4: [8],
|
||
|
a5: [8],
|
||
|
b1: [8],
|
||
|
b2: [8],
|
||
|
b3: [8],
|
||
|
b4: [8],
|
||
|
b5: [8]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field override same": [
|
||
|
base,
|
||
|
{
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a1: [8],
|
||
|
a2: [8],
|
||
|
a3: [8],
|
||
|
a4: [8],
|
||
|
a5: [8],
|
||
|
b1: [8],
|
||
|
b2: [8],
|
||
|
b3: [8],
|
||
|
b4: [8],
|
||
|
b5: [8]
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a1: [1],
|
||
|
a2: [1],
|
||
|
a3: [1],
|
||
|
b1: [1, "...", 2],
|
||
|
b2: [1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a1: [8],
|
||
|
a2: [8],
|
||
|
a3: [8],
|
||
|
a4: [8],
|
||
|
a5: [8],
|
||
|
b1: [8],
|
||
|
b2: [8],
|
||
|
b3: [8],
|
||
|
b4: [8],
|
||
|
b5: [8]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field extend other": [
|
||
|
base,
|
||
|
{
|
||
|
bySomething: {
|
||
|
y: {
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, "..."],
|
||
|
a3: [8, "..."],
|
||
|
a4: [8, "..."],
|
||
|
a5: [8, "..."],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, "..."],
|
||
|
b3: [8, "..."]
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a1: [1],
|
||
|
a2: [1],
|
||
|
a3: [1],
|
||
|
b1: [1, "...", 2],
|
||
|
b2: [1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a2: [5],
|
||
|
a3: [5, "...", 6],
|
||
|
a4: [5],
|
||
|
a5: [5, "...", 6],
|
||
|
b2: [5],
|
||
|
b3: [5, "...", 6],
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
},
|
||
|
y: {
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, "..."],
|
||
|
a3: [8, "..."],
|
||
|
a4: [8, "..."],
|
||
|
a5: [8, "..."],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, "..."],
|
||
|
b3: [8, "..."]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field extend same": [
|
||
|
base,
|
||
|
{
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, "..."],
|
||
|
a3: [8, "..."],
|
||
|
a4: [8, "..."],
|
||
|
a5: [8, "..."],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, "..."],
|
||
|
b3: [8, "..."]
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a1: [1],
|
||
|
a2: [1],
|
||
|
a3: [1],
|
||
|
b1: [1, "...", 2],
|
||
|
b2: [1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, 5],
|
||
|
a3: [8, 5, "...", 6],
|
||
|
a4: [8, 5],
|
||
|
a5: [8, 5, "...", 6],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, 5],
|
||
|
b3: [8, 5, "...", 6],
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field extend base, same and other": [
|
||
|
base,
|
||
|
{
|
||
|
a1: [7, "..."],
|
||
|
a2: [7, "..."],
|
||
|
a3: [7, "..."],
|
||
|
a4: [7, "..."],
|
||
|
a5: [7, "..."],
|
||
|
b1: [7, "..."],
|
||
|
b2: [7, "..."],
|
||
|
b3: [7, "..."],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, "..."],
|
||
|
a3: [8, "..."],
|
||
|
a4: [8, "..."],
|
||
|
a5: [8, "..."],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, "..."],
|
||
|
b3: [8, "..."]
|
||
|
},
|
||
|
y: {
|
||
|
a1: [9, "..."],
|
||
|
a2: [9, "..."],
|
||
|
a3: [9, "..."],
|
||
|
a4: [9, "..."],
|
||
|
a5: [9, "..."],
|
||
|
b1: [9, "..."],
|
||
|
b2: [9, "..."],
|
||
|
b3: [9, "..."]
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a1: [7, 1],
|
||
|
a2: [7, 1],
|
||
|
a3: [1],
|
||
|
a4: [7, "..."],
|
||
|
b1: [7, 1, "...", 2],
|
||
|
b2: [7, 1, "...", 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a1: [8, "..."],
|
||
|
a2: [8, 7, 5],
|
||
|
a3: [8, 7, 5, "...", 6],
|
||
|
a4: [8, 7, 5],
|
||
|
a5: [8, 7, 5, "...", 6],
|
||
|
b1: [8, "..."],
|
||
|
b2: [8, 7, 5],
|
||
|
b3: [8, 7, 5, "...", 6],
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
},
|
||
|
y: {
|
||
|
a1: [9, "..."],
|
||
|
a2: [9, "..."],
|
||
|
a3: [9, 7, "..."],
|
||
|
a4: [9, "..."],
|
||
|
a5: [9, 7, "..."],
|
||
|
b1: [9, "..."],
|
||
|
b2: [9, "..."],
|
||
|
b3: [9, 7, "..."]
|
||
|
},
|
||
|
default: {
|
||
|
a3: [7, "..."],
|
||
|
a5: [7, "..."],
|
||
|
b3: [7, "..."]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field promoting edge cases": [
|
||
|
{
|
||
|
a: [1, "...", 2],
|
||
|
b: [1, "...", 2],
|
||
|
c: [1, "...", 2],
|
||
|
d: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a: [3, "...", 4],
|
||
|
b: [3, "...", 4],
|
||
|
d: [3, "...", 4]
|
||
|
},
|
||
|
y: {
|
||
|
a: [5],
|
||
|
b: [5]
|
||
|
},
|
||
|
default: {
|
||
|
a: [6, "...", 7],
|
||
|
c: [6, "...", 7]
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a: [8, "...", 9],
|
||
|
b: [8, "...", 9],
|
||
|
c: [8, "...", 9],
|
||
|
d: [8, "...", 9]
|
||
|
},
|
||
|
{
|
||
|
a: [1, "...", 2],
|
||
|
b: [1, "...", 2],
|
||
|
c: [1, "...", 2],
|
||
|
d: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a: [8, 3, "...", 4, 9],
|
||
|
b: [8, 3, "...", 4, 9],
|
||
|
c: [8, "...", 9],
|
||
|
d: [8, 3, "...", 4, 9]
|
||
|
},
|
||
|
y: {
|
||
|
a: [8, 5, 9],
|
||
|
b: [8, 5, 9],
|
||
|
c: [8, "...", 9],
|
||
|
d: [8, "...", 9]
|
||
|
},
|
||
|
default: {
|
||
|
a: [8, 6, "...", 7, 9],
|
||
|
b: [8, "...", 9],
|
||
|
c: [8, 6, "...", 7, 9],
|
||
|
d: [8, "...", 9]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"by field clone default": [
|
||
|
{
|
||
|
a: 1,
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
b: 2
|
||
|
},
|
||
|
default: {
|
||
|
c: 3
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
bySomething: {
|
||
|
y: {
|
||
|
d: 4
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
a: 1,
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
b: 2
|
||
|
},
|
||
|
y: {
|
||
|
c: 3,
|
||
|
d: 4
|
||
|
},
|
||
|
default: {
|
||
|
c: 3
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
deleting: [
|
||
|
base,
|
||
|
{
|
||
|
a1: DELETE,
|
||
|
a2: DELETE,
|
||
|
a3: DELETE,
|
||
|
a4: DELETE,
|
||
|
a5: DELETE,
|
||
|
b1: DELETE,
|
||
|
b2: DELETE,
|
||
|
b3: DELETE
|
||
|
},
|
||
|
{
|
||
|
a1: DELETE,
|
||
|
a2: DELETE,
|
||
|
a3: DELETE,
|
||
|
a4: DELETE,
|
||
|
a5: DELETE,
|
||
|
b1: DELETE,
|
||
|
b2: DELETE,
|
||
|
b3: DELETE,
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
b4: [5],
|
||
|
b5: [5, "...", 6]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
],
|
||
|
"merge objects": [
|
||
|
{
|
||
|
nested: base
|
||
|
},
|
||
|
{
|
||
|
nested: base
|
||
|
},
|
||
|
{
|
||
|
nested: {
|
||
|
a1: [1],
|
||
|
a2: [1],
|
||
|
a3: [1],
|
||
|
b1: [1, 1, "...", 2, 2],
|
||
|
b2: [1, 1, "...", 2, 2],
|
||
|
b3: [1, "...", 2],
|
||
|
bySomething: {
|
||
|
x: {
|
||
|
a2: [5],
|
||
|
a3: [5, "...", 6],
|
||
|
a4: [5],
|
||
|
a5: [5, 5, "...", 6, 6],
|
||
|
b2: [5],
|
||
|
b3: [5, 1, 5, "...", 6, 2, 6],
|
||
|
b4: [5],
|
||
|
b5: [5, 5, "...", 6, 6]
|
||
|
},
|
||
|
default: {
|
||
|
b3: [1, "...", 2]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
for (const key of Object.keys(cases)) {
|
||
|
const testCase = cases[key];
|
||
|
it(`should merge ${key} correctly`, () => {
|
||
|
expect(cleverMerge(testCase[0], testCase[1])).toEqual(testCase[2]);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
it("should allow to remove operations", () => {
|
||
|
expect(
|
||
|
removeOperations({
|
||
|
a: 1,
|
||
|
b: DELETE,
|
||
|
c: ["..."],
|
||
|
d: [1, "...", 2],
|
||
|
e: [1, 2, 3],
|
||
|
f: {
|
||
|
a: 1,
|
||
|
b: DELETE,
|
||
|
c: ["..."],
|
||
|
d: [1, "...", 2],
|
||
|
e: [1, 2, 3],
|
||
|
f: {
|
||
|
a: 1,
|
||
|
b: DELETE,
|
||
|
c: ["..."],
|
||
|
d: [1, "...", 2],
|
||
|
e: [1, 2, 3]
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
).toEqual({
|
||
|
a: 1,
|
||
|
c: [],
|
||
|
d: [1, 2],
|
||
|
e: [1, 2, 3],
|
||
|
f: {
|
||
|
a: 1,
|
||
|
c: [],
|
||
|
d: [1, 2],
|
||
|
e: [1, 2, 3],
|
||
|
f: {
|
||
|
a: 1,
|
||
|
c: [],
|
||
|
d: [1, 2],
|
||
|
e: [1, 2, 3]
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
});
|