reduce_merge_const: { options = { merge_vars: true, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { const a = console; console.log(typeof a); var b = typeof a; console.log(b); } expect: { var b = console; console.log(typeof b); b = typeof b; console.log(b); } expect_stdout: [ "object", "object", ] } reduce_merge_let: { options = { merge_vars: true, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { "use strict"; let a = console; console.log(typeof a); var b = typeof a; console.log(b); } expect: { "use strict"; var b = console; console.log(typeof b); b = typeof b; console.log(b); } expect_stdout: [ "object", "object", ] node_version: ">=4" } reduce_block_const: { options = { reduce_vars: true, toplevel: true, varify: true, } input: { { const a = typeof console; console.log(a); } } expect: { var a = typeof console; console.log(a); } expect_stdout: "object" } reduce_block_let: { options = { reduce_vars: true, toplevel: true, varify: true, } input: { "use strict"; { let a = typeof console; console.log(a); } } expect: { "use strict"; var a = typeof console; console.log(a); } expect_stdout: "object" node_version: ">=4" } hoist_props_const: { options = { hoist_props: true, passes: 2, reduce_vars: true, toplevel: true, varify: true, } input: { { const o = { p: "PASS", }; console.log(o.p); } } expect: { var o_p = "PASS"; console.log(o_p); } expect_stdout: "PASS" } hoist_props_let: { options = { hoist_props: true, passes: 2, reduce_vars: true, toplevel: true, varify: true, } input: { "use strict"; { let o = { p: "PASS", }; console.log(o.p); } } expect: { "use strict"; var o_p = "PASS"; console.log(o_p); } expect_stdout: "PASS" node_version: ">=4" } scope_adjustment_const: { options = { conditionals: true, inline: true, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { for (var k in [ 42 ]) console.log(function f() { if (k) { const a = 0; } }()); } expect: { for (var k in [ 42 ]) console.log(void (k && 0)); } expect_stdout: "undefined" } scope_adjustment_let: { options = { conditionals: true, inline: true, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { "use strict"; for (var k in [ 42 ]) console.log(function f() { if (k) { let a = 0; } }()); } expect: { "use strict"; for (var k in [ 42 ]) console.log(void (k && 0)); } expect_stdout: "undefined" node_version: ">=4" } issue_4191_const: { options = { functions: true, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { const a = function() {}; console.log(typeof a, a()); } expect: { function a() {}; console.log(typeof a, a()); } expect_stdout: "function undefined" } issue_4191_let: { options = { functions: true, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { "use strict"; let a = function() {}; console.log(typeof a, a()); } expect: { "use strict"; function a() {}; console.log(typeof a, a()); } expect_stdout: "function undefined" node_version: ">=4" } forin_const_1: { options = { join_vars: true, reduce_vars: true, toplevel: true, varify: true, } input: { const o = { foo: 42, bar: "PASS", }; for (const k in o) console.log(k, o[k]); } expect: { var o = { foo: 42, bar: "PASS", }; for (const k in o) console.log(k, o[k]); } expect_stdout: true node_version: ">=4" } forin_const_2: { options = { join_vars: true, reduce_vars: true, toplevel: true, varify: true, } input: { const o = { p: 42, q: "PASS", }; for (const [ k ] in o) console.log(k, o[k]); } expect: { var o = { p: 42, q: "PASS", }, k; for ([ k ] in o) console.log(k, o[k]); } expect_stdout: [ "p 42", "q PASS", ] node_version: ">=6" } forin_let_1: { options = { join_vars: true, reduce_vars: true, toplevel: true, varify: true, } input: { "use strict"; let o = { foo: 42, bar: "PASS", }; for (let k in o) console.log(k, o[k]); } expect: { "use strict"; var o = { foo: 42, bar: "PASS", }, k; for (k in o) console.log(k, o[k]); } expect_stdout: [ "foo 42", "bar PASS", ] node_version: ">=4" } forin_let_2: { options = { join_vars: true, reduce_vars: true, toplevel: true, varify: true, } input: { let o = { p: 42, q: "PASS", }; for (let [ k ] in o) console.log(k, o[k]); } expect: { var o = { p: 42, q: "PASS", }, k; for ([ k ] in o) console.log(k, o[k]); } expect_stdout: [ "p 42", "q PASS", ] node_version: ">=6" } loop_scope_1: { options = { toplevel: true, varify: true, } input: { "use strict"; var o = { foo: 1, bar: 2 }; for (let i in o) { console.log(i); } for (const j in o) setTimeout(() => console.log(j), 0); for (let k in o) setTimeout(function() { console.log(k); }, 0); } expect: { "use strict"; var o = { foo: 1, bar: 2 }; for (var i in o) console.log(i); for (const j in o) setTimeout(() => console.log(j), 0); for (let k in o) setTimeout(function() { console.log(k); }, 0); } expect_stdout: [ "foo", "bar", "foo", "bar", "foo", "bar", ] node_version: ">=4" } loop_scope_2: { options = { reduce_vars: true, toplevel: true, varify: true, } input: { "use strict"; var a = [ "foo", "bar" ]; for (var i = 0; i < a.length; i++) { const x = a[i]; console.log(x); let y = a[i]; setTimeout(() => console.log(y), 0); const z = a[i]; setTimeout(function() { console.log(z); }, 0); } } expect: { "use strict"; var a = [ "foo", "bar" ]; for (var i = 0; i < a.length; i++) { var x = a[i]; console.log(x); let y = a[i]; setTimeout(() => console.log(y), 0); const z = a[i]; setTimeout(function() { console.log(z); }, 0); } } expect_stdout: [ "foo", "bar", "foo", "foo", "bar", "bar", ] node_version: ">=4" } issue_4290_1_const: { options = { reduce_vars: true, toplevel: true, varify: true, } input: { const a = 0; var a; } expect: { const a = 0; var a; } expect_stdout: true } issue_4290_1_let: { options = { reduce_vars: true, toplevel: true, varify: true, } input: { "use strict"; let a = 0; var a; } expect: { "use strict"; let a = 0; var a; } expect_stdout: true node_version: ">=4" } drop_forin_let: { options = { loops: true, toplevel: true, unused: true, varify: true, } input: { "use strict"; for (let a in console.log("PASS")); } expect: { "use strict"; console.log("PASS"); } expect_stdout: "PASS" node_version: ">=4" } default_init: { options = { join_vars: true, reduce_vars: true, unused: true, varify: true, } input: { A = "PASS"; (function() { "use strict"; let a; a = A; console.log(a); })(); } expect: { A = "PASS"; (function() { "use strict"; var a = A; console.log(a); })(); } expect_stdout: "PASS" node_version: ">=4" } issue_4933_1: { options = { reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { console.log(f()); function f() { var a; for (console in a = [ f ]) { const b = a; } } } expect: { console.log(function f() { var a; for (console in a = [ f ]) { const b = a; } }()); } expect_stdout: "undefined" } issue_4933_2: { options = { passes: 2, reduce_vars: true, toplevel: true, unused: true, varify: true, } input: { console.log(f()); function f() { var a; for (console in a = [ f ]) { const b = a; } } } expect: { console.log(function f() { for (console in [ f ]); }()); } expect_stdout: "undefined" } issue_4954: { options = { functions: true, reduce_vars: true, unused: true, varify: true, } input: { "use strict"; (function() { { let a = console; console.log(typeof a); } { let a = function() {}; a && console.log(typeof a); } })(); } expect: { "use strict"; (function() { var a = console; console.log(typeof a); { let a = function() {}; a && console.log(typeof a); } })(); } expect_stdout: [ "object", "function", ] node_version: ">=4" }