mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			415 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			415 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| "use strict";
 | |
| 
 | |
| const should = require("should");
 | |
| 
 | |
| const RuleSet = require("../lib/RuleSet");
 | |
| 
 | |
| function match(ruleSet, resource) {
 | |
| 	const result = ruleSet.exec({
 | |
| 		resource: resource
 | |
| 	});
 | |
| 	return result.filter((r) => {
 | |
| 		return r.type === "use";
 | |
| 	}).map(r => r.value).map(r => {
 | |
| 		if(!r.options)
 | |
| 			return r.loader;
 | |
| 		if(typeof r.options === "string")
 | |
| 			return r.loader + "?" + r.options;
 | |
| 		return r.loader + "?" + JSON.stringify(r.options);
 | |
| 	});
 | |
| }
 | |
| 
 | |
| describe("RuleSet", () => {
 | |
| 	it("should create RuleSet with a blank array", () => {
 | |
| 		const loader = new RuleSet([]);
 | |
| 		(loader.rules).should.eql([]);
 | |
| 	});
 | |
| 	it("should create RuleSet and match with empty array", () => {
 | |
| 		const loader = new RuleSet([]);
 | |
| 		(match(loader, "something")).should.eql([]);
 | |
| 	});
 | |
| 	it("should not match with loaders array", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "something")).should.eql([]);
 | |
| 	});
 | |
| 
 | |
| 	it("should match with regex", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should match with string", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: "style.css",
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should match with function", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: function(str) {
 | |
| 				return str === "style.css";
 | |
| 			},
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should throw if invalid test", () => {
 | |
| 		should.throws(() => {
 | |
| 			const loader = new RuleSet([{
 | |
| 				test: {
 | |
| 					invalid: "test"
 | |
| 				},
 | |
| 				loader: "css"
 | |
| 			}]);
 | |
| 			(match(loader, "style.css")).should.eql(["css"]);
 | |
| 		}, /Unexcepted property invalid in condition/);
 | |
| 	});
 | |
| 
 | |
| 	it("should accept multiple test array that all match", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: [
 | |
| 				/style.css/,
 | |
| 				/yle.css/
 | |
| 			],
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should accept multiple test array that not all match", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: [
 | |
| 				/style.css/,
 | |
| 				/something.css/
 | |
| 			],
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should not match if include does not match", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			include: /output.css/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql([]);
 | |
| 	});
 | |
| 
 | |
| 	it("should match if include matches", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			include: /style.css/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should not match if exclude matches", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			exclude: /style.css/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql([]);
 | |
| 	});
 | |
| 
 | |
| 	it("should match if exclude does not match", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			exclude: /output.css/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work if a loader is applied to all files", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 		(match(loader, "scripts.js")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loader as string", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loader as array", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: ["css"]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loaders as string", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: "css"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loaders as array", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: ["css"]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should throw if using loaders with non-string or array", () => {
 | |
| 		should.throws(function() {
 | |
| 			const loader = new RuleSet([{
 | |
| 				test: /\.css$/,
 | |
| 				loaders: {
 | |
| 					someObj: true
 | |
| 				}
 | |
| 			}]);
 | |
| 			(match(loader, "style.css")).should.eql(["css"]);
 | |
| 		}, /No loader specified/);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loader with inline query", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: "css?modules=1"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css?modules=1"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loader with string query", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: "css",
 | |
| 			query: "modules=1"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css?modules=1"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using loader with object query", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loader: "css",
 | |
| 			query: {
 | |
| 				modules: 1
 | |
| 			}
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css?{\"modules\":1}"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using array loaders with basic object notation", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: [{
 | |
| 				loader: "css"
 | |
| 			}]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should throw if using array loaders with object notation without specifying a loader", () => {
 | |
| 		should.throws(() => {
 | |
| 			const loader = new RuleSet([{
 | |
| 				test: /\.css$/,
 | |
| 				loaders: [{
 | |
| 					stuff: 1
 | |
| 				}]
 | |
| 			}]);
 | |
| 			match(loader, "style.css");
 | |
| 		}, /No loader specified/);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using array loaders with object notation", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: [{
 | |
| 				loader: "css",
 | |
| 				query: "modules=1"
 | |
| 			}]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["css?modules=1"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using multiple array loaders with object notation", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: [{
 | |
| 				loader: "style",
 | |
| 				query: "filesize=1000"
 | |
| 			}, {
 | |
| 				loader: "css",
 | |
| 				query: "modules=1"
 | |
| 			}]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["style?filesize=1000", "css?modules=1"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work with using string multiple loaders", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: "style?filesize=1000!css?modules=1"
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["style?filesize=1000", "css?modules=1"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should throw if using array loaders with a single legacy", () => {
 | |
| 		should.throws(() => {
 | |
| 			const loader = new RuleSet([{
 | |
| 				test: /\.css$/,
 | |
| 				loaders: ["style-loader", "css-loader"],
 | |
| 				query: "modules=1"
 | |
| 			}]);
 | |
| 			(match(loader, "style.css")).should.eql(["css"]);
 | |
| 		}, /options\/query cannot be used with loaders/);
 | |
| 	});
 | |
| 
 | |
| 	it("should work when using array loaders", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			loaders: ["style-loader", "css-loader"]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["style-loader", "css-loader"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work when using an array of functions returning a loader", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			use: [
 | |
| 				function(data) {
 | |
| 					return {
 | |
| 						loader: "style-loader"
 | |
| 					};
 | |
| 				},
 | |
| 				function(data) {
 | |
| 					return {
 | |
| 						loader: "css-loader"
 | |
| 					};
 | |
| 				},
 | |
| 			]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["style-loader", "css-loader"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work when using an array of either functions or strings returning a loader", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			use: [
 | |
| 				"style-loader",
 | |
| 				function(data) {
 | |
| 					return {
 | |
| 						loader: "css-loader"
 | |
| 					};
 | |
| 				},
 | |
| 			]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["style-loader", "css-loader"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should work when using an array of functions returning either a loader obejct or loader name string", () => {
 | |
| 		const loader = new RuleSet([{
 | |
| 			test: /\.css$/,
 | |
| 			use: [
 | |
| 				function(data) {
 | |
| 					return "style-loader";
 | |
| 				},
 | |
| 				function(data) {
 | |
| 					return {
 | |
| 						loader: "css-loader"
 | |
| 					};
 | |
| 				},
 | |
| 			]
 | |
| 		}]);
 | |
| 		(match(loader, "style.css")).should.eql(["style-loader", "css-loader"]);
 | |
| 	});
 | |
| 
 | |
| 	it("should throw if using array loaders with invalid type", () => {
 | |
| 		should.throws(() => {
 | |
| 			const loader = new RuleSet([{
 | |
| 				test: /\.css$/,
 | |
| 				loaders: ["style-loader", "css-loader", 5],
 | |
| 			}]);
 | |
| 			(match(loader, "style.css")).should.eql(["css"]);
 | |
| 		}, /No loader specified/);
 | |
| 	});
 | |
| 
 | |
| 	describe("when exclude array holds an undefined item", () => {
 | |
| 		function errorHasContext(err) {
 | |
| 			if(/Expected condition but got falsy value/.test(err) &&
 | |
| 				/test/.test(err) &&
 | |
| 				/include/.test(err) &&
 | |
| 				/exclude/.test(err) &&
 | |
| 				/node_modules/.test(err) &&
 | |
| 				/undefined/.test(err)) {
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		it("should throw with context", () => {
 | |
| 			should.throws(() => {
 | |
| 				const loader = new RuleSet([{
 | |
| 					test: /\.css$/,
 | |
| 					loader: "css",
 | |
| 					include: [
 | |
| 						"src",
 | |
| 					],
 | |
| 					exclude: [
 | |
| 						"node_modules",
 | |
| 						undefined,
 | |
| 					],
 | |
| 				}]);
 | |
| 				(match(loader, "style.css")).should.eql(["css"]);
 | |
| 			}, errorHasContext);
 | |
| 		});
 | |
| 		it("in resource should throw with context", () => {
 | |
| 			should.throws(() => {
 | |
| 				const loader = new RuleSet([{
 | |
| 					resource: {
 | |
| 						test: /\.css$/,
 | |
| 						include: [
 | |
| 							"src",
 | |
| 						],
 | |
| 						exclude: [
 | |
| 							"node_modules",
 | |
| 							undefined,
 | |
| 						],
 | |
| 					},
 | |
| 				}]);
 | |
| 				(match(loader, "style.css")).should.eql(["css"]);
 | |
| 			}, errorHasContext);
 | |
| 		});
 | |
| 
 | |
| 		it("in issuer should throw with context", () => {
 | |
| 			should.throws(() => {
 | |
| 				const loader = new RuleSet([{
 | |
| 					issuer: {
 | |
| 						test: /\.css$/,
 | |
| 						include: [
 | |
| 							"src",
 | |
| 						],
 | |
| 						exclude: [
 | |
| 							"node_modules",
 | |
| 							undefined,
 | |
| 						],
 | |
| 					},
 | |
| 				}]);
 | |
| 				(match(loader, "style.css")).should.eql(["css"]);
 | |
| 			}, errorHasContext);
 | |
| 		});
 | |
| 	});
 | |
| });
 |