GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Branch master (b17032)
by Keith
68:36
created

third-party/countUp.js-2.0.4/demo.js   C

Complexity

Total Complexity 57
Complexity/F 2.71

Size

Lines of Code 227
Function Count 21

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 175
dl 0
loc 227
rs 5.04
c 0
b 0
f 0
wmc 57
mnd 36
bc 36
fnc 21
bpm 1.7142
cpm 2.7142
noi 4

7 Functions

Rating   Name   Duplication   Size   Complexity  
A demo.js ➔ methodToCallOnComplete 0 4 1
F demo.js ➔ updateCodeVisualizer 0 45 20
F demo.js ➔ getEasingFn 0 10 15
A demo.js ➔ getEasingFnBody 0 10 4
A demo.js ➔ createCountUp 0 19 4
A demo.js ➔ establishOptionsFromInputs 0 24 5
A demo.js ➔ getNumerals 0 12 2

How to fix   Complexity   

Complexity

Complex classes like third-party/countUp.js-2.0.4/demo.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
import { CountUp } from './dist/countUp.js';
2
3
window.onload = function () {
4
  var input = function (id) {
5
    return document.getElementById(id);
6
  };
7
  var code, stars, endVal, options;
8
  var demo = new CountUp('myTargetElement', 100);
9
  var codeVisualizer = document.getElementById('codeVisualizer');
10
  var errorSection = document.getElementById('errorSection');
11
  document.getElementById('version').innerHTML = demo.version;
12
  // HANDLERS
13
  input('startVal').onchange = updateCodeVisualizer;
14
  input('endVal').onchange = updateCodeVisualizer;
15
  input('decimalPlaces').onchange = updateCodeVisualizer;
16
  input('duration').onchange = updateCodeVisualizer;
17
  input('separator').onchange = updateCodeVisualizer;
18
  input('decimal').onchange = updateCodeVisualizer;
19
  input('prefix').onchange = updateCodeVisualizer;
20
  input('suffix').onchange = updateCodeVisualizer;
21
  input('useEasing').onclick = updateCodeVisualizer;
22
  input('useGrouping').onclick = updateCodeVisualizer;
23
  input('useOnComplete').onclick = updateCodeVisualizer;
24
  input('easingFnsDropdown').onchange = updateCodeVisualizer;
25
  input('numeralsDropdown').onchange = updateCodeVisualizer;
26
  document.getElementById('swapValues').onclick = function () {
27
    var oldStartVal = input('startVal').value;
28
    var oldEndVal = input('endVal').value;
29
    input('startVal').value = oldEndVal;
30
    input('endVal').value = oldStartVal;
31
    updateCodeVisualizer();
32
  };
33
  document.getElementById('start').onclick = createCountUp;
34
  document.getElementById('apply').onclick = createCountUp;
35
  document.getElementById('pauseResume').onclick = function () {
36
    code += '<br>demo.pauseResume();';
37
    codeVisualizer.innerHTML = code;
38
    demo.pauseResume();
39
  };
40
  document.getElementById('reset').onclick = function () {
41
    code += '<br>demo.reset();';
42
    codeVisualizer.innerHTML = code;
43
    demo.reset();
44
  };
45
  document.getElementById('update').onclick = function () {
46
    var updateVal = input('updateVal').value;
47
    var num = updateVal ? updateVal : 0;
48
    code += "<br>demo.update(" + num + ");";
49
    codeVisualizer.innerHTML = code;
50
    demo.update(num);
51
  };
52
  input('updateVal').onchange = function () {
53
    var updateVal = input('updateVal').value;
54
    var num = updateVal ? updateVal : 0;
55
    code += '<br>demo.update(' + num + ');';
56
    codeVisualizer.innerHTML = code;
57
  };
58
  // OPTION VALUES
59
  var easingFunctions = {
60
    easeOutExpo: function (t, b, c, d) {
61
      return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b;
62
    },
63
    outQuintic: function (t, b, c, d) {
64
      var ts = (t /= d) * t;
65
      var tc = ts * t;
66
      return b + c * (tc * ts + -5 * ts * ts + 10 * tc + -10 * ts + 5 * t);
67
    },
68
    outCubic: function (t, b, c, d) {
69
      var ts = (t /= d) * t;
70
      var tc = ts * t;
71
      return b + c * (tc + -3 * ts + 3 * t);
72
    }
73
  };
74
  function getEasingFn() {
75
    var fn = input('easingFnsDropdown').value;
76
    if (fn === 'easeOutExpo') {
77
      return null;
78
    }
79
    if (typeof easingFunctions[fn] === 'undefined') {
80
      return undefined;
81
    }
82
    return easingFunctions[fn];
83
  }
84
  function getEasingFnBody(fn) {
85
    fn = typeof fn === 'undefined' ? getEasingFn() : fn;
86
    if (typeof fn === 'undefined') {
87
      return 'undefined function';
88
    }
89
    if (fn !== null) {
90
      return fn.toString().replace(/^ {8}/gm, '');
91
    }
92
    return '';
93
  }
94
  function getNumerals() {
95
    var numeralsCode = input('numeralsDropdown').value;
96
    // optionally provide alternates for 0-9
97
    switch (numeralsCode) {
98
      case 'ea': // Eastern Arabic
99
        return ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];
100
      case 'fa': // Farsi
101
        return ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
102
      default:
103
        return null;
104
    }
105
  }
106
  var stringifyArray = function (arr) { return '[\'' + arr.join('\', \'') + '\']'; };
107
  // COUNTUP AND CODE VISUALIZER
108
  function createCountUp() {
109
    establishOptionsFromInputs();
110
    demo = new CountUp('myTargetElement', endVal, options);
111
    if (!demo.error) {
112
      errorSection.style.display = 'none';
113
      if (input('useOnComplete').checked) {
114
        demo.start(methodToCallOnComplete);
115
      }
116
      else {
117
        demo.start();
118
      }
119
      updateCodeVisualizer();
120
    }
121
    else {
122
      errorSection.style.display = 'block';
123
      document.getElementById('error').innerHTML = demo.error;
124
      console.error(demo.error);
125
    }
126
  }
127
  function methodToCallOnComplete() {
128
    console.log('COMPLETE!');
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
129
    alert('COMPLETE!');
0 ignored issues
show
Debugging Code Best Practice introduced by
The alert UI element is often considered obtrusive and is generally only used as a temporary measure. Consider replacing it with another UI element.
Loading history...
130
  }
131
  function establishOptionsFromInputs() {
132
    endVal = Number(input('endVal').value);
133
    options = {
134
      startVal: input('startVal').value,
135
      decimalPlaces: input('decimalPlaces').value,
136
      duration: Number(input('duration').value),
137
      useEasing: input('useEasing').checked,
138
      useGrouping: input('useGrouping').checked,
139
      easingFn: typeof getEasingFn() === 'undefined' ? null : getEasingFn(),
140
      separator: input('separator').value,
141
      decimal: input('decimal').value,
142
      prefix: input('prefix').value,
143
      suffix: input('suffix').value,
144
      numerals: getNumerals()
145
    };
146
    // unset null values so they don't overwrite defaults
147
    for (var key in options) {
148
      if (options.hasOwnProperty(key)) {
149
        if (options[key] === null) {
150
          delete options[key];
151
        }
152
      }
153
    }
154
  }
155
  function updateCodeVisualizer() {
156
    establishOptionsFromInputs();
157
    code = '';
158
    if (options.useEasing && options.easingFn) {
159
      code += 'const easingFn = ';
160
      var split = getEasingFnBody(options.easingFn).split('\n');
161
      for (var line in split) {
162
        if (split.hasOwnProperty(line)) {
163
          code += split[line].replace(' ', '&nbsp;') + '<br>';
0 ignored issues
show
Bug introduced by
The variable code is changed as part of the for-each loop for example by split.line.replace(" ", "&nbsp;") + "<br>" on line 163. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
164
        }
165
      }
166
    }
167
    function indentedLine(keyPair, singleLine) {
168
      if (singleLine === void 0) { singleLine = false; }
0 ignored issues
show
Coding Style introduced by
Consider using undefined instead of void(0). It is equivalent and more straightforward to read.
Loading history...
169
      var delimeter = (singleLine) ? ';' : ',';
170
      return "&emsp;&emsp;" + keyPair + delimeter + "<br>";
171
    }
172
    var opts = '';
173
    opts += (options.startVal !== '0') ? indentedLine("startVal: " + options.startVal) : '';
174
    opts += (options.decimalPlaces !== '0') ? indentedLine("decimalPlaces: " + options.decimalPlaces) : '';
175
    opts += (options.duration !== 2) ? indentedLine("duration: " + options.duration) : '';
176
    opts += (options.useEasing) ? '' : indentedLine("useEasing: " + options.useEasing);
177
    opts += (options.useEasing && options.easingFn) ? indentedLine("easingFn") : '';
178
    opts += (options.useGrouping) ? '' : indentedLine("useGrouping: " + options.useGrouping);
179
    opts += (options.separator !== ',') ? indentedLine("separator: '" + options.separator + "'") : '';
180
    opts += (options.decimal !== '.') ? indentedLine("decimal: '" + options.decimal + "'") : '';
181
    opts += (options.prefix.length) ? indentedLine("prefix: '" + options.prefix + "'") : '';
182
    opts += (options.suffix.length) ? indentedLine("suffix: '" + options.suffix + "'") : '';
183
    opts += (options.numerals && options.numerals.length) ?
184
      indentedLine("numerals: '" + stringifyArray(options.numerals) + "'") : '';
185
    if (opts.length) {
186
      code += "const options = {<br>" + opts + "};<br>";
187
      code += "let demo = new CountUp('myTargetElement', " + endVal + ", options);<br>";
188
    }
189
    else {
190
      code += "let demo = new CountUp('myTargetElement', " + endVal + ");<br>";
191
    }
192
    code += 'if (!demo.error) {<br>';
193
    code += (input('useOnComplete').checked) ?
194
      indentedLine('demo.start(methodToCallOnComplete)', true) : indentedLine('demo.start()', true);
195
    code += '} else {<br>';
196
    code += indentedLine('console.error(demo.error)', true);
197
    code += '}';
198
    codeVisualizer.innerHTML = code;
199
  }
200
  // get current star count
201
  var repoInfoUrl = 'https://api.github.com/repos/inorganik/CountUp.js';
202
  var getStars = new XMLHttpRequest();
203
  getStars.open('GET', repoInfoUrl, true);
204
  getStars.timeout = 5000;
205
  getStars.onreadystatechange = function () {
206
    // 2: received headers,  3: loading, 4: done
207
    if (getStars.readyState === 4) {
208
      if (getStars.status === 200) {
209
        if (getStars.responseText !== 'undefined') {
210
          if (getStars.responseText.length > 0) {
211
            var data = JSON.parse(getStars.responseText);
212
            stars = data.stargazers_count;
213
            // change input values
214
            input('endVal').value = stars;
215
            createCountUp();
216
          }
217
        }
218
      }
219
    }
220
  };
221
  getStars.onerror = function () {
222
    console.error('error getting stars:', getStars.status);
223
    stars = getStars.status;
224
    demo.start();
225
  };
226
  getStars.send();
227
}
228