diff --git a/cli/options.js b/cli/options.js index e10ae1e..f6377e0 100644 --- a/cli/options.js +++ b/cli/options.js @@ -16,6 +16,7 @@ function options(args) { 'videos', 'inlinemin', 'preserve-comments', + 'iesafe', ], string: [ // options 'encoding', diff --git a/docs/usage.txt b/docs/usage.txt index b8ffa8d..b4f74f5 100644 --- a/docs/usage.txt +++ b/docs/usage.txt @@ -10,6 +10,7 @@ -n, --nocompress don't compress CSS or HTML - useful for debugging -i, --noimages don't encode images - keeps files size small, but more requests -m, --inlinemin inline minified files + --iesafe safe JS compression for older IE 6/7/8 --videos encode videos (and their poster image) - disabled by default --nosvg don't compress SVG (through SVGO) --skip-absolute-urls don't inline links with absolute URLs diff --git a/lib/defaults.js b/lib/defaults.js index ea69389..d98dfd0 100644 --- a/lib/defaults.js +++ b/lib/defaults.js @@ -7,5 +7,6 @@ module.exports = function () { nosvg: false, // by default, DO compress SVG with SVGO skipAbsoluteUrls: false, preserveComments: false, + iesafe: false, }; }; diff --git a/lib/javascript.js b/lib/javascript.js index 415dce8..01e1166 100644 --- a/lib/javascript.js +++ b/lib/javascript.js @@ -4,6 +4,8 @@ var debug = require('debug')('inliner'); var UglifyJS = require('uglify-js'); function uglify(source) { + var notIESafe = !this.options.iesafe; + this.emit('progress', 'compressing javascript'); source = source.trim(); @@ -20,6 +22,13 @@ function uglify(source) { try { result = UglifyJS.minify(source, { fromString: true, + // must set screw_ie8 for each option group + // https://github.com/mishoo/UglifyJS2/issues/1204#issuecomment-234714094 + // jscs:disable requireCamelCaseOrUpperCaseIdentifiers + compress: { screw_ie8: notIESafe }, + mangle: { screw_ie8: notIESafe }, + output: { screw_ie8: notIESafe }, + // jscs:enable requireCamelCaseOrUpperCaseIdentifiers }).code; } catch (e) { // failed to uglify, just return it plain diff --git a/test/fixtures/script-ie.js b/test/fixtures/script-ie.js new file mode 100644 index 0000000..db5187b --- /dev/null +++ b/test/fixtures/script-ie.js @@ -0,0 +1,5 @@ +function doit() { + var foo = {default:'bar'}; + // default is a reserved word which breaks parsing in IE<=8 + return foo.default; +} diff --git a/test/fixtures/script-iesafe.opts.json b/test/fixtures/script-iesafe.opts.json new file mode 100644 index 0000000..ca174fd --- /dev/null +++ b/test/fixtures/script-iesafe.opts.json @@ -0,0 +1,3 @@ +{ + "iesafe": true +} diff --git a/test/fixtures/script-iesafe.result.html b/test/fixtures/script-iesafe.result.html new file mode 100644 index 0000000..296e230 --- /dev/null +++ b/test/fixtures/script-iesafe.result.html @@ -0,0 +1 @@ + iesafe diff --git a/test/fixtures/script-iesafe.src.html b/test/fixtures/script-iesafe.src.html new file mode 100644 index 0000000..8f35437 --- /dev/null +++ b/test/fixtures/script-iesafe.src.html @@ -0,0 +1,10 @@ + + + + + iesafe + + + + + diff --git a/test/fixtures/script-ieunsafe.result.html b/test/fixtures/script-ieunsafe.result.html new file mode 100644 index 0000000..c27bc66 --- /dev/null +++ b/test/fixtures/script-ieunsafe.result.html @@ -0,0 +1 @@ + ieunsafe diff --git a/test/fixtures/script-ieunsafe.src.html b/test/fixtures/script-ieunsafe.src.html new file mode 100644 index 0000000..580e6d8 --- /dev/null +++ b/test/fixtures/script-ieunsafe.src.html @@ -0,0 +1,10 @@ + + + + + ieunsafe + + + + +