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] | ||
|  | 				} | ||
|  | 			} | ||
|  | 		}); | ||
|  | 	}); | ||
|  | }); |