Code coverage report for lib\optimize\UglifyJsPlugin.js

Statements: 85.71% (66 / 77)      Branches: 62.07% (18 / 29)      Functions: 90.91% (10 / 11)      Lines: 85.33% (64 / 75)      Ignored: none     

All files » lib\optimize\ » UglifyJsPlugin.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116        1 1 1 1   1 7 7     7   1 1 175 175 175 175   1097   175 175 175 253 253     175     175 253 253 253 253 253 253       253 253 253 1594 1594 1594 1594       1594 628     253     253 253 253 253 253 253 253 253     253 253       253 253 253 253     253 253 253 253 253 253 253 128                               253     175   175 996      
/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
var SourceMapConsumer = require("webpack-core/lib/source-map").SourceMapConsumer;
var SourceMapSource = require("webpack-core/lib/SourceMapSource");
var RequestShortener = require("../RequestShortener");
var uglify = require("uglify-js");
 
function UglifyJsPlugin(options) {
	Eif(typeof options !== "object") options = {};
	Iif(typeof options.compressor !== "undefined") {
		options.compress = options.compressor;
	}
	this.options = options;
}
module.exports = UglifyJsPlugin;
UglifyJsPlugin.prototype.apply = function(compiler) {
	var options = this.options;
	var requestShortener = new RequestShortener(compiler.context);
	compiler.plugin("compilation", function(compilation) {
		compilation.plugin("build-module", function(module) {
			// to get detailed location info about errors
			module.useSourceMap = true;
		});
		compilation.plugin("optimize-chunk-assets", function(chunks, callback) {
			var files = [];
			chunks.forEach(function(chunk) {
				chunk.files.forEach(function(file) {
					files.push(file);
				});
			});
			compilation.additionalChunkAssets.forEach(function(file) {
				files.push(file);
			});
			files.forEach(function(file) {
				var oldWarnFunction = uglify.AST_Node.warn_function;
				var warnings = [];
				try {
					var asset = compilation.assets[file];
					var input = asset.source();
					Iif(asset.__UglifyJsPlugin) {
						compilation.assets[file] = asset.__UglifyJsPlugin;
						return;
					}
					var inputSourceMap = asset.map();
					var sourceMap = new SourceMapConsumer(inputSourceMap);
					uglify.AST_Node.warn_function = function(warning) {
						var match = /\[.+:([0-9]+),([0-9]+)\]/.exec(warning);
						var line = +match[1];
						var column = +match[2];
						var original = sourceMap.originalPositionFor({
							line: line,
							column: column
						});
						if(!original || !original.source || original.source === file) return;
						warnings.push(warning.replace(/\[.+:([0-9]+),([0-9]+)\]/, "") + 
							"[" + requestShortener.shorten(original.source) + ":" + original.line + "," + original.column + "]");
					};
					var ast = uglify.parse(input, {
						filename: file
					});
					ast.figure_out_scope()
					Eif(options.compress !== false) {
						var compress = uglify.Compressor(options.compress);
						ast = ast.transform(compress);
						ast.figure_out_scope();
						Eif(options.mangle !== false) {
							ast.compute_char_frequency(options.mangle || {});
							ast.mangle_names(options.mangle || {});
						}
					}
					var map = null;
					map = uglify.SourceMap({
						file: file,
						root: ""
					});
					var output = {};
					output.comments = options.comments || /^\**!|@preserve|@license/;
					output.beautify = options.beautify;
					for(var k in options.output) {
						output[k] = options.output[k];
					}
					output.source_map = map;
					var stream = uglify.OutputStream(output);
					ast.print(stream);
					map = map + "";
					stream = stream + "";
					asset.__UglifyJsPlugin = compilation.assets[file] = new SourceMapSource(stream, file, map, input, inputSourceMap);
					if(warnings.length > 0) {
						compilation.warnings.push(new Error(file + " from UglifyJs\n" + warnings.join("\n")));
					}
				} catch(err) {
					if(err.line) {
						var original = sourceMap.originalPositionFor({
							line: err.line,
							column: err.col
						});
						if(original && original.source) {
							compilation.errors.push(new Error(file + " from UglifyJs\n" + err.message + " [" + requestShortener.shorten(original.source) + ":" + original.line + "," + original.column + "]"));
						} else {
							compilation.errors.push(new Error(file + " from UglifyJs\n" + err.message + " [" + file + ":" + err.line + "," + err.col + "]"));
						}
					} else
						compilation.errors.push(new Error(file + " from UglifyJs\n" + err.stack));
				} finally {
					uglify.AST_Node.warn_function = oldWarnFunction;
				}
			});
			callback();
		});
		compilation.plugin("normal-module-loader", function(context) {
			context.minimize = true;
		});
	});
};