mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			206 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			206 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
"use strict";
 | 
						|
 | 
						|
/*globals describe it */
 | 
						|
const should = require("should");
 | 
						|
const path = require("path");
 | 
						|
 | 
						|
const webpack = require("../lib/webpack");
 | 
						|
 | 
						|
const base = path.join(__dirname, "fixtures", "errors");
 | 
						|
 | 
						|
describe("Errors", () => {
 | 
						|
	function customOutputFilesystem(c) {
 | 
						|
		const files = {};
 | 
						|
		c.outputFileSystem = {
 | 
						|
			join: path.join.bind(path),
 | 
						|
			mkdirp: function(path, callback) {
 | 
						|
				callback();
 | 
						|
			},
 | 
						|
			writeFile: function(name, content, callback) {
 | 
						|
				files[name] = content.toString("utf-8");
 | 
						|
				callback();
 | 
						|
			}
 | 
						|
		};
 | 
						|
		return files;
 | 
						|
	}
 | 
						|
 | 
						|
	function getErrors(options, callback) {
 | 
						|
		options.context = base;
 | 
						|
		const c = webpack(options);
 | 
						|
		customOutputFilesystem(c);
 | 
						|
		c.run((err, stats) => {
 | 
						|
			if(err) throw err;
 | 
						|
			should.strictEqual(typeof stats, "object");
 | 
						|
			stats = stats.toJson({
 | 
						|
				errorDetails: false
 | 
						|
			});
 | 
						|
			should.strictEqual(typeof stats, "object");
 | 
						|
			stats.should.have.property("errors");
 | 
						|
			stats.should.have.property("warnings");
 | 
						|
			Array.isArray(stats.errors).should.be.ok(); // eslint-disable-line no-unused-expressions
 | 
						|
			Array.isArray(stats.warnings).should.be.ok(); // eslint-disable-line no-unused-expressions
 | 
						|
			callback(stats.errors, stats.warnings);
 | 
						|
		});
 | 
						|
	}
 | 
						|
	it("should throw an error if file doesn't exist", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: "./missingFile"
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			errors.length.should.be.eql(2);
 | 
						|
			warnings.length.should.be.eql(0);
 | 
						|
			errors.sort();
 | 
						|
			let lines = errors[0].split("\n");
 | 
						|
			lines[0].should.match(/missingFile.js/);
 | 
						|
			lines[1].should.match(/^Module not found/);
 | 
						|
			lines[1].should.match(/\.\/dir\/missing2/);
 | 
						|
			lines[2].should.match(/missingFile.js 12:9/);
 | 
						|
			lines = errors[1].split("\n");
 | 
						|
			lines[0].should.match(/missingFile.js/);
 | 
						|
			lines[1].should.match(/^Module not found/);
 | 
						|
			lines[1].should.match(/\.\/missing/);
 | 
						|
			lines[2].should.match(/missingFile.js 4:0/);
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should report require.extensions as unsupported", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: "./require.extensions"
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			errors.length.should.be.eql(0);
 | 
						|
			warnings.length.should.be.eql(1);
 | 
						|
			const lines = warnings[0].split("\n");
 | 
						|
			lines[0].should.match(/require.extensions\.js/);
 | 
						|
			lines[1].should.match(/require.extensions is not supported by webpack/);
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should warn about case-sensitive module names", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: "./case-sensitive"
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			if(errors.length === 0) {
 | 
						|
				warnings.length.should.be.eql(1);
 | 
						|
				const lines = warnings[0].split("\n");
 | 
						|
				lines[4].should.match(/FILE\.js/);
 | 
						|
				lines[5].should.match(/Used by/);
 | 
						|
				lines[6].should.match(/case-sensitive/);
 | 
						|
				lines[7].should.match(/file\.js/);
 | 
						|
				lines[8].should.match(/Used by/);
 | 
						|
				lines[9].should.match(/case-sensitive/);
 | 
						|
			} else {
 | 
						|
				errors.length.should.be.eql(1);
 | 
						|
				warnings.length.should.be.eql(0);
 | 
						|
			}
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should warn about NoErrorsPlugin being deprecated in favor of NoEmitOnErrorsPlugin", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: "./no-errors-deprecate",
 | 
						|
			plugins: [
 | 
						|
				new webpack.NoErrorsPlugin()
 | 
						|
			]
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			warnings.length.should.be.eql(1);
 | 
						|
			const lines = warnings[0].split("\n");
 | 
						|
			lines[0].should.match(/webpack/);
 | 
						|
			lines[0].should.match(/NoErrorsPlugin/);
 | 
						|
			lines[0].should.match(/deprecated/);
 | 
						|
			lines[1].should.match(/NoEmitOnErrorsPlugin/);
 | 
						|
			lines[1].should.match(/instead/);
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should not warn if the NoEmitOnErrorsPlugin is used over the NoErrorsPlugin", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: "./no-errors-deprecate",
 | 
						|
			plugins: [
 | 
						|
				new webpack.NoEmitOnErrorsPlugin()
 | 
						|
			]
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			errors.length.should.be.eql(0);
 | 
						|
			warnings.length.should.be.eql(0);
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should not not emit if NoEmitOnErrorsPlugin is used and there is an error", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: "./missingFile",
 | 
						|
			plugins: [
 | 
						|
				new webpack.NoEmitOnErrorsPlugin()
 | 
						|
			]
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			errors.length.should.be.eql(2);
 | 
						|
			warnings.length.should.be.eql(0);
 | 
						|
			errors.sort();
 | 
						|
			let lines = errors[0].split("\n");
 | 
						|
			lines[0].should.match(/missingFile.js/);
 | 
						|
			lines[1].should.match(/^Module not found/);
 | 
						|
			lines[1].should.match(/\.\/dir\/missing2/);
 | 
						|
			lines[2].should.match(/missingFile.js 12:9/);
 | 
						|
			lines = errors[1].split("\n");
 | 
						|
			lines[0].should.match(/missingFile.js/);
 | 
						|
			lines[1].should.match(/^Module not found/);
 | 
						|
			lines[1].should.match(/\.\/missing/);
 | 
						|
			lines[2].should.match(/missingFile.js 4:0/);
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should throw an error when using incorrect CommonsChunkPlugin configuration", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: {
 | 
						|
				a: "./entry-point",
 | 
						|
				b: "./entry-point",
 | 
						|
				c: "./entry-point"
 | 
						|
			},
 | 
						|
			output: {
 | 
						|
				filename: "[name].js"
 | 
						|
			},
 | 
						|
			plugins: [
 | 
						|
				new webpack.optimize.CommonsChunkPlugin({
 | 
						|
					name: "a",
 | 
						|
					filename: "a.js",
 | 
						|
					minChunks: Infinity
 | 
						|
				}),
 | 
						|
				new webpack.optimize.CommonsChunkPlugin({
 | 
						|
					name: "b",
 | 
						|
					filename: "b.js",
 | 
						|
					minChunks: Infinity
 | 
						|
				})
 | 
						|
			]
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			errors.length.should.be.eql(1);
 | 
						|
			warnings.length.should.be.eql(0);
 | 
						|
			const lines = errors[0].split("\n");
 | 
						|
			lines[0].should.match(/CommonsChunkPlugin/);
 | 
						|
			lines[0].should.match(/non-entry/);
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
	it("should throw an error when trying to use [chunkhash] when it's invalid", (done) => {
 | 
						|
		getErrors({
 | 
						|
			entry: {
 | 
						|
				a: "./entry-point",
 | 
						|
				b: "./entry-point",
 | 
						|
				c: "./entry-point"
 | 
						|
			},
 | 
						|
			output: {
 | 
						|
				filename: "[chunkhash].js"
 | 
						|
			},
 | 
						|
			plugins: [
 | 
						|
				new webpack.HotModuleReplacementPlugin()
 | 
						|
			]
 | 
						|
		}, (errors, warnings) => {
 | 
						|
			errors.length.should.be.eql(3);
 | 
						|
			warnings.length.should.be.eql(0);
 | 
						|
			errors.forEach((error) => {
 | 
						|
				const lines = error.split("\n");
 | 
						|
				lines[0].should.match(/chunk (a|b|c)/);
 | 
						|
				lines[2].should.match(/\[chunkhash\].js/);
 | 
						|
				lines[2].should.match(/use \[hash\] instead/);
 | 
						|
			});
 | 
						|
			done();
 | 
						|
		});
 | 
						|
	});
 | 
						|
});
 |