Completed
Pull Request — master (#10)
by alexfloppy
07:51
created

public/vendor/l5-swagger/lib/es5-shim.js   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 17
rs 9.2
cc 4
nc 3
nop 2
1
/*!
2
 * https://github.com/es-shims/es5-shim
3
 * @license es5-shim Copyright 2009-2015 by contributors, MIT License
4
 * see https://github.com/es-shims/es5-shim/blob/master/LICENSE
5
 */
6
7
// vim: ts=4 sts=4 sw=4 expandtab
8
9
// Add semicolon to prevent IIFE from being passed as argument to concatenated code.
10
;
11
12
// UMD (Universal Module Definition)
13
// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js
14
(function (root, factory) {
15
    'use strict';
16
17
    /* global define, exports, module */
18
    if (typeof define === 'function' && define.amd) {
19
        // AMD. Register as an anonymous module.
20
        define(factory);
21
    } else if (typeof exports === 'object') {
22
        // Node. Does not work with strict CommonJS, but
23
        // only CommonJS-like enviroments that support module.exports,
24
        // like Node.
25
        module.exports = factory();
26
    } else {
27
        // Browser globals (root is window)
28
        root.returnExports = factory();
29
    }
30
}(this, function () {
31
    /**
32
     * Brings an environment as close to ECMAScript 5 compliance
33
     * as is possible with the facilities of erstwhile engines.
34
     *
35
     * Annotated ES5: http://es5.github.com/ (specific links below)
36
     * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
37
     * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/
38
     */
39
40
    // Shortcut to an often accessed properties, in order to avoid multiple
41
    // dereference that costs universally. This also holds a reference to known-good
42
    // functions.
43
    var $Array = Array;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Array as $Array. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
44
    var ArrayPrototype = $Array.prototype;
45
    var $Object = Object;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Object as $Object. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
46
    var ObjectPrototype = $Object.prototype;
47
    var $Function = Function;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Function as $Function. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
48
    var FunctionPrototype = $Function.prototype;
49
    var $String = String;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name String as $String. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
50
    var StringPrototype = $String.prototype;
51
    var $Number = Number;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name Number as $Number. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
52
    var NumberPrototype = $Number.prototype;
53
    var array_slice = ArrayPrototype.slice;
54
    var array_splice = ArrayPrototype.splice;
55
    var array_push = ArrayPrototype.push;
56
    var array_unshift = ArrayPrototype.unshift;
57
    var array_concat = ArrayPrototype.concat;
58
    var array_join = ArrayPrototype.join;
59
    var call = FunctionPrototype.call;
60
    var apply = FunctionPrototype.apply;
61
    var max = Math.max;
62
    var min = Math.min;
63
64
    // Having a toString local variable name breaks in Opera so use to_string.
65
    var to_string = ObjectPrototype.toString;
66
67
    /* global Symbol */
68
    /* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
69
    var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
70
    var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable isES6ClassFn already seems to be declared on line 70. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
Comprehensibility Naming Best Practice introduced by
The variable tryFunctionObject already seems to be declared on line 70. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
Comprehensibility Naming Best Practice introduced by
The variable isCallable already seems to be declared on line 70. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
71
72
    var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable tryRegexExec already seems to be declared on line 72. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
73
    var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable tryStringObject already seems to be declared on line 73. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
74
    /* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */
75
76
    /* inlined from http://npmjs.com/define-properties */
77
    var supportsDescriptors = $Object.defineProperty && (function () {
78
        try {
79
            var obj = {};
80
            $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
81
            for (var _ in obj) { // jscs:ignore disallowUnusedVariables
82
                return false;
83
            }
84
            return obj.x === obj;
85
        } catch (e) { /* this is ES3 */
86
            return false;
87
        }
88
    }());
89
    var defineProperties = (function (has) {
90
        // Define configurable, writable, and non-enumerable props
91
        // if they don't exist.
92
        var defineProperty;
93
        if (supportsDescriptors) {
94
            defineProperty = function (object, name, method, forceAssign) {
95
                if (!forceAssign && (name in object)) {
96
                    return;
97
                }
98
                $Object.defineProperty(object, name, {
99
                    configurable: true,
100
                    enumerable: false,
101
                    writable: true,
102
                    value: method
103
                });
104
            };
105
        } else {
106
            defineProperty = function (object, name, method, forceAssign) {
107
                if (!forceAssign && (name in object)) {
108
                    return;
109
                }
110
                object[name] = method;
111
            };
112
        }
113
        return function defineProperties(object, map, forceAssign) {
114
            for (var name in map) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
115
                if (has.call(map, name)) {
116
                    defineProperty(object, name, map[name], forceAssign);
117
                }
118
            }
119
        };
120
    }(ObjectPrototype.hasOwnProperty));
121
122
    //
123
    // Util
124
    // ======
125
    //
126
127
    /* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */
128
    var isPrimitive = function isPrimitive(input) {
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable isPrimitive already seems to be declared on line 128. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
129
        var type = typeof input;
130
        return input === null || (type !== 'object' && type !== 'function');
131
    };
132
133
    var isActualNaN = $Number.isNaN || function isActualNaN(x) {
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable isActualNaN already seems to be declared on line 133. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
134
        return x !== x;
135
    };
136
137
    var ES = {
138
        // ES5 9.4
139
        // http://es5.github.com/#x9.4
140
        // http://jsperf.com/to-integer
141
        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */
142
        ToInteger: function ToInteger(num) {
143
            var n = +num;
144
            if (isActualNaN(n)) {
145
                n = 0;
146
            } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
147
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
148
            }
149
            return n;
150
        },
151
152
        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */
153
        ToPrimitive: function ToPrimitive(input) {
154
            var val, valueOf, toStr;
155
            if (isPrimitive(input)) {
156
                return input;
157
            }
158
            valueOf = input.valueOf;
159
            if (isCallable(valueOf)) {
160
                val = valueOf.call(input);
161
                if (isPrimitive(val)) {
162
                    return val;
163
                }
164
            }
165
            toStr = input.toString;
166
            if (isCallable(toStr)) {
167
                val = toStr.call(input);
168
                if (isPrimitive(val)) {
169
                    return val;
170
                }
171
            }
172
            throw new TypeError();
173
        },
174
175
        // ES5 9.9
176
        // http://es5.github.com/#x9.9
177
        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */
178
        ToObject: function (o) {
179
            if (o == null) { // this matches both null and undefined
180
                throw new TypeError("can't convert " + o + ' to object');
181
            }
182
            return $Object(o);
183
        },
184
185
        /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */
186
        ToUint32: function ToUint32(x) {
187
            return x >>> 0;
188
        }
189
    };
190
191
    //
192
    // Function
193
    // ========
194
    //
195
196
    // ES-5 15.3.4.5
197
    // http://es5.github.com/#x15.3.4.5
198
199
    var Empty = function Empty() {};
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable Empty already seems to be declared on line 199. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
200
201
    defineProperties(FunctionPrototype, {
202
        bind: function bind(that) { // .length is 1
203
            // 1. Let Target be the this value.
204
            var target = this;
205
            // 2. If IsCallable(Target) is false, throw a TypeError exception.
206
            if (!isCallable(target)) {
207
                throw new TypeError('Function.prototype.bind called on incompatible ' + target);
208
            }
209
            // 3. Let A be a new (possibly empty) internal list of all of the
210
            //   argument values provided after thisArg (arg1, arg2 etc), in order.
211
            // XXX slicedArgs will stand in for "A" if used
212
            var args = array_slice.call(arguments, 1); // for normal call
213
            // 4. Let F be a new native ECMAScript object.
214
            // 11. Set the [[Prototype]] internal property of F to the standard
215
            //   built-in Function prototype object as specified in 15.3.3.1.
216
            // 12. Set the [[Call]] internal property of F as described in
217
            //   15.3.4.5.1.
218
            // 13. Set the [[Construct]] internal property of F as described in
219
            //   15.3.4.5.2.
220
            // 14. Set the [[HasInstance]] internal property of F as described in
221
            //   15.3.4.5.3.
222
            var bound;
223
            var binder = function () {
224
225
                if (this instanceof bound) {
226
                    // 15.3.4.5.2 [[Construct]]
227
                    // When the [[Construct]] internal method of a function object,
228
                    // F that was created using the bind function is called with a
229
                    // list of arguments ExtraArgs, the following steps are taken:
230
                    // 1. Let target be the value of F's [[TargetFunction]]
231
                    //   internal property.
232
                    // 2. If target has no [[Construct]] internal method, a
233
                    //   TypeError exception is thrown.
234
                    // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
235
                    //   property.
236
                    // 4. Let args be a new list containing the same values as the
237
                    //   list boundArgs in the same order followed by the same
238
                    //   values as the list ExtraArgs in the same order.
239
                    // 5. Return the result of calling the [[Construct]] internal
240
                    //   method of target providing args as the arguments.
241
242
                    var result = apply.call(
243
                        target,
244
                        this,
245
                        array_concat.call(args, array_slice.call(arguments))
246
                    );
247
                    if ($Object(result) === result) {
248
                        return result;
249
                    }
250
                    return this;
251
252
                } else {
253
                    // 15.3.4.5.1 [[Call]]
254
                    // When the [[Call]] internal method of a function object, F,
255
                    // which was created using the bind function is called with a
256
                    // this value and a list of arguments ExtraArgs, the following
257
                    // steps are taken:
258
                    // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
259
                    //   property.
260
                    // 2. Let boundThis be the value of F's [[BoundThis]] internal
261
                    //   property.
262
                    // 3. Let target be the value of F's [[TargetFunction]] internal
263
                    //   property.
264
                    // 4. Let args be a new list containing the same values as the
265
                    //   list boundArgs in the same order followed by the same
266
                    //   values as the list ExtraArgs in the same order.
267
                    // 5. Return the result of calling the [[Call]] internal method
268
                    //   of target providing boundThis as the this value and
269
                    //   providing args as the arguments.
270
271
                    // equiv: target.call(this, ...boundArgs, ...args)
272
                    return apply.call(
273
                        target,
274
                        that,
275
                        array_concat.call(args, array_slice.call(arguments))
276
                    );
277
278
                }
279
280
            };
281
282
            // 15. If the [[Class]] internal property of Target is "Function", then
283
            //     a. Let L be the length property of Target minus the length of A.
284
            //     b. Set the length own property of F to either 0 or L, whichever is
285
            //       larger.
286
            // 16. Else set the length own property of F to 0.
287
288
            var boundLength = max(0, target.length - args.length);
289
290
            // 17. Set the attributes of the length own property of F to the values
291
            //   specified in 15.3.5.1.
292
            var boundArgs = [];
293
            for (var i = 0; i < boundLength; i++) {
294
                array_push.call(boundArgs, '$' + i);
295
            }
296
297
            // XXX Build a dynamic function with desired amount of arguments is the only
298
            // way to set the length property of a function.
299
            // In environments where Content Security Policies enabled (Chrome extensions,
300
            // for ex.) all use of eval or Function costructor throws an exception.
301
            // However in all of these environments Function.prototype.bind exists
302
            // and so this code will never be executed.
303
            bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder);
304
305
            if (target.prototype) {
306
                Empty.prototype = target.prototype;
307
                bound.prototype = new Empty();
308
                // Clean up dangling references.
309
                Empty.prototype = null;
310
            }
311
312
            // TODO
313
            // 18. Set the [[Extensible]] internal property of F to true.
314
315
            // TODO
316
            // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
317
            // 20. Call the [[DefineOwnProperty]] internal method of F with
318
            //   arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
319
            //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
320
            //   false.
321
            // 21. Call the [[DefineOwnProperty]] internal method of F with
322
            //   arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
323
            //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
324
            //   and false.
325
326
            // TODO
327
            // NOTE Function objects created using Function.prototype.bind do not
328
            // have a prototype property or the [[Code]], [[FormalParameters]], and
329
            // [[Scope]] internal properties.
330
            // XXX can't delete prototype in pure-js.
331
332
            // 22. Return F.
333
            return bound;
334
        }
335
    });
336
337
    // _Please note: Shortcuts are defined after `Function.prototype.bind` as we
338
    // use it in defining shortcuts.
339
    var owns = call.bind(ObjectPrototype.hasOwnProperty);
340
    var toStr = call.bind(ObjectPrototype.toString);
341
    var arraySlice = call.bind(array_slice);
342
    var arraySliceApply = apply.bind(array_slice);
343
    var strSlice = call.bind(StringPrototype.slice);
344
    var strSplit = call.bind(StringPrototype.split);
345
    var strIndexOf = call.bind(StringPrototype.indexOf);
346
    var pushCall = call.bind(array_push);
347
    var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable);
348
    var arraySort = call.bind(ArrayPrototype.sort);
349
350
    //
351
    // Array
352
    // =====
353
    //
354
355
    var isArray = $Array.isArray || function isArray(obj) {
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable isArray already seems to be declared on line 355. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
356
        return toStr(obj) === '[object Array]';
357
    };
358
359
    // ES5 15.4.4.12
360
    // http://es5.github.com/#x15.4.4.13
361
    // Return len+argCount.
362
    // [bugfix, ielt8]
363
    // IE < 8 bug: [].unshift(0) === undefined but should be "1"
364
    var hasUnshiftReturnValueBug = [].unshift(0) !== 1;
365
    defineProperties(ArrayPrototype, {
366
        unshift: function () {
367
            array_unshift.apply(this, arguments);
368
            return this.length;
369
        }
370
    }, hasUnshiftReturnValueBug);
371
372
    // ES5 15.4.3.2
373
    // http://es5.github.com/#x15.4.3.2
374
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
375
    defineProperties($Array, { isArray: isArray });
376
377
    // The IsCallable() check in the Array functions
378
    // has been replaced with a strict check on the
379
    // internal class of the object to trap cases where
380
    // the provided function was actually a regular
381
    // expression literal, which in V8 and
382
    // JavaScriptCore is a typeof "function".  Only in
383
    // V8 are regular expression literals permitted as
384
    // reduce parameters, so it is desirable in the
385
    // general case for the shim to match the more
386
    // strict and common behavior of rejecting regular
387
    // expressions.
388
389
    // ES5 15.4.4.18
390
    // http://es5.github.com/#x15.4.4.18
391
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach
392
393
    // Check failure of by-index access of string characters (IE < 9)
394
    // and failure of `0 in boxedString` (Rhino)
395
    var boxedString = $Object('a');
396
    var splitString = boxedString[0] !== 'a' || !(0 in boxedString);
397
398
    var properlyBoxesContext = function properlyBoxed(method) {
399
        // Check node 0.6.21 bug where third parameter is not boxed
400
        var properlyBoxesNonStrict = true;
401
        var properlyBoxesStrict = true;
402
        var threwException = false;
403
        if (method) {
404
            try {
405
                method.call('foo', function (_, __, context) {
406
                    if (typeof context !== 'object') {
407
                        properlyBoxesNonStrict = false;
408
                    }
409
                });
410
411
                method.call([1], function () {
412
                    'use strict';
413
414
                    properlyBoxesStrict = typeof this === 'string';
415
                }, 'x');
416
            } catch (e) {
417
                threwException = true;
418
            }
419
        }
420
        return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict;
421
    };
422
423
    defineProperties(ArrayPrototype, {
424
        forEach: function forEach(callbackfn/*, thisArg*/) {
425
            var object = ES.ToObject(this);
426
            var self = splitString && isString(this) ? strSplit(this, '') : object;
427
            var i = -1;
428
            var length = ES.ToUint32(self.length);
429
            var T;
430
            if (arguments.length > 1) {
431
                T = arguments[1];
432
            }
433
434
            // If no callback function or if callback is not a callable function
435
            if (!isCallable(callbackfn)) {
436
                throw new TypeError('Array.prototype.forEach callback must be a function');
437
            }
438
439
            while (++i < length) {
440
                if (i in self) {
441
                    // Invoke the callback function with call, passing arguments:
442
                    // context, property value, property key, thisArg object
443
                    if (typeof T === 'undefined') {
0 ignored issues
show
Bug introduced by
The variable T does not seem to be initialized in case arguments.length > 1 on line 430 is false. Are you sure this can never be the case?
Loading history...
444
                        callbackfn(self[i], i, object);
445
                    } else {
446
                        callbackfn.call(T, self[i], i, object);
447
                    }
448
                }
449
            }
450
        }
451
    }, !properlyBoxesContext(ArrayPrototype.forEach));
452
453
    // ES5 15.4.4.19
454
    // http://es5.github.com/#x15.4.4.19
455
    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map
456
    defineProperties(ArrayPrototype, {
457
        map: function map(callbackfn/*, thisArg*/) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
458
            var object = ES.ToObject(this);
459
            var self = splitString && isString(this) ? strSplit(this, '') : object;
460
            var length = ES.ToUint32(self.length);
461
            var result = $Array(length);
462
            var T;
463
            if (arguments.length > 1) {
464
                T = arguments[1];
465
            }
466
467
            // If no callback function or if callback is not a callable function
468
            if (!isCallable(callbackfn)) {
469
                throw new TypeError('Array.prototype.map callback must be a function');
470
            }
471
472
            for (var i = 0; i < length; i++) {
473
                if (i in self) {
474
                    if (typeof T === 'undefined') {
0 ignored issues
show
Bug introduced by
The variable T does not seem to be initialized in case arguments.length > 1 on line 463 is false. Are you sure this can never be the case?
Loading history...
475
                        result[i] = callbackfn(self[i], i, object);
476
                    } else {
477
                        result[i] = callbackfn.call(T, self[i], i, object);
478
                    }
479
                }
480
            }
481
            return result;
482
        }
483
    }, !properlyBoxesContext(ArrayPrototype.map));
484
485
    // ES5 15.4.4.20
486
    // http://es5.github.com/#x15.4.4.20
487
    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter
488
    defineProperties(ArrayPrototype, {
489
        filter: function filter(callbackfn/*, thisArg*/) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
490
            var object = ES.ToObject(this);
491
            var self = splitString && isString(this) ? strSplit(this, '') : object;
492
            var length = ES.ToUint32(self.length);
493
            var result = [];
494
            var value;
495
            var T;
496
            if (arguments.length > 1) {
497
                T = arguments[1];
498
            }
499
500
            // If no callback function or if callback is not a callable function
501
            if (!isCallable(callbackfn)) {
502
                throw new TypeError('Array.prototype.filter callback must be a function');
503
            }
504
505
            for (var i = 0; i < length; i++) {
506
                if (i in self) {
507
                    value = self[i];
508
                    if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {
0 ignored issues
show
Bug introduced by
The variable T does not seem to be initialized in case arguments.length > 1 on line 496 is false. Are you sure this can never be the case?
Loading history...
509
                        pushCall(result, value);
510
                    }
511
                }
512
            }
513
            return result;
514
        }
515
    }, !properlyBoxesContext(ArrayPrototype.filter));
516
517
    // ES5 15.4.4.16
518
    // http://es5.github.com/#x15.4.4.16
519
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every
520
    defineProperties(ArrayPrototype, {
521
        every: function every(callbackfn/*, thisArg*/) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
522
            var object = ES.ToObject(this);
523
            var self = splitString && isString(this) ? strSplit(this, '') : object;
524
            var length = ES.ToUint32(self.length);
525
            var T;
526
            if (arguments.length > 1) {
527
                T = arguments[1];
528
            }
529
530
            // If no callback function or if callback is not a callable function
531
            if (!isCallable(callbackfn)) {
532
                throw new TypeError('Array.prototype.every callback must be a function');
533
            }
534
535
            for (var i = 0; i < length; i++) {
536
                if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
0 ignored issues
show
Bug introduced by
The variable T does not seem to be initialized in case arguments.length > 1 on line 526 is false. Are you sure this can never be the case?
Loading history...
537
                    return false;
538
                }
539
            }
540
            return true;
541
        }
542
    }, !properlyBoxesContext(ArrayPrototype.every));
543
544
    // ES5 15.4.4.17
545
    // http://es5.github.com/#x15.4.4.17
546
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
547
    defineProperties(ArrayPrototype, {
548
        some: function some(callbackfn/*, thisArg */) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
549
            var object = ES.ToObject(this);
550
            var self = splitString && isString(this) ? strSplit(this, '') : object;
551
            var length = ES.ToUint32(self.length);
552
            var T;
553
            if (arguments.length > 1) {
554
                T = arguments[1];
555
            }
556
557
            // If no callback function or if callback is not a callable function
558
            if (!isCallable(callbackfn)) {
559
                throw new TypeError('Array.prototype.some callback must be a function');
560
            }
561
562
            for (var i = 0; i < length; i++) {
563
                if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {
0 ignored issues
show
Bug introduced by
The variable T does not seem to be initialized in case arguments.length > 1 on line 553 is false. Are you sure this can never be the case?
Loading history...
564
                    return true;
565
                }
566
            }
567
            return false;
568
        }
569
    }, !properlyBoxesContext(ArrayPrototype.some));
570
571
    // ES5 15.4.4.21
572
    // http://es5.github.com/#x15.4.4.21
573
    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce
574
    var reduceCoercesToObject = false;
575
    if (ArrayPrototype.reduce) {
576
        reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) {
577
            return list;
578
        }) === 'object';
579
    }
580
    defineProperties(ArrayPrototype, {
581
        reduce: function reduce(callbackfn/*, initialValue*/) {
582
            var object = ES.ToObject(this);
583
            var self = splitString && isString(this) ? strSplit(this, '') : object;
584
            var length = ES.ToUint32(self.length);
585
586
            // If no callback function or if callback is not a callable function
587
            if (!isCallable(callbackfn)) {
588
                throw new TypeError('Array.prototype.reduce callback must be a function');
589
            }
590
591
            // no value to return if no initial value and an empty array
592
            if (length === 0 && arguments.length === 1) {
593
                throw new TypeError('reduce of empty array with no initial value');
594
            }
595
596
            var i = 0;
597
            var result;
598
            if (arguments.length >= 2) {
599
                result = arguments[1];
600
            } else {
601
                do {
602
                    if (i in self) {
603
                        result = self[i++];
604
                        break;
605
                    }
606
607
                    // if array contains no values, no initial value to return
608
                    if (++i >= length) {
609
                        throw new TypeError('reduce of empty array with no initial value');
610
                    }
611
                } while (true);
612
            }
613
614
            for (; i < length; i++) {
615
                if (i in self) {
616
                    result = callbackfn(result, self[i], i, object);
0 ignored issues
show
Bug introduced by
The variable result seems to not be initialized for all possible execution paths. Are you sure callbackfn handles undefined variables?
Loading history...
617
                }
618
            }
619
620
            return result;
621
        }
622
    }, !reduceCoercesToObject);
623
624
    // ES5 15.4.4.22
625
    // http://es5.github.com/#x15.4.4.22
626
    // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight
627
    var reduceRightCoercesToObject = false;
628
    if (ArrayPrototype.reduceRight) {
629
        reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) {
630
            return list;
631
        }) === 'object';
632
    }
633
    defineProperties(ArrayPrototype, {
634
        reduceRight: function reduceRight(callbackfn/*, initial*/) {
635
            var object = ES.ToObject(this);
636
            var self = splitString && isString(this) ? strSplit(this, '') : object;
637
            var length = ES.ToUint32(self.length);
638
639
            // If no callback function or if callback is not a callable function
640
            if (!isCallable(callbackfn)) {
641
                throw new TypeError('Array.prototype.reduceRight callback must be a function');
642
            }
643
644
            // no value to return if no initial value, empty array
645
            if (length === 0 && arguments.length === 1) {
646
                throw new TypeError('reduceRight of empty array with no initial value');
647
            }
648
649
            var result;
650
            var i = length - 1;
651
            if (arguments.length >= 2) {
652
                result = arguments[1];
653
            } else {
654
                do {
655
                    if (i in self) {
656
                        result = self[i--];
657
                        break;
658
                    }
659
660
                    // if array contains no values, no initial value to return
661
                    if (--i < 0) {
662
                        throw new TypeError('reduceRight of empty array with no initial value');
663
                    }
664
                } while (true);
665
            }
666
667
            if (i < 0) {
668
                return result;
0 ignored issues
show
Bug introduced by
The variable result seems to not be initialized for all possible execution paths.
Loading history...
669
            }
670
671
            do {
672
                if (i in self) {
673
                    result = callbackfn(result, self[i], i, object);
674
                }
675
            } while (i--);
676
677
            return result;
678
        }
679
    }, !reduceRightCoercesToObject);
680
681
    // ES5 15.4.4.14
682
    // http://es5.github.com/#x15.4.4.14
683
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
684
    var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
685
    defineProperties(ArrayPrototype, {
686
        indexOf: function indexOf(searchElement/*, fromIndex */) {
687
            var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
688
            var length = ES.ToUint32(self.length);
689
690
            if (length === 0) {
691
                return -1;
692
            }
693
694
            var i = 0;
695
            if (arguments.length > 1) {
696
                i = ES.ToInteger(arguments[1]);
697
            }
698
699
            // handle negative indices
700
            i = i >= 0 ? i : max(0, length + i);
701
            for (; i < length; i++) {
702
                if (i in self && self[i] === searchElement) {
703
                    return i;
704
                }
705
            }
706
            return -1;
707
        }
708
    }, hasFirefox2IndexOfBug);
709
710
    // ES5 15.4.4.15
711
    // http://es5.github.com/#x15.4.4.15
712
    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf
713
    var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;
714
    defineProperties(ArrayPrototype, {
715
        lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) {
716
            var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);
717
            var length = ES.ToUint32(self.length);
718
719
            if (length === 0) {
720
                return -1;
721
            }
722
            var i = length - 1;
723
            if (arguments.length > 1) {
724
                i = min(i, ES.ToInteger(arguments[1]));
725
            }
726
            // handle negative indices
727
            i = i >= 0 ? i : length - Math.abs(i);
728
            for (; i >= 0; i--) {
729
                if (i in self && searchElement === self[i]) {
730
                    return i;
731
                }
732
            }
733
            return -1;
734
        }
735
    }, hasFirefox2LastIndexOfBug);
736
737
    // ES5 15.4.4.12
738
    // http://es5.github.com/#x15.4.4.12
739
    var spliceNoopReturnsEmptyArray = (function () {
740
        var a = [1, 2];
741
        var result = a.splice();
742
        return a.length === 2 && isArray(result) && result.length === 0;
743
    }());
744
    defineProperties(ArrayPrototype, {
745
        // Safari 5.0 bug where .splice() returns undefined
746
        splice: function splice(start, deleteCount) {
0 ignored issues
show
Unused Code introduced by
The parameter deleteCount is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
Unused Code introduced by
The parameter start is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
747
            if (arguments.length === 0) {
748
                return [];
749
            } else {
750
                return array_splice.apply(this, arguments);
751
            }
752
        }
753
    }, !spliceNoopReturnsEmptyArray);
754
755
    var spliceWorksWithEmptyObject = (function () {
756
        var obj = {};
757
        ArrayPrototype.splice.call(obj, 0, 0, 1);
758
        return obj.length === 1;
759
    }());
760
    defineProperties(ArrayPrototype, {
761
        splice: function splice(start, deleteCount) {
762
            if (arguments.length === 0) {
763
                return [];
764
            }
765
            var args = arguments;
766
            this.length = max(ES.ToInteger(this.length), 0);
767
            if (arguments.length > 0 && typeof deleteCount !== 'number') {
768
                args = arraySlice(arguments);
769
                if (args.length < 2) {
770
                    pushCall(args, this.length - start);
771
                } else {
772
                    args[1] = ES.ToInteger(deleteCount);
773
                }
774
            }
775
            return array_splice.apply(this, args);
776
        }
777
    }, !spliceWorksWithEmptyObject);
778
    var spliceWorksWithLargeSparseArrays = (function () {
779
        // Per https://github.com/es-shims/es5-shim/issues/295
780
        // Safari 7/8 breaks with sparse arrays of size 1e5 or greater
781
        var arr = new $Array(1e5);
782
        // note: the index MUST be 8 or larger or the test will false pass
783
        arr[8] = 'x';
784
        arr.splice(1, 1);
785
        // note: this test must be defined *after* the indexOf shim
786
        // per https://github.com/es-shims/es5-shim/issues/313
787
        return arr.indexOf('x') === 7;
788
    }());
789
    var spliceWorksWithSmallSparseArrays = (function () {
790
        // Per https://github.com/es-shims/es5-shim/issues/295
791
        // Opera 12.15 breaks on this, no idea why.
792
        var n = 256;
793
        var arr = [];
794
        arr[n] = 'a';
795
        arr.splice(n + 1, 0, 'b');
796
        return arr[n] === 'a';
797
    }());
798
    defineProperties(ArrayPrototype, {
799
        splice: function splice(start, deleteCount) {
800
            var O = ES.ToObject(this);
801
            var A = [];
802
            var len = ES.ToUint32(O.length);
803
            var relativeStart = ES.ToInteger(start);
804
            var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);
805
            var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart);
806
807
            var k = 0;
808
            var from;
809
            while (k < actualDeleteCount) {
810
                from = $String(actualStart + k);
811
                if (owns(O, from)) {
812
                    A[k] = O[from];
813
                }
814
                k += 1;
815
            }
816
817
            var items = arraySlice(arguments, 2);
818
            var itemCount = items.length;
819
            var to;
820
            if (itemCount < actualDeleteCount) {
821
                k = actualStart;
822
                var maxK = len - actualDeleteCount;
823
                while (k < maxK) {
824
                    from = $String(k + actualDeleteCount);
825
                    to = $String(k + itemCount);
826
                    if (owns(O, from)) {
827
                        O[to] = O[from];
828
                    } else {
829
                        delete O[to];
830
                    }
831
                    k += 1;
832
                }
833
                k = len;
834
                var minK = len - actualDeleteCount + itemCount;
835
                while (k > minK) {
836
                    delete O[k - 1];
837
                    k -= 1;
838
                }
839
            } else if (itemCount > actualDeleteCount) {
840
                k = len - actualDeleteCount;
841
                while (k > actualStart) {
842
                    from = $String(k + actualDeleteCount - 1);
843
                    to = $String(k + itemCount - 1);
844
                    if (owns(O, from)) {
845
                        O[to] = O[from];
846
                    } else {
847
                        delete O[to];
848
                    }
849
                    k -= 1;
850
                }
851
            }
852
            k = actualStart;
853
            for (var i = 0; i < items.length; ++i) {
854
                O[k] = items[i];
855
                k += 1;
856
            }
857
            O.length = len - actualDeleteCount + itemCount;
858
859
            return A;
860
        }
861
    }, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);
862
863
    var originalJoin = ArrayPrototype.join;
864
    var hasStringJoinBug;
865
    try {
866
        hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3';
867
    } catch (e) {
868
        hasStringJoinBug = true;
869
    }
870
    if (hasStringJoinBug) {
871
        defineProperties(ArrayPrototype, {
872
            join: function join(separator) {
873
                var sep = typeof separator === 'undefined' ? ',' : separator;
874
                return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep);
875
            }
876
        }, hasStringJoinBug);
877
    }
878
879
    var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2';
880
    if (hasJoinUndefinedBug) {
881
        defineProperties(ArrayPrototype, {
882
            join: function join(separator) {
883
                var sep = typeof separator === 'undefined' ? ',' : separator;
884
                return originalJoin.call(this, sep);
885
            }
886
        }, hasJoinUndefinedBug);
887
    }
888
889
    var pushShim = function push(item) {
0 ignored issues
show
Unused Code introduced by
The parameter item is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
890
        var O = ES.ToObject(this);
891
        var n = ES.ToUint32(O.length);
892
        var i = 0;
893
        while (i < arguments.length) {
894
            O[n + i] = arguments[i];
895
            i += 1;
896
        }
897
        O.length = n + i;
898
        return n + i;
899
    };
900
901
    var pushIsNotGeneric = (function () {
902
        var obj = {};
903
        var result = Array.prototype.push.call(obj, undefined);
904
        return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0);
905
    }());
906
    defineProperties(ArrayPrototype, {
907
        push: function push(item) {
0 ignored issues
show
Unused Code introduced by
The parameter item is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
908
            if (isArray(this)) {
909
                return array_push.apply(this, arguments);
910
            }
911
            return pushShim.apply(this, arguments);
912
        }
913
    }, pushIsNotGeneric);
914
915
    // This fixes a very weird bug in Opera 10.6 when pushing `undefined
916
    var pushUndefinedIsWeird = (function () {
917
        var arr = [];
918
        var result = arr.push(undefined);
919
        return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0);
920
    }());
921
    defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird);
922
923
    // ES5 15.2.3.14
924
    // http://es5.github.io/#x15.4.4.10
925
    // Fix boxed string bug
926
    defineProperties(ArrayPrototype, {
927
        slice: function (start, end) {
0 ignored issues
show
Unused Code introduced by
The parameter end is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
Unused Code introduced by
The parameter start is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
928
            var arr = isString(this) ? strSplit(this, '') : this;
929
            return arraySliceApply(arr, arguments);
930
        }
931
    }, splitString);
932
933
    var sortIgnoresNonFunctions = (function () {
934
        try {
935
            [1, 2].sort(null);
936
            [1, 2].sort({});
937
            return true;
938
        } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
939
        return false;
940
    }());
941
    var sortThrowsOnRegex = (function () {
942
        // this is a problem in Firefox 4, in which `typeof /a/ === 'function'`
943
        try {
944
            [1, 2].sort(/a/);
945
            return false;
946
        } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
947
        return true;
948
    }());
949
    var sortIgnoresUndefined = (function () {
950
        // applies in IE 8, for one.
951
        try {
952
            [1, 2].sort(undefined);
953
            return true;
954
        } catch (e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
955
        return false;
956
    }());
957
    defineProperties(ArrayPrototype, {
958
        sort: function sort(compareFn) {
959
            if (typeof compareFn === 'undefined') {
960
                return arraySort(this);
961
            }
962
            if (!isCallable(compareFn)) {
963
                throw new TypeError('Array.prototype.sort callback must be a function');
964
            }
965
            return arraySort(this, compareFn);
966
        }
967
    }, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex);
968
969
    //
970
    // Object
971
    // ======
972
    //
973
974
    // ES5 15.2.3.14
975
    // http://es5.github.com/#x15.2.3.14
976
977
    // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
978
    var hasDontEnumBug = !isEnum({ 'toString': null }, 'toString');
979
    var hasProtoEnumBug = isEnum(function () {}, 'prototype');
980
    var hasStringEnumBug = !owns('x', '0');
981
    var equalsConstructorPrototype = function (o) {
982
        var ctor = o.constructor;
983
        return ctor && ctor.prototype === o;
984
    };
985
    var blacklistedKeys = {
986
        $window: true,
987
        $console: true,
988
        $parent: true,
989
        $self: true,
990
        $frame: true,
991
        $frames: true,
992
        $frameElement: true,
993
        $webkitIndexedDB: true,
994
        $webkitStorageInfo: true,
995
        $external: true
996
    };
997
    var hasAutomationEqualityBug = (function () {
998
        /* globals window */
999
        if (typeof window === 'undefined') {
1000
            return false;
1001
        }
1002
        for (var k in window) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
1003
            try {
1004
                if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {
1005
                    equalsConstructorPrototype(window[k]);
1006
                }
1007
            } catch (e) {
1008
                return true;
1009
            }
1010
        }
1011
        return false;
1012
    }());
1013
    var equalsConstructorPrototypeIfNotBuggy = function (object) {
1014
        if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
1015
            return equalsConstructorPrototype(object);
1016
        }
1017
        try {
1018
            return equalsConstructorPrototype(object);
1019
        } catch (e) {
1020
            return false;
1021
        }
1022
    };
1023
    var dontEnums = [
1024
        'toString',
1025
        'toLocaleString',
1026
        'valueOf',
1027
        'hasOwnProperty',
1028
        'isPrototypeOf',
1029
        'propertyIsEnumerable',
1030
        'constructor'
1031
    ];
1032
    var dontEnumsLength = dontEnums.length;
1033
1034
    // taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js
1035
    // can be replaced with require('is-arguments') if we ever use a build process instead
1036
    var isStandardArguments = function isArguments(value) {
1037
        return toStr(value) === '[object Arguments]';
1038
    };
1039
    var isLegacyArguments = function isArguments(value) {
1040
        return value !== null &&
1041
            typeof value === 'object' &&
1042
            typeof value.length === 'number' &&
1043
            value.length >= 0 &&
1044
            !isArray(value) &&
1045
            isCallable(value.callee);
1046
    };
1047
    var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable isArguments already seems to be declared on line 1036. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
1048
1049
    defineProperties($Object, {
1050
        keys: function keys(object) {
1051
            var isFn = isCallable(object);
1052
            var isArgs = isArguments(object);
1053
            var isObject = object !== null && typeof object === 'object';
1054
            var isStr = isObject && isString(object);
1055
1056
            if (!isObject && !isFn && !isArgs) {
1057
                throw new TypeError('Object.keys called on a non-object');
1058
            }
1059
1060
            var theKeys = [];
1061
            var skipProto = hasProtoEnumBug && isFn;
1062
            if ((isStr && hasStringEnumBug) || isArgs) {
1063
                for (var i = 0; i < object.length; ++i) {
1064
                    pushCall(theKeys, $String(i));
1065
                }
1066
            }
1067
1068
            if (!isArgs) {
1069
                for (var name in object) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
1070
                    if (!(skipProto && name === 'prototype') && owns(object, name)) {
1071
                        pushCall(theKeys, $String(name));
1072
                    }
1073
                }
1074
            }
1075
1076
            if (hasDontEnumBug) {
1077
                var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
1078
                for (var j = 0; j < dontEnumsLength; j++) {
1079
                    var dontEnum = dontEnums[j];
1080
                    if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {
1081
                        pushCall(theKeys, dontEnum);
1082
                    }
1083
                }
1084
            }
1085
            return theKeys;
1086
        }
1087
    });
1088
1089
    var keysWorksWithArguments = $Object.keys && (function () {
1090
        // Safari 5.0 bug
1091
        return $Object.keys(arguments).length === 2;
1092
    }(1, 2));
1093
    var keysHasArgumentsLengthBug = $Object.keys && (function () {
1094
        var argKeys = $Object.keys(arguments);
1095
        return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1;
1096
    }(1));
1097
    var originalKeys = $Object.keys;
1098
    defineProperties($Object, {
1099
        keys: function keys(object) {
1100
            if (isArguments(object)) {
1101
                return originalKeys(arraySlice(object));
1102
            } else {
1103
                return originalKeys(object);
1104
            }
1105
        }
1106
    }, !keysWorksWithArguments || keysHasArgumentsLengthBug);
1107
1108
    //
1109
    // Date
1110
    // ====
1111
    //
1112
1113
    var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0;
1114
    var aNegativeTestDate = new Date(-1509842289600292);
1115
    var aPositiveTestDate = new Date(1449662400000);
1116
    var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT';
1117
    var hasToDateStringFormatBug;
1118
    var hasToStringFormatBug;
1119
    var timeZoneOffset = aNegativeTestDate.getTimezoneOffset();
1120
    if (timeZoneOffset < -720) {
1121
        hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875';
1122
        hasToStringFormatBug = !(/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
1123
    } else {
1124
        hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875';
1125
        hasToStringFormatBug = !(/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/).test(aPositiveTestDate.toString());
1126
    }
1127
1128
    var originalGetFullYear = call.bind(Date.prototype.getFullYear);
1129
    var originalGetMonth = call.bind(Date.prototype.getMonth);
1130
    var originalGetDate = call.bind(Date.prototype.getDate);
1131
    var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear);
1132
    var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth);
1133
    var originalGetUTCDate = call.bind(Date.prototype.getUTCDate);
1134
    var originalGetUTCDay = call.bind(Date.prototype.getUTCDay);
1135
    var originalGetUTCHours = call.bind(Date.prototype.getUTCHours);
1136
    var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes);
1137
    var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds);
1138
    var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds);
1139
    var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
1140
    var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
1141
    var daysInMonth = function daysInMonth(month, year) {
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable daysInMonth already seems to be declared on line 1141. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
1142
        return originalGetDate(new Date(year, month, 0));
1143
    };
1144
1145
    defineProperties(Date.prototype, {
1146
        getFullYear: function getFullYear() {
1147
            if (!this || !(this instanceof Date)) {
1148
                throw new TypeError('this is not a Date object.');
1149
            }
1150
            var year = originalGetFullYear(this);
1151
            if (year < 0 && originalGetMonth(this) > 11) {
1152
                return year + 1;
1153
            }
1154
            return year;
1155
        },
1156
        getMonth: function getMonth() {
1157
            if (!this || !(this instanceof Date)) {
1158
                throw new TypeError('this is not a Date object.');
1159
            }
1160
            var year = originalGetFullYear(this);
1161
            var month = originalGetMonth(this);
1162
            if (year < 0 && month > 11) {
1163
                return 0;
1164
            }
1165
            return month;
1166
        },
1167
        getDate: function getDate() {
1168
            if (!this || !(this instanceof Date)) {
1169
                throw new TypeError('this is not a Date object.');
1170
            }
1171
            var year = originalGetFullYear(this);
1172
            var month = originalGetMonth(this);
1173
            var date = originalGetDate(this);
1174
            if (year < 0 && month > 11) {
1175
                if (month === 12) {
1176
                    return date;
1177
                }
1178
                var days = daysInMonth(0, year + 1);
1179
                return (days - date) + 1;
1180
            }
1181
            return date;
1182
        },
1183
        getUTCFullYear: function getUTCFullYear() {
1184
            if (!this || !(this instanceof Date)) {
1185
                throw new TypeError('this is not a Date object.');
1186
            }
1187
            var year = originalGetUTCFullYear(this);
1188
            if (year < 0 && originalGetUTCMonth(this) > 11) {
1189
                return year + 1;
1190
            }
1191
            return year;
1192
        },
1193
        getUTCMonth: function getUTCMonth() {
1194
            if (!this || !(this instanceof Date)) {
1195
                throw new TypeError('this is not a Date object.');
1196
            }
1197
            var year = originalGetUTCFullYear(this);
1198
            var month = originalGetUTCMonth(this);
1199
            if (year < 0 && month > 11) {
1200
                return 0;
1201
            }
1202
            return month;
1203
        },
1204
        getUTCDate: function getUTCDate() {
1205
            if (!this || !(this instanceof Date)) {
1206
                throw new TypeError('this is not a Date object.');
1207
            }
1208
            var year = originalGetUTCFullYear(this);
1209
            var month = originalGetUTCMonth(this);
1210
            var date = originalGetUTCDate(this);
1211
            if (year < 0 && month > 11) {
1212
                if (month === 12) {
1213
                    return date;
1214
                }
1215
                var days = daysInMonth(0, year + 1);
1216
                return (days - date) + 1;
1217
            }
1218
            return date;
1219
        }
1220
    }, hasNegativeMonthYearBug);
1221
1222
    defineProperties(Date.prototype, {
1223
        toUTCString: function toUTCString() {
1224
            if (!this || !(this instanceof Date)) {
1225
                throw new TypeError('this is not a Date object.');
1226
            }
1227
            var day = originalGetUTCDay(this);
1228
            var date = originalGetUTCDate(this);
1229
            var month = originalGetUTCMonth(this);
1230
            var year = originalGetUTCFullYear(this);
1231
            var hour = originalGetUTCHours(this);
1232
            var minute = originalGetUTCMinutes(this);
1233
            var second = originalGetUTCSeconds(this);
1234
            return dayName[day] + ', ' +
1235
                (date < 10 ? '0' + date : date) + ' ' +
1236
                monthName[month] + ' ' +
1237
                year + ' ' +
1238
                (hour < 10 ? '0' + hour : hour) + ':' +
1239
                (minute < 10 ? '0' + minute : minute) + ':' +
1240
                (second < 10 ? '0' + second : second) + ' GMT';
1241
        }
1242
    }, hasNegativeMonthYearBug || hasToUTCStringFormatBug);
1243
1244
    // Opera 12 has `,`
1245
    defineProperties(Date.prototype, {
1246
        toDateString: function toDateString() {
1247
            if (!this || !(this instanceof Date)) {
1248
                throw new TypeError('this is not a Date object.');
1249
            }
1250
            var day = this.getDay();
1251
            var date = this.getDate();
1252
            var month = this.getMonth();
1253
            var year = this.getFullYear();
1254
            return dayName[day] + ' ' +
1255
                monthName[month] + ' ' +
1256
                (date < 10 ? '0' + date : date) + ' ' +
1257
                year;
1258
        }
1259
    }, hasNegativeMonthYearBug || hasToDateStringFormatBug);
1260
1261
    // can't use defineProperties here because of toString enumeration issue in IE <= 8
1262
    if (hasNegativeMonthYearBug || hasToStringFormatBug) {
1263
        Date.prototype.toString = function toString() {
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Date. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
1264
            if (!this || !(this instanceof Date)) {
1265
                throw new TypeError('this is not a Date object.');
1266
            }
1267
            var day = this.getDay();
1268
            var date = this.getDate();
1269
            var month = this.getMonth();
1270
            var year = this.getFullYear();
1271
            var hour = this.getHours();
1272
            var minute = this.getMinutes();
1273
            var second = this.getSeconds();
1274
            var timezoneOffset = this.getTimezoneOffset();
1275
            var hoursOffset = Math.floor(Math.abs(timezoneOffset) / 60);
1276
            var minutesOffset = Math.floor(Math.abs(timezoneOffset) % 60);
1277
            return dayName[day] + ' ' +
1278
                monthName[month] + ' ' +
1279
                (date < 10 ? '0' + date : date) + ' ' +
1280
                year + ' ' +
1281
                (hour < 10 ? '0' + hour : hour) + ':' +
1282
                (minute < 10 ? '0' + minute : minute) + ':' +
1283
                (second < 10 ? '0' + second : second) + ' GMT' +
1284
                (timezoneOffset > 0 ? '-' : '+') +
1285
                (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset) +
1286
                (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset);
1287
        };
1288
        if (supportsDescriptors) {
1289
            $Object.defineProperty(Date.prototype, 'toString', {
1290
                configurable: true,
1291
                enumerable: false,
1292
                writable: true
1293
            });
1294
        }
1295
    }
1296
1297
    // ES5 15.9.5.43
1298
    // http://es5.github.com/#x15.9.5.43
1299
    // This function returns a String value represent the instance in time
1300
    // represented by this Date object. The format of the String is the Date Time
1301
    // string format defined in 15.9.1.15. All fields are present in the String.
1302
    // The time zone is always UTC, denoted by the suffix Z. If the time value of
1303
    // this object is not a finite Number a RangeError exception is thrown.
1304
    var negativeDate = -62198755200000;
1305
    var negativeYearString = '-000001';
1306
    var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;
1307
    var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';
1308
1309
    var getTime = call.bind(Date.prototype.getTime);
1310
1311
    defineProperties(Date.prototype, {
1312
        toISOString: function toISOString() {
1313
            if (!isFinite(this) || !isFinite(getTime(this))) {
1314
                // Adope Photoshop requires the second check.
1315
                throw new RangeError('Date.prototype.toISOString called on non-finite value.');
1316
            }
1317
1318
            var year = originalGetUTCFullYear(this);
1319
1320
            var month = originalGetUTCMonth(this);
1321
            // see https://github.com/es-shims/es5-shim/issues/111
1322
            year += Math.floor(month / 12);
1323
            month = (month % 12 + 12) % 12;
1324
1325
            // the date time string format is specified in 15.9.1.15.
1326
            var result = [month + 1, originalGetUTCDate(this), originalGetUTCHours(this), originalGetUTCMinutes(this), originalGetUTCSeconds(this)];
1327
            year = (
1328
                (year < 0 ? '-' : (year > 9999 ? '+' : '')) +
1329
                strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6)
1330
            );
1331
1332
            for (var i = 0; i < result.length; ++i) {
1333
                // pad months, days, hours, minutes, and seconds to have two digits.
1334
                result[i] = strSlice('00' + result[i], -2);
1335
            }
1336
            // pad milliseconds to have three digits.
1337
            return (
1338
                year + '-' + arraySlice(result, 0, 2).join('-') +
1339
                'T' + arraySlice(result, 2).join(':') + '.' +
1340
                strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z'
1341
            );
1342
        }
1343
    }, hasNegativeDateBug || hasSafari51DateBug);
1344
1345
    // ES5 15.9.5.44
1346
    // http://es5.github.com/#x15.9.5.44
1347
    // This function provides a String representation of a Date object for use by
1348
    // JSON.stringify (15.12.3).
1349
    var dateToJSONIsSupported = (function () {
1350
        try {
1351
            return Date.prototype.toJSON &&
1352
                new Date(NaN).toJSON() === null &&
1353
                new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&
1354
                Date.prototype.toJSON.call({ // generic
1355
                    toISOString: function () { return true; }
1356
                });
1357
        } catch (e) {
1358
            return false;
1359
        }
1360
    }());
1361
    if (!dateToJSONIsSupported) {
1362
        Date.prototype.toJSON = function toJSON(key) {
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Date. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
Unused Code introduced by
The parameter key is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
1363
            // When the toJSON method is called with argument key, the following
1364
            // steps are taken:
1365
1366
            // 1.  Let O be the result of calling ToObject, giving it the this
1367
            // value as its argument.
1368
            // 2. Let tv be ES.ToPrimitive(O, hint Number).
1369
            var O = $Object(this);
1370
            var tv = ES.ToPrimitive(O);
1371
            // 3. If tv is a Number and is not finite, return null.
1372
            if (typeof tv === 'number' && !isFinite(tv)) {
1373
                return null;
1374
            }
1375
            // 4. Let toISO be the result of calling the [[Get]] internal method of
1376
            // O with argument "toISOString".
1377
            var toISO = O.toISOString;
1378
            // 5. If IsCallable(toISO) is false, throw a TypeError exception.
1379
            if (!isCallable(toISO)) {
1380
                throw new TypeError('toISOString property is not callable');
1381
            }
1382
            // 6. Return the result of calling the [[Call]] internal method of
1383
            //  toISO with O as the this value and an empty argument list.
1384
            return toISO.call(O);
1385
1386
            // NOTE 1 The argument is ignored.
1387
1388
            // NOTE 2 The toJSON function is intentionally generic; it does not
1389
            // require that its this value be a Date object. Therefore, it can be
1390
            // transferred to other kinds of objects for use as a method. However,
1391
            // it does require that any such object have a toISOString method. An
1392
            // object is free to use the argument key to filter its
1393
            // stringification.
1394
        };
1395
    }
1396
1397
    // ES5 15.9.4.2
1398
    // http://es5.github.com/#x15.9.4.2
1399
    // based on work shared by Daniel Friesen (dantman)
1400
    // http://gist.github.com/303249
1401
    var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;
1402
    var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));
1403
    var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));
1404
    if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {
1405
        // XXX global assignment won't work in embeddings that use
1406
        // an alternate object for the context.
1407
        /* global Date: true */
1408
        /* eslint-disable no-undef */
1409
        var maxSafeUnsigned32Bit = Math.pow(2, 31) - 1;
1410
        var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime());
1411
        /* eslint-disable no-implicit-globals */
1412
        Date = (function (NativeDate) {
0 ignored issues
show
Comprehensibility introduced by
You are shadowing the built-in type Date. This makes code hard to read, consider using a different name.
Loading history...
1413
        /* eslint-enable no-implicit-globals */
1414
        /* eslint-enable no-undef */
1415
            // Date.length === 7
1416
            var DateShim = function Date(Y, M, D, h, m, s, ms) {
1417
                var length = arguments.length;
1418
                var date;
1419
                if (this instanceof NativeDate) {
1420
                    var seconds = s;
1421
                    var millis = ms;
1422
                    if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) {
1423
                        // work around a Safari 8/9 bug where it treats the seconds as signed
1424
                        var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
1425
                        var sToShift = Math.floor(msToShift / 1e3);
1426
                        seconds += sToShift;
1427
                        millis -= sToShift * 1e3;
1428
                    }
1429
                    date = length === 1 && $String(Y) === Y ? // isString(Y)
1430
                        // We explicitly pass it through parse:
1431
                        new NativeDate(DateShim.parse(Y)) :
1432
                        // We have to manually make calls depending on argument
1433
                        // length here
1434
                        length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis) :
1435
                        length >= 6 ? new NativeDate(Y, M, D, h, m, seconds) :
1436
                        length >= 5 ? new NativeDate(Y, M, D, h, m) :
1437
                        length >= 4 ? new NativeDate(Y, M, D, h) :
1438
                        length >= 3 ? new NativeDate(Y, M, D) :
1439
                        length >= 2 ? new NativeDate(Y, M) :
1440
                        length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y) :
1441
                                      new NativeDate();
1442
                } else {
1443
                    date = NativeDate.apply(this, arguments);
1444
                }
1445
                if (!isPrimitive(date)) {
1446
                    // Prevent mixups with unfixed Date object
1447
                    defineProperties(date, { constructor: DateShim }, true);
1448
                }
1449
                return date;
1450
            };
1451
1452
            // 15.9.1.15 Date Time String Format.
1453
            var isoDateExpression = new RegExp('^' +
1454
                '(\\d{4}|[+-]\\d{6})' + // four-digit year capture or sign +
1455
                                          // 6-digit extended year
1456
                '(?:-(\\d{2})' + // optional month capture
1457
                '(?:-(\\d{2})' + // optional day capture
1458
                '(?:' + // capture hours:minutes:seconds.milliseconds
1459
                    'T(\\d{2})' + // hours capture
1460
                    ':(\\d{2})' + // minutes capture
1461
                    '(?:' + // optional :seconds.milliseconds
1462
                        ':(\\d{2})' + // seconds capture
1463
                        '(?:(\\.\\d{1,}))?' + // milliseconds capture
1464
                    ')?' +
1465
                '(' + // capture UTC offset component
1466
                    'Z|' + // UTC capture
1467
                    '(?:' + // offset specifier +/-hours:minutes
1468
                        '([-+])' + // sign capture
1469
                        '(\\d{2})' + // hours offset capture
1470
                        ':(\\d{2})' + // minutes offset capture
1471
                    ')' +
1472
                ')?)?)?)?' +
1473
            '$');
1474
1475
            var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];
1476
1477
            var dayFromMonth = function dayFromMonth(year, month) {
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable dayFromMonth already seems to be declared on line 1477. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
1478
                var t = month > 1 ? 1 : 0;
1479
                return (
1480
                    months[month] +
1481
                    Math.floor((year - 1969 + t) / 4) -
1482
                    Math.floor((year - 1901 + t) / 100) +
1483
                    Math.floor((year - 1601 + t) / 400) +
1484
                    365 * (year - 1970)
1485
                );
1486
            };
1487
1488
            var toUTC = function toUTC(t) {
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable toUTC already seems to be declared on line 1488. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
1489
                var s = 0;
1490
                var ms = t;
1491
                if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) {
1492
                    // work around a Safari 8/9 bug where it treats the seconds as signed
1493
                    var msToShift = Math.floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;
1494
                    var sToShift = Math.floor(msToShift / 1e3);
1495
                    s += sToShift;
1496
                    ms -= sToShift * 1e3;
1497
                }
1498
                return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms));
1499
            };
1500
1501
            // Copy any custom methods a 3rd party library may have added
1502
            for (var key in NativeDate) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
1503
                if (owns(NativeDate, key)) {
1504
                    DateShim[key] = NativeDate[key];
1505
                }
1506
            }
1507
1508
            // Copy "native" methods explicitly; they may be non-enumerable
1509
            defineProperties(DateShim, {
1510
                now: NativeDate.now,
1511
                UTC: NativeDate.UTC
1512
            }, true);
1513
            DateShim.prototype = NativeDate.prototype;
1514
            defineProperties(DateShim.prototype, {
1515
                constructor: DateShim
1516
            }, true);
1517
1518
            // Upgrade Date.parse to handle simplified ISO 8601 strings
1519
            var parseShim = function parse(string) {
1520
                var match = isoDateExpression.exec(string);
1521
                if (match) {
1522
                    // parse months, days, hours, minutes, seconds, and milliseconds
1523
                    // provide default values if necessary
1524
                    // parse the UTC offset component
1525
                    var year = $Number(match[1]),
1526
                        month = $Number(match[2] || 1) - 1,
1527
                        day = $Number(match[3] || 1) - 1,
1528
                        hour = $Number(match[4] || 0),
1529
                        minute = $Number(match[5] || 0),
1530
                        second = $Number(match[6] || 0),
1531
                        millisecond = Math.floor($Number(match[7] || 0) * 1000),
1532
                        // When time zone is missed, local offset should be used
1533
                        // (ES 5.1 bug)
1534
                        // see https://bugs.ecmascript.org/show_bug.cgi?id=112
1535
                        isLocalTime = Boolean(match[4] && !match[8]),
1536
                        signOffset = match[9] === '-' ? 1 : -1,
1537
                        hourOffset = $Number(match[10] || 0),
1538
                        minuteOffset = $Number(match[11] || 0),
1539
                        result;
1540
                    var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0;
1541
                    if (
1542
                        hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25) &&
1543
                        minute < 60 && second < 60 && millisecond < 1000 &&
1544
                        month > -1 && month < 12 && hourOffset < 24 &&
1545
                        minuteOffset < 60 && // detect invalid offsets
1546
                        day > -1 &&
1547
                        day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month))
1548
                    ) {
1549
                        result = (
1550
                            (dayFromMonth(year, month) + day) * 24 +
1551
                            hour +
1552
                            hourOffset * signOffset
1553
                        ) * 60;
1554
                        result = (
1555
                            (result + minute + minuteOffset * signOffset) * 60 +
1556
                            second
1557
                        ) * 1000 + millisecond;
1558
                        if (isLocalTime) {
1559
                            result = toUTC(result);
1560
                        }
1561
                        if (-8.64e15 <= result && result <= 8.64e15) {
1562
                            return result;
1563
                        }
1564
                    }
1565
                    return NaN;
1566
                }
1567
                return NativeDate.parse.apply(this, arguments);
1568
            };
1569
            defineProperties(DateShim, { parse: parseShim });
1570
1571
            return DateShim;
1572
        }(Date));
1573
        /* global Date: false */
1574
    }
1575
1576
    // ES5 15.9.4.4
1577
    // http://es5.github.com/#x15.9.4.4
1578
    if (!Date.now) {
1579
        Date.now = function now() {
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Date. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
1580
            return new Date().getTime();
1581
        };
1582
    }
1583
1584
    //
1585
    // Number
1586
    // ======
1587
    //
1588
1589
    // ES5.1 15.7.4.5
1590
    // http://es5.github.com/#x15.7.4.5
1591
    var hasToFixedBugs = NumberPrototype.toFixed && (
1592
      (0.00008).toFixed(3) !== '0.000' ||
1593
      (0.9).toFixed(0) !== '1' ||
1594
      (1.255).toFixed(2) !== '1.25' ||
1595
      (1000000000000000128).toFixed(0) !== '1000000000000000128'
1596
    );
1597
1598
    var toFixedHelpers = {
1599
        base: 1e7,
1600
        size: 6,
1601
        data: [0, 0, 0, 0, 0, 0],
1602
        multiply: function multiply(n, c) {
1603
            var i = -1;
1604
            var c2 = c;
1605
            while (++i < toFixedHelpers.size) {
1606
                c2 += n * toFixedHelpers.data[i];
1607
                toFixedHelpers.data[i] = c2 % toFixedHelpers.base;
1608
                c2 = Math.floor(c2 / toFixedHelpers.base);
1609
            }
1610
        },
1611
        divide: function divide(n) {
1612
            var i = toFixedHelpers.size;
1613
            var c = 0;
1614
            while (--i >= 0) {
1615
                c += toFixedHelpers.data[i];
1616
                toFixedHelpers.data[i] = Math.floor(c / n);
1617
                c = (c % n) * toFixedHelpers.base;
1618
            }
1619
        },
1620
        numToString: function numToString() {
1621
            var i = toFixedHelpers.size;
1622
            var s = '';
1623
            while (--i >= 0) {
1624
                if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {
1625
                    var t = $String(toFixedHelpers.data[i]);
1626
                    if (s === '') {
1627
                        s = t;
1628
                    } else {
1629
                        s += strSlice('0000000', 0, 7 - t.length) + t;
1630
                    }
1631
                }
1632
            }
1633
            return s;
1634
        },
1635
        pow: function pow(x, n, acc) {
1636
            return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));
1637
        },
1638
        log: function log(x) {
1639
            var n = 0;
1640
            var x2 = x;
1641
            while (x2 >= 4096) {
1642
                n += 12;
1643
                x2 /= 4096;
1644
            }
1645
            while (x2 >= 2) {
1646
                n += 1;
1647
                x2 /= 2;
1648
            }
1649
            return n;
1650
        }
1651
    };
1652
1653
    var toFixedShim = function toFixed(fractionDigits) {
1654
        var f, x, s, m, e, z, j, k;
1655
1656
        // Test for NaN and round fractionDigits down
1657
        f = $Number(fractionDigits);
1658
        f = isActualNaN(f) ? 0 : Math.floor(f);
1659
1660
        if (f < 0 || f > 20) {
1661
            throw new RangeError('Number.toFixed called with invalid number of decimals');
1662
        }
1663
1664
        x = $Number(this);
1665
1666
        if (isActualNaN(x)) {
1667
            return 'NaN';
1668
        }
1669
1670
        // If it is too big or small, return the string value of the number
1671
        if (x <= -1e21 || x >= 1e21) {
1672
            return $String(x);
1673
        }
1674
1675
        s = '';
1676
1677
        if (x < 0) {
1678
            s = '-';
1679
            x = -x;
1680
        }
1681
1682
        m = '0';
1683
1684
        if (x > 1e-21) {
1685
            // 1e-21 < x < 1e21
1686
            // -70 < log2(x) < 70
1687
            e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;
1688
            z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));
1689
            z *= 0x10000000000000; // Math.pow(2, 52);
1690
            e = 52 - e;
1691
1692
            // -18 < e < 122
1693
            // x = z / 2 ^ e
1694
            if (e > 0) {
1695
                toFixedHelpers.multiply(0, z);
1696
                j = f;
1697
1698
                while (j >= 7) {
1699
                    toFixedHelpers.multiply(1e7, 0);
1700
                    j -= 7;
1701
                }
1702
1703
                toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);
1704
                j = e - 1;
1705
1706
                while (j >= 23) {
1707
                    toFixedHelpers.divide(1 << 23);
1708
                    j -= 23;
1709
                }
1710
1711
                toFixedHelpers.divide(1 << j);
1712
                toFixedHelpers.multiply(1, 1);
1713
                toFixedHelpers.divide(2);
1714
                m = toFixedHelpers.numToString();
1715
            } else {
1716
                toFixedHelpers.multiply(0, z);
1717
                toFixedHelpers.multiply(1 << (-e), 0);
1718
                m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);
1719
            }
1720
        }
1721
1722
        if (f > 0) {
1723
            k = m.length;
1724
1725
            if (k <= f) {
1726
                m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;
1727
            } else {
1728
                m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);
1729
            }
1730
        } else {
1731
            m = s + m;
1732
        }
1733
1734
        return m;
1735
    };
1736
    defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs);
1737
1738
    var hasToPrecisionUndefinedBug = (function () {
1739
        try {
1740
            return 1.0.toPrecision(undefined) === '1';
1741
        } catch (e) {
1742
            return true;
1743
        }
1744
    }());
1745
    var originalToPrecision = NumberPrototype.toPrecision;
1746
    defineProperties(NumberPrototype, {
1747
        toPrecision: function toPrecision(precision) {
1748
            return typeof precision === 'undefined' ? originalToPrecision.call(this) : originalToPrecision.call(this, precision);
1749
        }
1750
    }, hasToPrecisionUndefinedBug);
1751
1752
    //
1753
    // String
1754
    // ======
1755
    //
1756
1757
    // ES5 15.5.4.14
1758
    // http://es5.github.com/#x15.5.4.14
1759
1760
    // [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
1761
    // Many browsers do not split properly with regular expressions or they
1762
    // do not perform the split correctly under obscure conditions.
1763
    // See http://blog.stevenlevithan.com/archives/cross-browser-split
1764
    // I've tested in many browsers and this seems to cover the deviant ones:
1765
    //    'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
1766
    //    '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
1767
    //    'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
1768
    //       [undefined, "t", undefined, "e", ...]
1769
    //    ''.split(/.?/) should be [], not [""]
1770
    //    '.'.split(/()()/) should be ["."], not ["", "", "."]
1771
1772
    if (
1773
        'ab'.split(/(?:ab)*/).length !== 2 ||
1774
        '.'.split(/(.?)(.?)/).length !== 4 ||
1775
        'tesst'.split(/(s)*/)[1] === 't' ||
1776
        'test'.split(/(?:)/, -1).length !== 4 ||
1777
        ''.split(/.?/).length ||
1778
        '.'.split(/()()/).length > 1
1779
    ) {
1780
        (function () {
1781
            var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group
1782
            var maxSafe32BitInt = Math.pow(2, 32) - 1;
1783
1784
            StringPrototype.split = function (separator, limit) {
1785
                var string = String(this);
1786
                if (typeof separator === 'undefined' && limit === 0) {
1787
                    return [];
1788
                }
1789
1790
                // If `separator` is not a regex, use native split
1791
                if (!isRegex(separator)) {
1792
                    return strSplit(this, separator, limit);
1793
                }
1794
1795
                var output = [];
1796
                var flags = (separator.ignoreCase ? 'i' : '') +
1797
                            (separator.multiline ? 'm' : '') +
1798
                            (separator.unicode ? 'u' : '') + // in ES6
1799
                            (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6
1800
                    lastLastIndex = 0,
1801
                    // Make `global` and avoid `lastIndex` issues by working with a copy
1802
                    separator2, match, lastIndex, lastLength;
1803
                var separatorCopy = new RegExp(separator.source, flags + 'g');
1804
                if (!compliantExecNpcg) {
1805
                    // Doesn't need flags gy, but they don't hurt
1806
                    separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
1807
                }
1808
                /* Values for `limit`, per the spec:
1809
                 * If undefined: 4294967295 // maxSafe32BitInt
1810
                 * If 0, Infinity, or NaN: 0
1811
                 * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
1812
                 * If negative number: 4294967296 - Math.floor(Math.abs(limit))
1813
                 * If other: Type-convert, then use the above rules
1814
                 */
1815
                var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit);
1816
                match = separatorCopy.exec(string);
1817
                while (match) {
1818
                    // `separatorCopy.lastIndex` is not reliable cross-browser
1819
                    lastIndex = match.index + match[0].length;
1820
                    if (lastIndex > lastLastIndex) {
1821
                        pushCall(output, strSlice(string, lastLastIndex, match.index));
1822
                        // Fix browsers whose `exec` methods don't consistently return `undefined` for
1823
                        // nonparticipating capturing groups
1824
                        if (!compliantExecNpcg && match.length > 1) {
1825
                            /* eslint-disable no-loop-func */
1826
                            match[0].replace(separator2, function () {
0 ignored issues
show
Bug introduced by
The variable separator2 does not seem to be initialized in case !compliantExecNpcg on line 1804 is false. Are you sure the function replace handles undefined variables?
Loading history...
1827
                                for (var i = 1; i < arguments.length - 2; i++) {
1828
                                    if (typeof arguments[i] === 'undefined') {
1829
                                        match[i] = void 0;
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...
1830
                                    }
1831
                                }
1832
                            });
1833
                            /* eslint-enable no-loop-func */
1834
                        }
1835
                        if (match.length > 1 && match.index < string.length) {
1836
                            array_push.apply(output, arraySlice(match, 1));
1837
                        }
1838
                        lastLength = match[0].length;
1839
                        lastLastIndex = lastIndex;
1840
                        if (output.length >= splitLimit) {
1841
                            break;
1842
                        }
1843
                    }
1844
                    if (separatorCopy.lastIndex === match.index) {
1845
                        separatorCopy.lastIndex++; // Avoid an infinite loop
1846
                    }
1847
                    match = separatorCopy.exec(string);
1848
                }
1849
                if (lastLastIndex === string.length) {
1850
                    if (lastLength || !separatorCopy.test('')) {
1851
                        pushCall(output, '');
1852
                    }
1853
                } else {
1854
                    pushCall(output, strSlice(string, lastLastIndex));
1855
                }
1856
                return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output;
1857
            };
1858
        }());
1859
1860
    // [bugfix, chrome]
1861
    // If separator is undefined, then the result array contains just one String,
1862
    // which is the this value (converted to a String). If limit is not undefined,
1863
    // then the output array is truncated so that it contains no more than limit
1864
    // elements.
1865
    // "0".split(undefined, 0) -> []
1866
    } else if ('0'.split(void 0, 0).length) {
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...
1867
        StringPrototype.split = function split(separator, limit) {
1868
            if (typeof separator === 'undefined' && limit === 0) {
1869
                return [];
1870
            }
1871
            return strSplit(this, separator, limit);
1872
        };
1873
    }
1874
1875
    var str_replace = StringPrototype.replace;
1876
    var replaceReportsGroupsCorrectly = (function () {
1877
        var groups = [];
1878
        'x'.replace(/x(.)?/g, function (match, group) {
1879
            pushCall(groups, group);
1880
        });
1881
        return groups.length === 1 && typeof groups[0] === 'undefined';
1882
    }());
1883
1884
    if (!replaceReportsGroupsCorrectly) {
1885
        StringPrototype.replace = function replace(searchValue, replaceValue) {
1886
            var isFn = isCallable(replaceValue);
1887
            var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source);
1888
            if (!isFn || !hasCapturingGroups) {
1889
                return str_replace.call(this, searchValue, replaceValue);
1890
            } else {
1891
                var wrappedReplaceValue = function (match) {
1892
                    var length = arguments.length;
1893
                    var originalLastIndex = searchValue.lastIndex;
1894
                    searchValue.lastIndex = 0;
1895
                    var args = searchValue.exec(match) || [];
1896
                    searchValue.lastIndex = originalLastIndex;
1897
                    pushCall(args, arguments[length - 2], arguments[length - 1]);
1898
                    return replaceValue.apply(this, args);
1899
                };
1900
                return str_replace.call(this, searchValue, wrappedReplaceValue);
1901
            }
1902
        };
1903
    }
1904
1905
    // ECMA-262, 3rd B.2.3
1906
    // Not an ECMAScript standard, although ECMAScript 3rd Edition has a
1907
    // non-normative section suggesting uniform semantics and it should be
1908
    // normalized across all browsers
1909
    // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
1910
    var string_substr = StringPrototype.substr;
1911
    var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';
1912
    defineProperties(StringPrototype, {
1913
        substr: function substr(start, length) {
1914
            var normalizedStart = start;
1915
            if (start < 0) {
1916
                normalizedStart = max(this.length + start, 0);
1917
            }
1918
            return string_substr.call(this, normalizedStart, length);
1919
        }
1920
    }, hasNegativeSubstrBug);
1921
1922
    // ES5 15.5.4.20
1923
    // whitespace from: http://es5.github.io/#x15.5.4.20
1924
    var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
1925
        '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' +
1926
        '\u2029\uFEFF';
1927
    var zeroWidth = '\u200b';
1928
    var wsRegexChars = '[' + ws + ']';
1929
    var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');
1930
    var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');
1931
    var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());
1932
    defineProperties(StringPrototype, {
1933
        // http://blog.stevenlevithan.com/archives/faster-trim-javascript
1934
        // http://perfectionkills.com/whitespace-deviations/
1935
        trim: function trim() {
1936
            if (typeof this === 'undefined' || this === null) {
1937
                throw new TypeError("can't convert " + this + ' to object');
1938
            }
1939
            return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');
1940
        }
1941
    }, hasTrimWhitespaceBug);
1942
    var trim = call.bind(String.prototype.trim);
0 ignored issues
show
Comprehensibility Naming Best Practice introduced by
The variable trim already seems to be declared on line 1935. Consider using another variable name or omitting the var keyword.

This check looks for variables that are declared in multiple lines. There may be several reasons for this.

In the simplest case the variable name was reused by mistake. This may lead to very hard to locate bugs.

If you want to reuse a variable for another purpose, consider declaring it at or near the top of your function and just assigning to it subsequently so it is always declared.

Loading history...
1943
1944
    var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1;
1945
    defineProperties(StringPrototype, {
1946
        lastIndexOf: function lastIndexOf(searchString) {
1947
            if (typeof this === 'undefined' || this === null) {
1948
                throw new TypeError("can't convert " + this + ' to object');
1949
            }
1950
            var S = $String(this);
1951
            var searchStr = $String(searchString);
1952
            var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN;
1953
            var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos);
1954
            var start = min(max(pos, 0), S.length);
1955
            var searchLen = searchStr.length;
1956
            var k = start + searchLen;
1957
            while (k > 0) {
1958
                k = max(0, k - searchLen);
1959
                var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr);
1960
                if (index !== -1) {
1961
                    return k + index;
1962
                }
1963
            }
1964
            return -1;
1965
        }
1966
    }, hasLastIndexBug);
1967
1968
    var originalLastIndexOf = StringPrototype.lastIndexOf;
1969
    defineProperties(StringPrototype, {
1970
        lastIndexOf: function lastIndexOf(searchString) {
0 ignored issues
show
Unused Code introduced by
The parameter searchString is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
1971
            return originalLastIndexOf.apply(this, arguments);
1972
        }
1973
    }, StringPrototype.lastIndexOf.length !== 1);
1974
1975
    // ES-5 15.1.2.2
1976
    /* eslint-disable radix */
1977
    if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {
1978
    /* eslint-enable radix */
1979
        /* global parseInt: true */
1980
        parseInt = (function (origParseInt) {
0 ignored issues
show
Bug introduced by
The variable parseInt seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.parseInt.
Loading history...
1981
            var hexRegex = /^[\-+]?0[xX]/;
1982
            return function parseInt(str, radix) {
1983
                var string = trim(String(str));
1984
                var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);
1985
                return origParseInt(string, defaultedRadix);
1986
            };
1987
        }(parseInt));
0 ignored issues
show
Bug introduced by
The variable parseInt seems to be never declared. If this is a global, consider adding a /** global: parseInt */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
1988
    }
1989
1990
    // https://es5.github.io/#x15.1.2.3
1991
    if (1 / parseFloat('-0') !== -Infinity) {
1992
        /* global parseFloat: true */
1993
        parseFloat = (function (origParseFloat) {
0 ignored issues
show
Bug introduced by
The variable parseFloat seems to be never declared. Assigning variables without defining them first makes them global. If this was intended, consider making it explicit like using window.parseFloat.
Loading history...
1994
            return function parseFloat(string) {
1995
                var inputString = trim(String(string));
1996
                var result = origParseFloat(inputString);
1997
                return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result;
1998
            };
1999
        }(parseFloat));
0 ignored issues
show
Bug introduced by
The variable parseFloat seems to be never declared. If this is a global, consider adding a /** global: parseFloat */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
2000
    }
2001
2002
    if (String(new RangeError('test')) !== 'RangeError: test') {
2003
        var errorToStringShim = function toString() {
2004
            if (typeof this === 'undefined' || this === null) {
2005
                throw new TypeError("can't convert " + this + ' to object');
2006
            }
2007
            var name = this.name;
2008
            if (typeof name === 'undefined') {
2009
                name = 'Error';
2010
            } else if (typeof name !== 'string') {
2011
                name = $String(name);
2012
            }
2013
            var msg = this.message;
2014
            if (typeof msg === 'undefined') {
2015
                msg = '';
2016
            } else if (typeof msg !== 'string') {
2017
                msg = $String(msg);
2018
            }
2019
            if (!name) {
2020
                return msg;
2021
            }
2022
            if (!msg) {
2023
                return name;
2024
            }
2025
            return name + ': ' + msg;
2026
        };
2027
        // can't use defineProperties here because of toString enumeration issue in IE <= 8
2028
        Error.prototype.toString = errorToStringShim;
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Error. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
2029
    }
2030
2031
    if (supportsDescriptors) {
2032
        var ensureNonEnumerable = function (obj, prop) {
2033
            if (isEnum(obj, prop)) {
2034
                var desc = Object.getOwnPropertyDescriptor(obj, prop);
2035
                if (desc.configurable) {
2036
                    desc.enumerable = false;
2037
                    Object.defineProperty(obj, prop, desc);
2038
                }
2039
            }
2040
        };
2041
        ensureNonEnumerable(Error.prototype, 'message');
2042
        if (Error.prototype.message !== '') {
2043
            Error.prototype.message = '';
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type Error. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
2044
        }
2045
        ensureNonEnumerable(Error.prototype, 'name');
2046
    }
2047
2048
    if (String(/a/mig) !== '/a/gim') {
2049
        var regexToString = function toString() {
2050
            var str = '/' + this.source + '/';
2051
            if (this.global) {
2052
                str += 'g';
2053
            }
2054
            if (this.ignoreCase) {
2055
                str += 'i';
2056
            }
2057
            if (this.multiline) {
2058
                str += 'm';
2059
            }
2060
            return str;
2061
        };
2062
        // can't use defineProperties here because of toString enumeration issue in IE <= 8
2063
        RegExp.prototype.toString = regexToString;
0 ignored issues
show
Compatibility Best Practice introduced by
You are extending the built-in type RegExp. This may have unintended consequences on other objects using this built-in type. Consider subclassing instead.
Loading history...
2064
    }
2065
}));
2066