mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			718 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			718 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| "use strict";
 | |
| 
 | |
| const {
 | |
| 	cleverMerge,
 | |
| 	DELETE,
 | |
| 	removeOperations,
 | |
| 	resolveByProperty,
 | |
| 	cachedCleverMerge
 | |
| } = 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]
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		],
 | |
| 		dynamicSecond: [
 | |
| 			{
 | |
| 				a: 4, // keep
 | |
| 				b: 5, // static override
 | |
| 				c: 6 // dynamic override
 | |
| 			},
 | |
| 			{
 | |
| 				b: 50,
 | |
| 				y: 20,
 | |
| 				byArguments: (x, y, z) => ({
 | |
| 					c: 60,
 | |
| 					x,
 | |
| 					y,
 | |
| 					z
 | |
| 				})
 | |
| 			},
 | |
| 			{
 | |
| 				a: 4,
 | |
| 				b: 50,
 | |
| 				c: 60,
 | |
| 				x: 1,
 | |
| 				y: 2,
 | |
| 				z: 3
 | |
| 			}
 | |
| 		],
 | |
| 		dynamicBoth: [
 | |
| 			{
 | |
| 				a: 4, // keep
 | |
| 				b: 5, // static override
 | |
| 				c: 6, // dynamic override
 | |
| 				byArguments: (x, y, z) => ({
 | |
| 					x, // keep
 | |
| 					y, // static override
 | |
| 					z // dynamic override
 | |
| 				})
 | |
| 			},
 | |
| 			{
 | |
| 				b: 50,
 | |
| 				y: 20,
 | |
| 				byArguments: (x, y, z) => ({
 | |
| 					c: 60,
 | |
| 					z: z * 10
 | |
| 				})
 | |
| 			},
 | |
| 			{
 | |
| 				a: 4,
 | |
| 				b: 50,
 | |
| 				c: 60,
 | |
| 				x: 1,
 | |
| 				y: 20,
 | |
| 				z: 30
 | |
| 			}
 | |
| 		],
 | |
| 		dynamicChained: [
 | |
| 			cleverMerge(
 | |
| 				{
 | |
| 					a: 6, // keep
 | |
| 					b: 7, // static override
 | |
| 					c: 8, // dynamic override
 | |
| 					d: 9, // static override (3rd)
 | |
| 					e: 10, // dynamic override (3rd)
 | |
| 					byArguments: (x, y, z, v, w) => ({
 | |
| 						x, // keep
 | |
| 						y, // static override
 | |
| 						z, // dynamic override
 | |
| 						v, // static override (3rd)
 | |
| 						w // dynamic override (3rd)
 | |
| 					})
 | |
| 				},
 | |
| 				{
 | |
| 					b: 70,
 | |
| 					y: 20,
 | |
| 					byArguments: (x, y, z) => ({
 | |
| 						c: 80,
 | |
| 						z: z * 10
 | |
| 					})
 | |
| 				}
 | |
| 			),
 | |
| 			{
 | |
| 				d: 90,
 | |
| 				v: 40,
 | |
| 				byArguments: (x, y, z, v, w) => ({
 | |
| 					e: 100,
 | |
| 					w: w * 10
 | |
| 				})
 | |
| 			},
 | |
| 			{
 | |
| 				a: 6,
 | |
| 				b: 70,
 | |
| 				c: 80,
 | |
| 				d: 90,
 | |
| 				e: 100,
 | |
| 				x: 1,
 | |
| 				y: 20,
 | |
| 				z: 30,
 | |
| 				v: 40,
 | |
| 				w: 50
 | |
| 			}
 | |
| 		],
 | |
| 		dynamicFalse1: [
 | |
| 			{
 | |
| 				a: 1,
 | |
| 				byArguments: () => false
 | |
| 			},
 | |
| 			{
 | |
| 				b: 2
 | |
| 			},
 | |
| 			false
 | |
| 		],
 | |
| 		dynamicFalse2: [
 | |
| 			{
 | |
| 				a: 1
 | |
| 			},
 | |
| 			{
 | |
| 				b: 2,
 | |
| 				byArguments: () => false
 | |
| 			},
 | |
| 			false
 | |
| 		],
 | |
| 		dynamicFalse3: [
 | |
| 			{
 | |
| 				a: 1,
 | |
| 				byArguments: () => false
 | |
| 			},
 | |
| 			{
 | |
| 				b: 2,
 | |
| 				byArguments: () => false
 | |
| 			},
 | |
| 			false
 | |
| 		],
 | |
| 		nonObject1: [1, 2, 2],
 | |
| 		nonObject2: [1, { a: 1 }, 1],
 | |
| 		nonObject3: [{ a: 1 }, 1, 1],
 | |
| 		nonObject4: [{ a: 1 }, undefined, { a: 1 }],
 | |
| 		nonObject5: [undefined, { a: 1 }, { a: 1 }]
 | |
| 	};
 | |
| 	for (const key of Object.keys(cases)) {
 | |
| 		const testCase = cases[key];
 | |
| 		it(`should merge ${key} correctly`, () => {
 | |
| 			let merged = cleverMerge(testCase[0], testCase[1]);
 | |
| 			let merged1 = cachedCleverMerge(testCase[0], testCase[1]);
 | |
| 			let merged2 = cachedCleverMerge(testCase[0], testCase[1]);
 | |
| 			expect(merged2).toBe(merged1);
 | |
| 			merged = resolveByProperty(merged, "byArguments", 1, 2, 3, 4, 5);
 | |
| 			merged1 = resolveByProperty(merged1, "byArguments", 1, 2, 3, 4, 5);
 | |
| 			merged2 = resolveByProperty(merged2, "byArguments", 1, 2, 3, 4, 5);
 | |
| 			expect(merged).toEqual(testCase[2]);
 | |
| 			expect(merged1).toEqual(testCase[2]);
 | |
| 			expect(merged2).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]
 | |
| 				}
 | |
| 			}
 | |
| 		});
 | |
| 	});
 | |
| });
 |