Dead code analysis treats all top level vars as const and not global scope varibales that are subject to change
- Dominant language
- JavaScript
- Stars
- 4.4k
- Forks
- 217
- PR merge metrics
- No merged PRs in 30d
Description
When compiling [this](https://raw.githubusercontent.com/MVC-JS/MVC.js/master/src/core.js) the compiler assumes that `repeatDependencyExists` is always false (the value its initialized to), even though it's changed to true in a diffrent file.
Here is the Babel REPL results:
[Babel REPL](https://babeljs.io/repl/#?babili=true&evaluate=true&lineWrap=true&presets=es2015%2Cstage-3&code=%2F%2Fallows%20us%20to%20make%20repeat.js%20as%20an%20optional%20dependency%2C%20and%20only%20call%20its%20functions%20if%20this%20variable%20is%20set%20to%20true%20by%20the%20dependency%0Avar%20repeatDependencyExists%20%3D%20false%3B%0A%0A%2F%2Fa%20proxy%20is%20basically%20a%20fake%20object%20that%20let's%20you%20listen%20for%20cool%20events%20like%20set%2C%20read%2C%20and%20construct%0Avar%20MVC%20%3D%20new%20Proxy%28function%20%28%29%20%7B%7D%2C%20%7B%0A%20%20%20%20%2F%2Fcreate%20a%20%22fake%22%20constructor%20that%20allows%20me%20to%20return%20the%20set%20trapped%20proxy%0A%20%20%20%20construct%3A%20function%20%28%29%20%7B%20%2F%2Fwhen%20the%20%22fake%22%20constructor%20is%20called%20%28using%20the%20new%20keyword%29%0A%20%20%20%20%20%20%20%20%2F%2Freturn%20a%20Proxy%20instance%20that%20has%20a%20set%20trap%0A%20%20%20%20%20%20%20%20%2F%2Fwhich%20means%20it%20will%20call%20a%20function%20when%20ever%20something%20is%20written%20to%20that%20proxy%0A%0A%20%20%20%20%20%20%20%20var%20handler%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20set%3A%20function%20%28target%2C%20property%2C%20value%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fconsole.log%28%22handling%20set%22%2C%20property%2C%20%22%3A%22%2C%20value%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28repeatDependencyExists%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20handleChangedArrays%28target%2C%20property%2C%20value%2C%20handler%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28typeof%20value%20%3D%3D%3D%20%22object%22%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fif%20the%20property%20is%20set%20to%20a%20new%20object%2C%20return%20that%20object%20as%20a%20proxy%20with%20the%20current%20handler%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target%5Bproperty%5D%20%3D%20new%20Proxy%28value%2C%20handler%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Factually%20write%20to%20the%20object%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target%5Bproperty%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20%28var%20element%20of%20document.getElementsByClassName%28%22mvc%22%29%29%20%7B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20originalExpression%20%3D%20element.dataset.originalExpression%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Frevalue%20any%20expression%20that%20uses%20this%20property%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28originalExpression.includes%28property%29%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20element.innerHTML%20%3D%20eval%28originalExpression%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20return%20new%20Proxy%28%7B%7D%2C%20handler%29%3B%0A%20%20%20%20%7D%0A%7D%29%3B%0A%0Awindow.addEventListener%28%22load%22%2C%20function%20%28%29%20%7B%0A%0A%20%20%20%20%2F%2Frepeat.js%20dependency%20is%20optional%2C%20so%20check%20if%20it%20exists%20before%20using%20it%0A%20%20%20%20if%28repeatDependencyExists%29%7B%0A%20%20%20%20%20%20%20%20parseRepeats%28%29%3B%0A%20%20%20%20%7Delse%7B%0A%20%20%20%20%20%20%20%20%2F%2Frepeat.js%20dependency%20missing%2C%20check%20if%20any%20mvc-repeat%20elements%20exist%20and%20give%20an%20error%20if%20they%20do%0A%20%20%20%20%20%20%20%20if%28document.getElementsByClassName%28%22mvc-repeat%22%29.length%20%3E%200%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20console.error%28%22MVC.js%3A%20mvc-repeat%20element%20exists%2C%20but%20repeat.js%20dependency%20missing%22%29%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20parseHandlebarsInBody%280%29%3B%0A%0A%20%20%20%20%2F%2FDone%2C%20call%20the%20onload%20event%20function%20if%20exists%20%28it%20is%20optional%20to%20consume%20it%29%0A%20%20%20%20if%28MVC.onload%20!%3D%3D%20undefined%29%7B%0A%20%20%20%20%20%20%20%20MVC.onload%28%29%3B%0A%20%20%20%20%7D%0A%7D%29%3B%0A%0A%2F**%0A%20*%20Recursively%20parses%20all%20handlebars%0A%20*%2F%0Afunction%20parseHandlebarsInBody%28startingPosition%29%20%7B%0A%20%20%20%20let%20indexOfOpeningHandlebar%20%3D%20document.body.innerHTML.indexOf%28%22%7B%7B%22%2C%20startingPosition%29%3B%0A%0A%20%20%20%20var%20isEscapedHandlebar%20%3D%20document.body.innerHTML.charAt%28indexOfOpeningHandlebar%20-%201%29%20%3D%3D%3D%20%22~%22%3B%0A%0A%20%20%20%20if%20%28indexOfOpeningHandlebar%20!%3D%3D%20-1%29%20%7B%0A%20%20%20%20%20%20%20%20if%28isEscapedHandlebar%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fcall%20the%20function%20recursively%2C%20from%20the%20next%20position%20after%20the%20current%20opening%20handlebar%0A%20%20%20%20%20%20%20%20%20%20%20%20parseHandlebarsInBody%28indexOfOpeningHandlebar%20%2B%201%29%0A%20%20%20%20%20%20%20%20%7Delse%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20startOfExpression%20%3D%20indexOfOpeningHandlebar%20%2B%202%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20endOfExpression%20%3D%20document.body.innerHTML.indexOf%28%22%7D%7D%22%2C%20indexOfOpeningHandlebar%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20expression%20%3D%20document.body.innerHTML.substring%28startOfExpression%2C%20endOfExpression%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20valueOfExpression%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valueOfExpression%20%3D%20eval%28expression%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28err%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fif%20expression%20is%20undefined%2C%20or%20there%20are%20any%20other%20problems%20evaluating%2C%20gracefully%20fail%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.warn%28%22Gracefully%20failing%2C%20expression%20evaluation%20error%22%2C%20err%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valueOfExpression%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28valueOfExpression%20%3D%3D%3D%20undefined%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valueOfExpression%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20let%20newElement%20%3D%20%22%3Cspan%20class%3D'mvc'%20data-original-expression%3D'%22%20%2B%20expression%20%2B%20%22'%3E%22%20%2B%20valueOfExpression.toString%28%29%20%2B%20%22%3C%2Fspan%3E%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20document.body.innerHTML%20%3D%20document.body.innerHTML.substring%280%2C%20indexOfOpeningHandlebar%29%20%2B%20newElement%20%2B%20document.body.innerHTML.substring%28endOfExpression%20%2B%202%2C%20document.body.innerHTML.length%29%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Frecursive%20from%20the%20beginning%0A%20%20%20%20%20%20%20%20%20%20%20%20parseHandlebarsInBody%280%29%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%7D%0A%0A%0A%2F%2FPolyfill%20for%20String.prototype.includes%0Aif%20%28!String.prototype.includes%29%20%7B%0A%20%20%20%20String.prototype.includes%20%3D%20function%20%28search%2C%20start%29%20%7B%0A%20%20%20%20%20%20%20%20'use%20strict'%3B%0A%20%20%20%20%20%20%20%20if%20%28typeof%20start%20!%3D%3D%20'number'%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20start%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if%20%28start%20%2B%20search.length%20%3E%20this.length%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20this.indexOf%28search%2C%20start%29%20!%3D%3D%20-1%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%3B%0A%7D)
Notice that
``` javascript
window.addEventListener("load", function () {
//repeat.js dependency is optional, so check if it exists before using it
if(repeatDependencyExists){
parseRepeats();
}else{
//repeat.js dependency missing, check if any mvc-repeat elements exist and give an error if they do
if(document.getElementsByClassName("mvc-repeat").length > 0){
console.error("MVC.js: mvc-repeat element exists, but repeat.js dependency missing")
}
}
parseHandlebarsInBody(0);
//Done, call the onload event function if exists (it is optional to consume it)
if(MVC.onload !== undefined){
MVC.onload();
}
});
```
Gets minified to (whitespace added for readability):
``` javascript
window.addEventListener("load",function(){
0
Contributor guide
Assessment
This issue has not been assessed yet.