Merge branch 'master' into devel

This commit is contained in:
Jesse Rosenberger
2017-02-28 16:37:05 +02:00
4 changed files with 105 additions and 7 deletions

View File

@@ -5,6 +5,11 @@
`nodeType` property of an object couldn't be checked, fixing
[#7354](https://github.com/meteor/meteor/issues/7354).
* The `standard-minifier-js` and `minifier-js` packages now have improved
error capturing to provide more information on otherwise unhelpful errors
thrown when UglifyJS encounters ECMAScript grammar it is not familiar with.
[#8414](https://github.com/meteor/meteor/pull/8414)
## v1.4.3.1, 2017-02-14
* The `meteor-babel` npm package has been upgraded to version 0.14.4,

View File

@@ -1,6 +1,6 @@
Package.describe({
summary: "JavaScript minifier",
version: "1.2.17"
version: "1.2.18"
});
Npm.depends({
@@ -12,7 +12,6 @@ Npm.strip({
});
Package.onUse(function (api) {
api.use('underscore', 'server');
api.export(['UglifyJSMinify', 'UglifyJS']);
api.addFiles(['minifier.js'], 'server');
});

View File

@@ -1,6 +1,6 @@
Package.describe({
name: 'standard-minifier-js',
version: '1.2.2',
version: '1.2.3',
summary: 'Standard javascript minifiers used with Meteor apps by default.',
documentation: 'README.md'
});
@@ -8,7 +8,7 @@ Package.describe({
Package.registerBuildPlugin({
name: "minifyStdJS",
use: [
'minifier-js'
'minifier-js@1.2.18'
],
sources: [
'plugin/minify-js.js'

View File

@@ -32,13 +32,109 @@ UglifyJSMinifier.prototype.processFilesForBundle = function (files, options) {
}
};
function maybeThrowMinifyErrorBySourceFile(error, file) {
var minifierErrorRegex = /\(line: (\d+), col: (\d+), pos: (\d+)\)/;
var parseError = minifierErrorRegex.exec(error.toString());
if (parseError) {
var lineErrorMessage = parseError[0];
var lineErrorLineNumber = parseError[1];
var parseErrorContentIndex = lineErrorLineNumber - 1;
// Unlikely, since we have a multi-line fixed header in this file.
if (parseErrorContentIndex < 0) {
return;
}
/*
What we're parsing looks like this:
/////////////////////////////////////////
// //
// path/to/file.js //
// //
/////////////////////////////////////////
// 1
var illegalECMAScript = true; // 2
// 3
/////////////////////////////////////////
Btw, the above code is intentionally not newer ECMAScript so
we don't break ourselves.
*/
var contents = file.getContentsAsString().split(/\n/);
var lineContent = contents[parseErrorContentIndex];
// Try to grab the line number, which sometimes doesn't exist on
// line, abnormally-long lines in a larger block.
var lineSrcLineParts = /^(.*?)(?:\s*\/\/ (\d+))?$/.exec(lineContent);
// The line didn't match at all? Let's just not try.
if (!lineSrcLineParts) {
return;
}
var lineSrcLineContent = lineSrcLineParts[1];
var lineSrcLineNumber = lineSrcLineParts[2];
// Count backward from the failed line to find the filename.
for (var c = parseErrorContentIndex - 1; c >= 0; c--) {
var sourceLine = contents[c];
// If the line is a boatload of slashes, we're in the right place.
if (/^\/\/\/{6,}$/.test(sourceLine)) {
// If 4 lines back is the same exact line, we've found the framing.
if (contents[c - 4] === sourceLine) {
// So in that case, 2 lines back is the file path.
var parseErrorPath = contents[c - 2]
.substring(3)
.replace(/\s+\/\//, "");
var minError = new Error(
"UglifyJS minification error: \n\n" +
error.message + " at " + parseErrorPath +
(lineSrcLineNumber ? " line " + lineSrcLineNumber + "\n\n" : "") +
" within " + file.getPathInBundle() + " " +
lineErrorMessage + ":\n\n" +
lineSrcLineContent + "\n"
);
throw minError;
}
}
}
}
}
var allJs = '';
files.forEach(function (file) {
// Don't reminify *.min.js.
if (/\.min\.js$/.test(file.getPathInBundle())) {
allJs += file.getContentsAsString();
} else {
allJs += UglifyJSMinify(file.getContentsAsString(), minifyOptions).code;
var minified;
try {
minified = UglifyJSMinify(file.getContentsAsString(), minifyOptions);
if (!(minified && typeof minified.code === "string")) {
throw new Error();
}
} catch (err) {
var filePath = file.getPathInBundle();
// Try to catch the ugly Uglify error.
maybeThrowMinifyErrorBySourceFile(err, file);
err.message += " while minifying " + filePath;
throw err;
}
allJs += minified.code;
}
allJs += '\n\n';
@@ -49,5 +145,3 @@ UglifyJSMinifier.prototype.processFilesForBundle = function (files, options) {
files[0].addJavaScript({ data: allJs });
}
};