`minify` cannot remove unused branch
Reproduction link:
https://esbuild.github.io/try/#YgAwLjI1LjIAeyAgICAKICAgIGZvcm1hdDogImVzbSIsCiAgICBtaW5pZnk6IHRydWUsCiAgICB0cmVlU2hha2luZzogdHJ1ZSwKfQBlAGVudHJ5LmpzAHZhciBmb28gPSAxOwpjb25zdCBmYWxzZV9kZWZhdWx0ID0gZmFsc2U7CgpleHBvcnQgZnVuY3Rpb24gZm4oKSB7CiAgaWYgKGZhbHNlX2RlZmF1bHQpIHsKICAgIGNvbnNvbGUud2FybigiSSBleHBlY3QgdGhpcyBzdHJpbmcgdG8gYmUgcmVtb3ZlZCIpCiAgfQoKICBjb25zb2xlLmxvZyhmb28pCn0
Expected output:
var e=1;function o(){console.log(e)}export{o as fn};
Actual output:
var o=1;const e=!1;function n(){e&&console.warn("I expect this string to be removed"),console.log(o)}export{n as fn};
For unknown reason, if I move var foo = 1; below const false_default = false;, I can get the expected output.
As a special case, esbuild supports some limited inlining of constants if they are declared at the top of the file. It doesn't contain a more advanced symbolic evaluator though and doesn't attempt to evaluate code once non-constants are involved.
Thanks for the explanation.
To provide some more context, I first found this issue when I try to import a const value from another file. Below is a simple example:
https://esbuild.github.io/try/#YgAwLjI1LjIAeyAgICAKICAgIGZvcm1hdDogImVzbSIsCiAgICBtaW5pZnk6IHRydWUsCiAgICB0cmVlU2hha2luZzogdHJ1ZSwKICAgIGJ1bmRsZTogdHJ1ZSwKfQBlAGVudHJ5LmpzAGltcG9ydCB7IGZvbyB9IGZyb20gJy4vZm9vJzsKCi8vIFRoaXMgd29ya3MgYXMgZXhwZWN0ZWQ6Ci8vIGltcG9ydCB7IGZhbHNlX2RlZmF1bHQgfSBmcm9tICcuL2ZhbHNlX2RlZmF1bHQnOwoKLy8gVGhpcyBkb2Vzbid0IHdvcms6CmltcG9ydCBmYWxzZV9kZWZhdWx0IGZyb20gJy4vZmFsc2VfZGVmYXVsdCc7CgpleHBvcnQgZnVuY3Rpb24gZm4oKSB7CiAgaWYgKGZhbHNlX2RlZmF1bHQpIHsKICAgIGNvbnNvbGUud2FybigiSSBleHBlY3QgdGhpcyBzdHJpbmcgdG8gYmUgcmVtb3ZlZCIpCiAgfQogIGNvbnNvbGUubG9nKGZvbykKfQAAZm9vLmpzAGV4cG9ydCBjb25zdCBmb28gPSAxOwAAZmFsc2VfZGVmYXVsdC5qcwBjb25zdCBmYWxzZV9kZWZhdWx0ID0gZmFsc2U7CmV4cG9ydCBkZWZhdWx0IGZhbHNlX2RlZmF1bHQ7CmV4cG9ydCB7IGZhbHNlX2RlZmF1bHQgfSA
In this example, there is not var in my source code. But maybe the Top-level var added by esbuild somehow breaks it.