es6to5-rails 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +35 -0
- data/Rakefile +2 -0
- data/es6to5-rails.gemspec +25 -0
- data/lib/es6to5-rails.rb +13 -0
- data/lib/es6to5-rails/config.rb +13 -0
- data/lib/es6to5-rails/rails.rb +2 -0
- data/lib/es6to5-rails/sprockets.rb +3 -0
- data/lib/es6to5-rails/template.rb +14 -0
- data/lib/es6to5-rails/version.rb +3 -0
- data/vendor/assets/javascripts/es6-shim.js +1976 -0
- data/vendor/assets/javascripts/es6to5.js +3 -0
- metadata +114 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5a13c617579a766b716899150c03b1efc2380f1f
|
4
|
+
data.tar.gz: 6261b6a3d0896837d647cdf426578bd9bb2cdac1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d82837b85a54de7eccb5cec6decd4ae148461b275ac3b506852f9a2e50c4a3087a491a1e1518ba01e767d632371751e9b9a2b2b42c1dea0e5683151927e9a0dd
|
7
|
+
data.tar.gz: 908f6b51dd9ff41245c258813aea9bc84eb4e3b989e88ff681873f930f133bf4e2567388942e278b203118c1f5867c85c25aec562dd1da1ae828e6bf0595b387
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
.idea
|
2
|
+
*.gem
|
3
|
+
*.rbc
|
4
|
+
.bundle
|
5
|
+
.config
|
6
|
+
.yardoc
|
7
|
+
Gemfile.lock
|
8
|
+
InstalledFiles
|
9
|
+
_yardoc
|
10
|
+
coverage
|
11
|
+
doc/
|
12
|
+
lib/bundler/man
|
13
|
+
pkg
|
14
|
+
rdoc
|
15
|
+
spec/reports
|
16
|
+
test/tmp
|
17
|
+
test/version_tmp
|
18
|
+
tmp
|
19
|
+
*.bundle
|
20
|
+
*.so
|
21
|
+
*.o
|
22
|
+
*.a
|
23
|
+
mkmf.log
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Anatoly Lapshin
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Es6to5::Rails
|
2
|
+
|
3
|
+
Simple gem to translate ECMAScript 6 scripts to ES5 ones using 6to5
|
4
|
+
|
5
|
+
TODO: Use cocaine to run 6to5
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'es6to5-rails'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install es6to5-rails
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
|
23
|
+
Just require `es6to5` in your `application.js`:
|
24
|
+
|
25
|
+
//= require es6to5
|
26
|
+
|
27
|
+
And name your scripts like: `my-script.js.es6`
|
28
|
+
|
29
|
+
## Contributing
|
30
|
+
|
31
|
+
1. Fork it ( https://github.com/holywarez/es6to5-rails/fork )
|
32
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
33
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
34
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
35
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'es6to5-rails/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'es6to5-rails'
|
8
|
+
spec.version = Es6to5::VERSION
|
9
|
+
spec.authors = ['Anatoly Lapshin']
|
10
|
+
spec.email = ['holywarez@gmail.com']
|
11
|
+
spec.summary = %q{Simple gem to translate ECMAScript 6 scripts to ES5 ones using 6to5}
|
12
|
+
spec.description = %q{Simple gem to translate ECMAScript 6 scripts to ES5 ones using 6to5}
|
13
|
+
spec.homepage = ''
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.6'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
|
+
spec.add_runtime_dependency 'tilt', '>= 0'
|
24
|
+
spec.add_runtime_dependency 'sprockets', '>= 2.0.0'
|
25
|
+
end
|
data/lib/es6to5-rails.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Es6to5
|
2
|
+
class Template < ::Tilt::Template
|
3
|
+
self.default_mime_type = 'application/javascript'
|
4
|
+
|
5
|
+
def prepare
|
6
|
+
end
|
7
|
+
|
8
|
+
def evaluate(scope, locals, &block)
|
9
|
+
output = `#{Es6to5::Config.bin_path || '/usr/local/bin/6to5'} #{scope.pathname}`
|
10
|
+
|
11
|
+
%{(function(exports){\n#{output}\n})(exports || {});}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,1976 @@
|
|
1
|
+
/*!
|
2
|
+
* https://github.com/paulmillr/es6-shim
|
3
|
+
* @license es6-shim Copyright 2013-2014 by Paul Miller (http://paulmillr.com)
|
4
|
+
* and contributors, MIT License
|
5
|
+
* es6-shim: v0.19.1
|
6
|
+
* see https://github.com/paulmillr/es6-shim/blob/master/LICENSE
|
7
|
+
* Details and documentation:
|
8
|
+
* https://github.com/paulmillr/es6-shim/
|
9
|
+
*/
|
10
|
+
|
11
|
+
(function (undefined) {
|
12
|
+
'use strict';
|
13
|
+
|
14
|
+
var isCallableWithoutNew = function (func) {
|
15
|
+
try { func(); }
|
16
|
+
catch (e) { return false; }
|
17
|
+
return true;
|
18
|
+
};
|
19
|
+
|
20
|
+
var supportsSubclassing = function (C, f) {
|
21
|
+
/* jshint proto:true */
|
22
|
+
try {
|
23
|
+
var Sub = function () { C.apply(this, arguments); };
|
24
|
+
if (!Sub.__proto__) { return false; /* skip test on IE < 11 */ }
|
25
|
+
Object.setPrototypeOf(Sub, C);
|
26
|
+
Sub.prototype = Object.create(C.prototype, {
|
27
|
+
constructor: { value: C }
|
28
|
+
});
|
29
|
+
return f(Sub);
|
30
|
+
} catch (e) {
|
31
|
+
return false;
|
32
|
+
}
|
33
|
+
};
|
34
|
+
|
35
|
+
var arePropertyDescriptorsSupported = function () {
|
36
|
+
try {
|
37
|
+
Object.defineProperty({}, 'x', {});
|
38
|
+
return true;
|
39
|
+
} catch (e) { /* this is IE 8. */
|
40
|
+
return false;
|
41
|
+
}
|
42
|
+
};
|
43
|
+
|
44
|
+
var startsWithRejectsRegex = function () {
|
45
|
+
var rejectsRegex = false;
|
46
|
+
if (String.prototype.startsWith) {
|
47
|
+
try {
|
48
|
+
'/a/'.startsWith(/a/);
|
49
|
+
} catch (e) { /* this is spec compliant */
|
50
|
+
rejectsRegex = true;
|
51
|
+
}
|
52
|
+
}
|
53
|
+
return rejectsRegex;
|
54
|
+
};
|
55
|
+
|
56
|
+
/*jshint evil: true */
|
57
|
+
var getGlobal = new Function('return this;');
|
58
|
+
/*jshint evil: false */
|
59
|
+
|
60
|
+
var main = function () {
|
61
|
+
var globals = getGlobal();
|
62
|
+
var global_isFinite = globals.isFinite;
|
63
|
+
var supportsDescriptors = !!Object.defineProperty && arePropertyDescriptorsSupported();
|
64
|
+
var startsWithIsCompliant = startsWithRejectsRegex();
|
65
|
+
var _slice = Array.prototype.slice;
|
66
|
+
var _indexOf = String.prototype.indexOf;
|
67
|
+
var _toString = Object.prototype.toString;
|
68
|
+
var _hasOwnProperty = Object.prototype.hasOwnProperty;
|
69
|
+
var ArrayIterator; // make our implementation private
|
70
|
+
|
71
|
+
var defineProperty = function (object, name, value, force) {
|
72
|
+
if (!force && name in object) return;
|
73
|
+
if (supportsDescriptors) {
|
74
|
+
Object.defineProperty(object, name, {
|
75
|
+
configurable: true,
|
76
|
+
enumerable: false,
|
77
|
+
writable: true,
|
78
|
+
value: value
|
79
|
+
});
|
80
|
+
} else {
|
81
|
+
object[name] = value;
|
82
|
+
}
|
83
|
+
};
|
84
|
+
|
85
|
+
// Define configurable, writable and non-enumerable props
|
86
|
+
// if they don’t exist.
|
87
|
+
var defineProperties = function (object, map) {
|
88
|
+
Object.keys(map).forEach(function (name) {
|
89
|
+
var method = map[name];
|
90
|
+
defineProperty(object, name, method, false);
|
91
|
+
});
|
92
|
+
};
|
93
|
+
|
94
|
+
// Simple shim for Object.create on ES3 browsers
|
95
|
+
// (unlike real shim, no attempt to support `prototype === null`)
|
96
|
+
var create = Object.create || function (prototype, properties) {
|
97
|
+
function Type() {}
|
98
|
+
Type.prototype = prototype;
|
99
|
+
var object = new Type();
|
100
|
+
if (typeof properties !== "undefined") {
|
101
|
+
defineProperties(object, properties);
|
102
|
+
}
|
103
|
+
return object;
|
104
|
+
};
|
105
|
+
|
106
|
+
// This is a private name in the es6 spec, equal to '[Symbol.iterator]'
|
107
|
+
// we're going to use an arbitrary _-prefixed name to make our shims
|
108
|
+
// work properly with each other, even though we don't have full Iterator
|
109
|
+
// support. That is, `Array.from(map.keys())` will work, but we don't
|
110
|
+
// pretend to export a "real" Iterator interface.
|
111
|
+
var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||
|
112
|
+
'_es6shim_iterator_';
|
113
|
+
// Firefox ships a partial implementation using the name @@iterator.
|
114
|
+
// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14
|
115
|
+
// So use that name if we detect it.
|
116
|
+
if (globals.Set && typeof new globals.Set()['@@iterator'] === 'function') {
|
117
|
+
$iterator$ = '@@iterator';
|
118
|
+
}
|
119
|
+
var addIterator = function (prototype, impl) {
|
120
|
+
if (!impl) { impl = function iterator() { return this; }; }
|
121
|
+
var o = {};
|
122
|
+
o[$iterator$] = impl;
|
123
|
+
defineProperties(prototype, o);
|
124
|
+
/* jshint notypeof: true */
|
125
|
+
if (!prototype[$iterator$] && typeof $iterator$ === 'symbol') {
|
126
|
+
// implementations are buggy when $iterator$ is a Symbol
|
127
|
+
prototype[$iterator$] = impl;
|
128
|
+
}
|
129
|
+
};
|
130
|
+
|
131
|
+
// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js
|
132
|
+
// can be replaced with require('is-arguments') if we ever use a build process instead
|
133
|
+
var isArguments = function isArguments(value) {
|
134
|
+
var str = _toString.call(value);
|
135
|
+
var result = str === '[object Arguments]';
|
136
|
+
if (!result) {
|
137
|
+
result = str !== '[object Array]' &&
|
138
|
+
value !== null &&
|
139
|
+
typeof value === 'object' &&
|
140
|
+
typeof value.length === 'number' &&
|
141
|
+
value.length >= 0 &&
|
142
|
+
_toString.call(value.callee) === '[object Function]';
|
143
|
+
}
|
144
|
+
return result;
|
145
|
+
};
|
146
|
+
|
147
|
+
var emulateES6construct = function (o) {
|
148
|
+
if (!ES.TypeIsObject(o)) throw new TypeError('bad object');
|
149
|
+
// es5 approximation to es6 subclass semantics: in es6, 'new Foo'
|
150
|
+
// would invoke Foo.@@create to allocation/initialize the new object.
|
151
|
+
// In es5 we just get the plain object. So if we detect an
|
152
|
+
// uninitialized object, invoke o.constructor.@@create
|
153
|
+
if (!o._es6construct) {
|
154
|
+
if (o.constructor && ES.IsCallable(o.constructor['@@create'])) {
|
155
|
+
o = o.constructor['@@create'](o);
|
156
|
+
}
|
157
|
+
defineProperties(o, { _es6construct: true });
|
158
|
+
}
|
159
|
+
return o;
|
160
|
+
};
|
161
|
+
|
162
|
+
var ES = {
|
163
|
+
CheckObjectCoercible: function (x, optMessage) {
|
164
|
+
/* jshint eqnull:true */
|
165
|
+
if (x == null)
|
166
|
+
throw new TypeError(optMessage || ('Cannot call method on ' + x));
|
167
|
+
return x;
|
168
|
+
},
|
169
|
+
|
170
|
+
TypeIsObject: function (x) {
|
171
|
+
/* jshint eqnull:true */
|
172
|
+
// this is expensive when it returns false; use this function
|
173
|
+
// when you expect it to return true in the common case.
|
174
|
+
return x != null && Object(x) === x;
|
175
|
+
},
|
176
|
+
|
177
|
+
ToObject: function (o, optMessage) {
|
178
|
+
return Object(ES.CheckObjectCoercible(o, optMessage));
|
179
|
+
},
|
180
|
+
|
181
|
+
IsCallable: function (x) {
|
182
|
+
return typeof x === 'function' &&
|
183
|
+
// some versions of IE say that typeof /abc/ === 'function'
|
184
|
+
_toString.call(x) === '[object Function]';
|
185
|
+
},
|
186
|
+
|
187
|
+
ToInt32: function (x) {
|
188
|
+
return x >> 0;
|
189
|
+
},
|
190
|
+
|
191
|
+
ToUint32: function (x) {
|
192
|
+
return x >>> 0;
|
193
|
+
},
|
194
|
+
|
195
|
+
ToInteger: function (value) {
|
196
|
+
var number = +value;
|
197
|
+
if (Number.isNaN(number)) return 0;
|
198
|
+
if (number === 0 || !Number.isFinite(number)) return number;
|
199
|
+
return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
|
200
|
+
},
|
201
|
+
|
202
|
+
ToLength: function (value) {
|
203
|
+
var len = ES.ToInteger(value);
|
204
|
+
if (len <= 0) return 0; // includes converting -0 to +0
|
205
|
+
if (len > Number.MAX_SAFE_INTEGER) return Number.MAX_SAFE_INTEGER;
|
206
|
+
return len;
|
207
|
+
},
|
208
|
+
|
209
|
+
SameValue: function (a, b) {
|
210
|
+
if (a === b) {
|
211
|
+
// 0 === -0, but they are not identical.
|
212
|
+
if (a === 0) return 1 / a === 1 / b;
|
213
|
+
return true;
|
214
|
+
}
|
215
|
+
return Number.isNaN(a) && Number.isNaN(b);
|
216
|
+
},
|
217
|
+
|
218
|
+
SameValueZero: function (a, b) {
|
219
|
+
// same as SameValue except for SameValueZero(+0, -0) == true
|
220
|
+
return (a === b) || (Number.isNaN(a) && Number.isNaN(b));
|
221
|
+
},
|
222
|
+
|
223
|
+
IsIterable: function (o) {
|
224
|
+
return ES.TypeIsObject(o) &&
|
225
|
+
(o[$iterator$] !== undefined || isArguments(o));
|
226
|
+
},
|
227
|
+
|
228
|
+
GetIterator: function (o) {
|
229
|
+
if (isArguments(o)) {
|
230
|
+
// special case support for `arguments`
|
231
|
+
return new ArrayIterator(o, "value");
|
232
|
+
}
|
233
|
+
var it = o[$iterator$]();
|
234
|
+
if (!ES.TypeIsObject(it)) {
|
235
|
+
throw new TypeError('bad iterator');
|
236
|
+
}
|
237
|
+
return it;
|
238
|
+
},
|
239
|
+
|
240
|
+
IteratorNext: function (it) {
|
241
|
+
var result = arguments.length > 1 ? it.next(arguments[1]) : it.next();
|
242
|
+
if (!ES.TypeIsObject(result)) {
|
243
|
+
throw new TypeError('bad iterator');
|
244
|
+
}
|
245
|
+
return result;
|
246
|
+
},
|
247
|
+
|
248
|
+
Construct: function (C, args) {
|
249
|
+
// CreateFromConstructor
|
250
|
+
var obj;
|
251
|
+
if (ES.IsCallable(C['@@create'])) {
|
252
|
+
obj = C['@@create']();
|
253
|
+
} else {
|
254
|
+
// OrdinaryCreateFromConstructor
|
255
|
+
obj = create(C.prototype || null);
|
256
|
+
}
|
257
|
+
// Mark that we've used the es6 construct path
|
258
|
+
// (see emulateES6construct)
|
259
|
+
defineProperties(obj, { _es6construct: true });
|
260
|
+
// Call the constructor.
|
261
|
+
var result = C.apply(obj, args);
|
262
|
+
return ES.TypeIsObject(result) ? result : obj;
|
263
|
+
}
|
264
|
+
};
|
265
|
+
|
266
|
+
var numberConversion = (function () {
|
267
|
+
// from https://github.com/inexorabletash/polyfill/blob/master/typedarray.js#L176-L266
|
268
|
+
// with permission and license, per https://twitter.com/inexorabletash/status/372206509540659200
|
269
|
+
|
270
|
+
function roundToEven(n) {
|
271
|
+
var w = Math.floor(n), f = n - w;
|
272
|
+
if (f < 0.5) {
|
273
|
+
return w;
|
274
|
+
}
|
275
|
+
if (f > 0.5) {
|
276
|
+
return w + 1;
|
277
|
+
}
|
278
|
+
return w % 2 ? w + 1 : w;
|
279
|
+
}
|
280
|
+
|
281
|
+
function packIEEE754(v, ebits, fbits) {
|
282
|
+
var bias = (1 << (ebits - 1)) - 1,
|
283
|
+
s, e, f, ln,
|
284
|
+
i, bits, str, bytes;
|
285
|
+
|
286
|
+
// Compute sign, exponent, fraction
|
287
|
+
if (v !== v) {
|
288
|
+
// NaN
|
289
|
+
// http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping
|
290
|
+
e = (1 << ebits) - 1;
|
291
|
+
f = Math.pow(2, fbits - 1);
|
292
|
+
s = 0;
|
293
|
+
} else if (v === Infinity || v === -Infinity) {
|
294
|
+
e = (1 << ebits) - 1;
|
295
|
+
f = 0;
|
296
|
+
s = (v < 0) ? 1 : 0;
|
297
|
+
} else if (v === 0) {
|
298
|
+
e = 0;
|
299
|
+
f = 0;
|
300
|
+
s = (1 / v === -Infinity) ? 1 : 0;
|
301
|
+
} else {
|
302
|
+
s = v < 0;
|
303
|
+
v = Math.abs(v);
|
304
|
+
|
305
|
+
if (v >= Math.pow(2, 1 - bias)) {
|
306
|
+
e = Math.min(Math.floor(Math.log(v) / Math.LN2), 1023);
|
307
|
+
f = roundToEven(v / Math.pow(2, e) * Math.pow(2, fbits));
|
308
|
+
if (f / Math.pow(2, fbits) >= 2) {
|
309
|
+
e = e + 1;
|
310
|
+
f = 1;
|
311
|
+
}
|
312
|
+
if (e > bias) {
|
313
|
+
// Overflow
|
314
|
+
e = (1 << ebits) - 1;
|
315
|
+
f = 0;
|
316
|
+
} else {
|
317
|
+
// Normal
|
318
|
+
e = e + bias;
|
319
|
+
f = f - Math.pow(2, fbits);
|
320
|
+
}
|
321
|
+
} else {
|
322
|
+
// Subnormal
|
323
|
+
e = 0;
|
324
|
+
f = roundToEven(v / Math.pow(2, 1 - bias - fbits));
|
325
|
+
}
|
326
|
+
}
|
327
|
+
|
328
|
+
// Pack sign, exponent, fraction
|
329
|
+
bits = [];
|
330
|
+
for (i = fbits; i; i -= 1) {
|
331
|
+
bits.push(f % 2 ? 1 : 0);
|
332
|
+
f = Math.floor(f / 2);
|
333
|
+
}
|
334
|
+
for (i = ebits; i; i -= 1) {
|
335
|
+
bits.push(e % 2 ? 1 : 0);
|
336
|
+
e = Math.floor(e / 2);
|
337
|
+
}
|
338
|
+
bits.push(s ? 1 : 0);
|
339
|
+
bits.reverse();
|
340
|
+
str = bits.join('');
|
341
|
+
|
342
|
+
// Bits to bytes
|
343
|
+
bytes = [];
|
344
|
+
while (str.length) {
|
345
|
+
bytes.push(parseInt(str.slice(0, 8), 2));
|
346
|
+
str = str.slice(8);
|
347
|
+
}
|
348
|
+
return bytes;
|
349
|
+
}
|
350
|
+
|
351
|
+
function unpackIEEE754(bytes, ebits, fbits) {
|
352
|
+
// Bytes to bits
|
353
|
+
var bits = [], i, j, b, str,
|
354
|
+
bias, s, e, f;
|
355
|
+
|
356
|
+
for (i = bytes.length; i; i -= 1) {
|
357
|
+
b = bytes[i - 1];
|
358
|
+
for (j = 8; j; j -= 1) {
|
359
|
+
bits.push(b % 2 ? 1 : 0);
|
360
|
+
b = b >> 1;
|
361
|
+
}
|
362
|
+
}
|
363
|
+
bits.reverse();
|
364
|
+
str = bits.join('');
|
365
|
+
|
366
|
+
// Unpack sign, exponent, fraction
|
367
|
+
bias = (1 << (ebits - 1)) - 1;
|
368
|
+
s = parseInt(str.slice(0, 1), 2) ? -1 : 1;
|
369
|
+
e = parseInt(str.slice(1, 1 + ebits), 2);
|
370
|
+
f = parseInt(str.slice(1 + ebits), 2);
|
371
|
+
|
372
|
+
// Produce number
|
373
|
+
if (e === (1 << ebits) - 1) {
|
374
|
+
return f !== 0 ? NaN : s * Infinity;
|
375
|
+
} else if (e > 0) {
|
376
|
+
// Normalized
|
377
|
+
return s * Math.pow(2, e - bias) * (1 + f / Math.pow(2, fbits));
|
378
|
+
} else if (f !== 0) {
|
379
|
+
// Denormalized
|
380
|
+
return s * Math.pow(2, -(bias - 1)) * (f / Math.pow(2, fbits));
|
381
|
+
} else {
|
382
|
+
return s < 0 ? -0 : 0;
|
383
|
+
}
|
384
|
+
}
|
385
|
+
|
386
|
+
function unpackFloat64(b) { return unpackIEEE754(b, 11, 52); }
|
387
|
+
function packFloat64(v) { return packIEEE754(v, 11, 52); }
|
388
|
+
function unpackFloat32(b) { return unpackIEEE754(b, 8, 23); }
|
389
|
+
function packFloat32(v) { return packIEEE754(v, 8, 23); }
|
390
|
+
|
391
|
+
var conversions = {
|
392
|
+
toFloat32: function (num) { return unpackFloat32(packFloat32(num)); }
|
393
|
+
};
|
394
|
+
if (typeof Float32Array !== 'undefined') {
|
395
|
+
var float32array = new Float32Array(1);
|
396
|
+
conversions.toFloat32 = function (num) {
|
397
|
+
float32array[0] = num;
|
398
|
+
return float32array[0];
|
399
|
+
};
|
400
|
+
}
|
401
|
+
return conversions;
|
402
|
+
}());
|
403
|
+
|
404
|
+
defineProperties(String, {
|
405
|
+
fromCodePoint: function (_) { // length = 1
|
406
|
+
var points = _slice.call(arguments, 0, arguments.length);
|
407
|
+
var result = [];
|
408
|
+
var next;
|
409
|
+
for (var i = 0, length = points.length; i < length; i++) {
|
410
|
+
next = Number(points[i]);
|
411
|
+
if (!ES.SameValue(next, ES.ToInteger(next)) ||
|
412
|
+
next < 0 || next > 0x10FFFF) {
|
413
|
+
throw new RangeError('Invalid code point ' + next);
|
414
|
+
}
|
415
|
+
|
416
|
+
if (next < 0x10000) {
|
417
|
+
result.push(String.fromCharCode(next));
|
418
|
+
} else {
|
419
|
+
next -= 0x10000;
|
420
|
+
result.push(String.fromCharCode((next >> 10) + 0xD800));
|
421
|
+
result.push(String.fromCharCode((next % 0x400) + 0xDC00));
|
422
|
+
}
|
423
|
+
}
|
424
|
+
return result.join('');
|
425
|
+
},
|
426
|
+
|
427
|
+
raw: function (callSite) { // raw.length===1
|
428
|
+
var substitutions = _slice.call(arguments, 1, arguments.length);
|
429
|
+
var cooked = ES.ToObject(callSite, 'bad callSite');
|
430
|
+
var rawValue = cooked.raw;
|
431
|
+
var raw = ES.ToObject(rawValue, 'bad raw value');
|
432
|
+
var len = Object.keys(raw).length;
|
433
|
+
var literalsegments = ES.ToLength(len);
|
434
|
+
if (literalsegments === 0) {
|
435
|
+
return '';
|
436
|
+
}
|
437
|
+
|
438
|
+
var stringElements = [];
|
439
|
+
var nextIndex = 0;
|
440
|
+
var nextKey, next, nextSeg, nextSub;
|
441
|
+
while (nextIndex < literalsegments) {
|
442
|
+
nextKey = String(nextIndex);
|
443
|
+
next = raw[nextKey];
|
444
|
+
nextSeg = String(next);
|
445
|
+
stringElements.push(nextSeg);
|
446
|
+
if (nextIndex + 1 >= literalsegments) {
|
447
|
+
break;
|
448
|
+
}
|
449
|
+
next = substitutions[nextKey];
|
450
|
+
if (next === undefined) {
|
451
|
+
break;
|
452
|
+
}
|
453
|
+
nextSub = String(next);
|
454
|
+
stringElements.push(nextSub);
|
455
|
+
nextIndex++;
|
456
|
+
}
|
457
|
+
return stringElements.join('');
|
458
|
+
}
|
459
|
+
});
|
460
|
+
|
461
|
+
// Firefox 31 reports this function's length as 0
|
462
|
+
// https://bugzilla.mozilla.org/show_bug.cgi?id=1062484
|
463
|
+
if (String.fromCodePoint.length !== 1) {
|
464
|
+
var originalFromCodePoint = String.fromCodePoint;
|
465
|
+
defineProperty(String, 'fromCodePoint', function (_) { return originalFromCodePoint.apply(this, arguments); }, true);
|
466
|
+
}
|
467
|
+
|
468
|
+
var StringShims = {
|
469
|
+
// Fast repeat, uses the `Exponentiation by squaring` algorithm.
|
470
|
+
// Perf: http://jsperf.com/string-repeat2/2
|
471
|
+
repeat: (function () {
|
472
|
+
var repeat = function (s, times) {
|
473
|
+
if (times < 1) return '';
|
474
|
+
if (times % 2) return repeat(s, times - 1) + s;
|
475
|
+
var half = repeat(s, times / 2);
|
476
|
+
return half + half;
|
477
|
+
};
|
478
|
+
|
479
|
+
return function (times) {
|
480
|
+
var thisStr = String(ES.CheckObjectCoercible(this));
|
481
|
+
times = ES.ToInteger(times);
|
482
|
+
if (times < 0 || times === Infinity) {
|
483
|
+
throw new RangeError('Invalid String#repeat value');
|
484
|
+
}
|
485
|
+
return repeat(thisStr, times);
|
486
|
+
};
|
487
|
+
})(),
|
488
|
+
|
489
|
+
startsWith: function (searchStr) {
|
490
|
+
var thisStr = String(ES.CheckObjectCoercible(this));
|
491
|
+
if (_toString.call(searchStr) === '[object RegExp]') throw new TypeError('Cannot call method "startsWith" with a regex');
|
492
|
+
searchStr = String(searchStr);
|
493
|
+
var startArg = arguments.length > 1 ? arguments[1] : undefined;
|
494
|
+
var start = Math.max(ES.ToInteger(startArg), 0);
|
495
|
+
return thisStr.slice(start, start + searchStr.length) === searchStr;
|
496
|
+
},
|
497
|
+
|
498
|
+
endsWith: function (searchStr) {
|
499
|
+
var thisStr = String(ES.CheckObjectCoercible(this));
|
500
|
+
if (_toString.call(searchStr) === '[object RegExp]') throw new TypeError('Cannot call method "endsWith" with a regex');
|
501
|
+
searchStr = String(searchStr);
|
502
|
+
var thisLen = thisStr.length;
|
503
|
+
var posArg = arguments.length > 1 ? arguments[1] : undefined;
|
504
|
+
var pos = posArg === undefined ? thisLen : ES.ToInteger(posArg);
|
505
|
+
var end = Math.min(Math.max(pos, 0), thisLen);
|
506
|
+
return thisStr.slice(end - searchStr.length, end) === searchStr;
|
507
|
+
},
|
508
|
+
|
509
|
+
contains: function (searchString) {
|
510
|
+
var position = arguments.length > 1 ? arguments[1] : undefined;
|
511
|
+
// Somehow this trick makes method 100% compat with the spec.
|
512
|
+
return _indexOf.call(this, searchString, position) !== -1;
|
513
|
+
},
|
514
|
+
|
515
|
+
codePointAt: function (pos) {
|
516
|
+
var thisStr = String(ES.CheckObjectCoercible(this));
|
517
|
+
var position = ES.ToInteger(pos);
|
518
|
+
var length = thisStr.length;
|
519
|
+
if (position < 0 || position >= length) return undefined;
|
520
|
+
var first = thisStr.charCodeAt(position);
|
521
|
+
var isEnd = (position + 1 === length);
|
522
|
+
if (first < 0xD800 || first > 0xDBFF || isEnd) return first;
|
523
|
+
var second = thisStr.charCodeAt(position + 1);
|
524
|
+
if (second < 0xDC00 || second > 0xDFFF) return first;
|
525
|
+
return ((first - 0xD800) * 1024) + (second - 0xDC00) + 0x10000;
|
526
|
+
}
|
527
|
+
};
|
528
|
+
defineProperties(String.prototype, StringShims);
|
529
|
+
|
530
|
+
var hasStringTrimBug = '\u0085'.trim().length !== 1;
|
531
|
+
if (hasStringTrimBug) {
|
532
|
+
var originalStringTrim = String.prototype.trim;
|
533
|
+
delete String.prototype.trim;
|
534
|
+
// whitespace from: http://es5.github.io/#x15.5.4.20
|
535
|
+
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
|
536
|
+
var ws = [
|
537
|
+
'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
|
538
|
+
'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
|
539
|
+
'\u2029\uFEFF'
|
540
|
+
].join('');
|
541
|
+
var trimRegexp = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
|
542
|
+
defineProperties(String.prototype, {
|
543
|
+
trim: function () {
|
544
|
+
if (this === undefined || this === null) {
|
545
|
+
throw new TypeError("can't convert " + this + " to object");
|
546
|
+
}
|
547
|
+
return String(this).replace(trimRegexp, "");
|
548
|
+
}
|
549
|
+
});
|
550
|
+
}
|
551
|
+
|
552
|
+
// see https://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype-@@iterator
|
553
|
+
var StringIterator = function (s) {
|
554
|
+
this._s = String(ES.CheckObjectCoercible(s));
|
555
|
+
this._i = 0;
|
556
|
+
};
|
557
|
+
StringIterator.prototype.next = function () {
|
558
|
+
var s = this._s, i = this._i;
|
559
|
+
if (s === undefined || i >= s.length) {
|
560
|
+
this._s = undefined;
|
561
|
+
return { value: undefined, done: true };
|
562
|
+
}
|
563
|
+
var first = s.charCodeAt(i), second, len;
|
564
|
+
if (first < 0xD800 || first > 0xDBFF || (i + 1) == s.length) {
|
565
|
+
len = 1;
|
566
|
+
} else {
|
567
|
+
second = s.charCodeAt(i + 1);
|
568
|
+
len = (second < 0xDC00 || second > 0xDFFF) ? 1 : 2;
|
569
|
+
}
|
570
|
+
this._i = i + len;
|
571
|
+
return { value: s.substr(i, len), done: false };
|
572
|
+
};
|
573
|
+
addIterator(StringIterator.prototype);
|
574
|
+
addIterator(String.prototype, function () {
|
575
|
+
return new StringIterator(this);
|
576
|
+
});
|
577
|
+
|
578
|
+
if (!startsWithIsCompliant) {
|
579
|
+
// Firefox has a noncompliant startsWith implementation
|
580
|
+
String.prototype.startsWith = StringShims.startsWith;
|
581
|
+
String.prototype.endsWith = StringShims.endsWith;
|
582
|
+
}
|
583
|
+
|
584
|
+
var ArrayShims = {
|
585
|
+
from: function (iterable) {
|
586
|
+
var mapFn = arguments.length > 1 ? arguments[1] : undefined;
|
587
|
+
|
588
|
+
var list = ES.ToObject(iterable, 'bad iterable');
|
589
|
+
if (mapFn !== undefined && !ES.IsCallable(mapFn)) {
|
590
|
+
throw new TypeError('Array.from: when provided, the second argument must be a function');
|
591
|
+
}
|
592
|
+
|
593
|
+
var hasThisArg = arguments.length > 2;
|
594
|
+
var thisArg = hasThisArg ? arguments[2] : undefined;
|
595
|
+
|
596
|
+
var usingIterator = ES.IsIterable(list);
|
597
|
+
// does the spec really mean that Arrays should use ArrayIterator?
|
598
|
+
// https://bugs.ecmascript.org/show_bug.cgi?id=2416
|
599
|
+
//if (Array.isArray(list)) { usingIterator=false; }
|
600
|
+
|
601
|
+
var length;
|
602
|
+
var result, i, value;
|
603
|
+
if (usingIterator) {
|
604
|
+
i = 0;
|
605
|
+
result = ES.IsCallable(this) ? Object(new this()) : [];
|
606
|
+
var it = usingIterator ? ES.GetIterator(list) : null;
|
607
|
+
var iterationValue;
|
608
|
+
|
609
|
+
do {
|
610
|
+
iterationValue = ES.IteratorNext(it);
|
611
|
+
if (!iterationValue.done) {
|
612
|
+
value = iterationValue.value;
|
613
|
+
if (mapFn) {
|
614
|
+
result[i] = hasThisArg ? mapFn.call(thisArg, value, i) : mapFn(value, i);
|
615
|
+
} else {
|
616
|
+
result[i] = value;
|
617
|
+
}
|
618
|
+
i += 1;
|
619
|
+
}
|
620
|
+
} while (!iterationValue.done);
|
621
|
+
length = i;
|
622
|
+
} else {
|
623
|
+
length = ES.ToLength(list.length);
|
624
|
+
result = ES.IsCallable(this) ? Object(new this(length)) : new Array(length);
|
625
|
+
for (i = 0; i < length; ++i) {
|
626
|
+
value = list[i];
|
627
|
+
if (mapFn) {
|
628
|
+
result[i] = hasThisArg ? mapFn.call(thisArg, value, i) : mapFn(value, i);
|
629
|
+
} else {
|
630
|
+
result[i] = value;
|
631
|
+
}
|
632
|
+
}
|
633
|
+
}
|
634
|
+
|
635
|
+
result.length = length;
|
636
|
+
return result;
|
637
|
+
},
|
638
|
+
|
639
|
+
of: function () {
|
640
|
+
return Array.from(arguments);
|
641
|
+
}
|
642
|
+
};
|
643
|
+
defineProperties(Array, ArrayShims);
|
644
|
+
|
645
|
+
var arrayFromSwallowsNegativeLengths = function () {
|
646
|
+
try {
|
647
|
+
return Array.from({ length: -1 }).length === 0;
|
648
|
+
} catch (e) {
|
649
|
+
return false;
|
650
|
+
}
|
651
|
+
};
|
652
|
+
// Fixes a Firefox bug in v32
|
653
|
+
// https://bugzilla.mozilla.org/show_bug.cgi?id=1063993
|
654
|
+
if (!arrayFromSwallowsNegativeLengths()) {
|
655
|
+
defineProperty(Array, 'from', ArrayShims.from, true);
|
656
|
+
}
|
657
|
+
|
658
|
+
// Our ArrayIterator is private; see
|
659
|
+
// https://github.com/paulmillr/es6-shim/issues/252
|
660
|
+
ArrayIterator = function (array, kind) {
|
661
|
+
this.i = 0;
|
662
|
+
this.array = array;
|
663
|
+
this.kind = kind;
|
664
|
+
};
|
665
|
+
|
666
|
+
defineProperties(ArrayIterator.prototype, {
|
667
|
+
next: function () {
|
668
|
+
var i = this.i, array = this.array;
|
669
|
+
if (!(this instanceof ArrayIterator)) {
|
670
|
+
throw new TypeError('Not an ArrayIterator');
|
671
|
+
}
|
672
|
+
if (array !== undefined) {
|
673
|
+
var len = ES.ToLength(array.length);
|
674
|
+
for (; i < len; i++) {
|
675
|
+
var kind = this.kind;
|
676
|
+
var retval;
|
677
|
+
if (kind === "key") {
|
678
|
+
retval = i;
|
679
|
+
} else if (kind === "value") {
|
680
|
+
retval = array[i];
|
681
|
+
} else if (kind === "entry") {
|
682
|
+
retval = [i, array[i]];
|
683
|
+
}
|
684
|
+
this.i = i + 1;
|
685
|
+
return { value: retval, done: false };
|
686
|
+
}
|
687
|
+
}
|
688
|
+
this.array = undefined;
|
689
|
+
return { value: undefined, done: true };
|
690
|
+
}
|
691
|
+
});
|
692
|
+
addIterator(ArrayIterator.prototype);
|
693
|
+
|
694
|
+
var ArrayPrototypeShims = {
|
695
|
+
copyWithin: function (target, start) {
|
696
|
+
var end = arguments[2]; // copyWithin.length must be 2
|
697
|
+
var o = ES.ToObject(this);
|
698
|
+
var len = ES.ToLength(o.length);
|
699
|
+
target = ES.ToInteger(target);
|
700
|
+
start = ES.ToInteger(start);
|
701
|
+
var to = target < 0 ? Math.max(len + target, 0) : Math.min(target, len);
|
702
|
+
var from = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
|
703
|
+
end = end === undefined ? len : ES.ToInteger(end);
|
704
|
+
var fin = end < 0 ? Math.max(len + end, 0) : Math.min(end, len);
|
705
|
+
var count = Math.min(fin - from, len - to);
|
706
|
+
var direction = 1;
|
707
|
+
if (from < to && to < (from + count)) {
|
708
|
+
direction = -1;
|
709
|
+
from += count - 1;
|
710
|
+
to += count - 1;
|
711
|
+
}
|
712
|
+
while (count > 0) {
|
713
|
+
if (_hasOwnProperty.call(o, from)) {
|
714
|
+
o[to] = o[from];
|
715
|
+
} else {
|
716
|
+
delete o[from];
|
717
|
+
}
|
718
|
+
from += direction;
|
719
|
+
to += direction;
|
720
|
+
count -= 1;
|
721
|
+
}
|
722
|
+
return o;
|
723
|
+
},
|
724
|
+
|
725
|
+
fill: function (value) {
|
726
|
+
var start = arguments.length > 1 ? arguments[1] : undefined;
|
727
|
+
var end = arguments.length > 2 ? arguments[2] : undefined;
|
728
|
+
var O = ES.ToObject(this);
|
729
|
+
var len = ES.ToLength(O.length);
|
730
|
+
start = ES.ToInteger(start === undefined ? 0 : start);
|
731
|
+
end = ES.ToInteger(end === undefined ? len : end);
|
732
|
+
|
733
|
+
var relativeStart = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
|
734
|
+
var relativeEnd = end < 0 ? len + end : end;
|
735
|
+
|
736
|
+
for (var i = relativeStart; i < len && i < relativeEnd; ++i) {
|
737
|
+
O[i] = value;
|
738
|
+
}
|
739
|
+
return O;
|
740
|
+
},
|
741
|
+
|
742
|
+
find: function find(predicate) {
|
743
|
+
var list = ES.ToObject(this);
|
744
|
+
var length = ES.ToLength(list.length);
|
745
|
+
if (!ES.IsCallable(predicate)) {
|
746
|
+
throw new TypeError('Array#find: predicate must be a function');
|
747
|
+
}
|
748
|
+
var thisArg = arguments[1];
|
749
|
+
for (var i = 0, value; i < length; i++) {
|
750
|
+
value = list[i];
|
751
|
+
if (predicate.call(thisArg, value, i, list)) { return value; }
|
752
|
+
}
|
753
|
+
return undefined;
|
754
|
+
},
|
755
|
+
|
756
|
+
findIndex: function findIndex(predicate) {
|
757
|
+
var list = ES.ToObject(this);
|
758
|
+
var length = ES.ToLength(list.length);
|
759
|
+
if (!ES.IsCallable(predicate)) {
|
760
|
+
throw new TypeError('Array#findIndex: predicate must be a function');
|
761
|
+
}
|
762
|
+
var thisArg = arguments[1];
|
763
|
+
for (var i = 0; i < length; i++) {
|
764
|
+
if (predicate.call(thisArg, list[i], i, list)) { return i; }
|
765
|
+
}
|
766
|
+
return -1;
|
767
|
+
},
|
768
|
+
|
769
|
+
keys: function () {
|
770
|
+
return new ArrayIterator(this, "key");
|
771
|
+
},
|
772
|
+
|
773
|
+
values: function () {
|
774
|
+
return new ArrayIterator(this, "value");
|
775
|
+
},
|
776
|
+
|
777
|
+
entries: function () {
|
778
|
+
return new ArrayIterator(this, "entry");
|
779
|
+
}
|
780
|
+
};
|
781
|
+
// Safari 7.1 defines Array#keys and Array#entries natively,
|
782
|
+
// but the resulting ArrayIterator objects don't have a "next" method.
|
783
|
+
if (Array.prototype.keys && !ES.IsCallable([1].keys().next)) {
|
784
|
+
delete Array.prototype.keys;
|
785
|
+
}
|
786
|
+
if (Array.prototype.entries && !ES.IsCallable([1].entries().next)) {
|
787
|
+
delete Array.prototype.entries;
|
788
|
+
}
|
789
|
+
defineProperties(Array.prototype, ArrayPrototypeShims);
|
790
|
+
|
791
|
+
addIterator(Array.prototype, function () { return this.values(); });
|
792
|
+
// Chrome defines keys/values/entries on Array, but doesn't give us
|
793
|
+
// any way to identify its iterator. So add our own shimmed field.
|
794
|
+
if (Object.getPrototypeOf) {
|
795
|
+
addIterator(Object.getPrototypeOf([].values()));
|
796
|
+
}
|
797
|
+
|
798
|
+
var maxSafeInteger = Math.pow(2, 53) - 1;
|
799
|
+
defineProperties(Number, {
|
800
|
+
MAX_SAFE_INTEGER: maxSafeInteger,
|
801
|
+
MIN_SAFE_INTEGER: -maxSafeInteger,
|
802
|
+
EPSILON: 2.220446049250313e-16,
|
803
|
+
|
804
|
+
parseInt: globals.parseInt,
|
805
|
+
parseFloat: globals.parseFloat,
|
806
|
+
|
807
|
+
isFinite: function (value) {
|
808
|
+
return typeof value === 'number' && global_isFinite(value);
|
809
|
+
},
|
810
|
+
|
811
|
+
isInteger: function (value) {
|
812
|
+
return Number.isFinite(value) &&
|
813
|
+
ES.ToInteger(value) === value;
|
814
|
+
},
|
815
|
+
|
816
|
+
isSafeInteger: function (value) {
|
817
|
+
return Number.isInteger(value) && Math.abs(value) <= Number.MAX_SAFE_INTEGER;
|
818
|
+
},
|
819
|
+
|
820
|
+
isNaN: function (value) {
|
821
|
+
// NaN !== NaN, but they are identical.
|
822
|
+
// NaNs are the only non-reflexive value, i.e., if x !== x,
|
823
|
+
// then x is NaN.
|
824
|
+
// isNaN is broken: it converts its argument to number, so
|
825
|
+
// isNaN('foo') => true
|
826
|
+
return value !== value;
|
827
|
+
}
|
828
|
+
|
829
|
+
});
|
830
|
+
|
831
|
+
// Work around bugs in Array#find and Array#findIndex -- early
|
832
|
+
// implementations skipped holes in sparse arrays. (Note that the
|
833
|
+
// implementations of find/findIndex indirectly use shimmed
|
834
|
+
// methods of Number, so this test has to happen down here.)
|
835
|
+
if (![, 1].find(function (item, idx) { return idx === 0; })) {
|
836
|
+
defineProperty(Array.prototype, 'find', ArrayPrototypeShims.find, true);
|
837
|
+
}
|
838
|
+
if ([, 1].findIndex(function (item, idx) { return idx === 0; }) !== 0) {
|
839
|
+
defineProperty(Array.prototype, 'findIndex', ArrayPrototypeShims.findIndex, true);
|
840
|
+
}
|
841
|
+
|
842
|
+
if (supportsDescriptors) {
|
843
|
+
defineProperties(Object, {
|
844
|
+
getPropertyDescriptor: function (subject, name) {
|
845
|
+
var pd = Object.getOwnPropertyDescriptor(subject, name);
|
846
|
+
var proto = Object.getPrototypeOf(subject);
|
847
|
+
while (pd === undefined && proto !== null) {
|
848
|
+
pd = Object.getOwnPropertyDescriptor(proto, name);
|
849
|
+
proto = Object.getPrototypeOf(proto);
|
850
|
+
}
|
851
|
+
return pd;
|
852
|
+
},
|
853
|
+
|
854
|
+
getPropertyNames: function (subject) {
|
855
|
+
var result = Object.getOwnPropertyNames(subject);
|
856
|
+
var proto = Object.getPrototypeOf(subject);
|
857
|
+
|
858
|
+
var addProperty = function (property) {
|
859
|
+
if (result.indexOf(property) === -1) {
|
860
|
+
result.push(property);
|
861
|
+
}
|
862
|
+
};
|
863
|
+
|
864
|
+
while (proto !== null) {
|
865
|
+
Object.getOwnPropertyNames(proto).forEach(addProperty);
|
866
|
+
proto = Object.getPrototypeOf(proto);
|
867
|
+
}
|
868
|
+
return result;
|
869
|
+
}
|
870
|
+
});
|
871
|
+
|
872
|
+
defineProperties(Object, {
|
873
|
+
// 19.1.3.1
|
874
|
+
assign: function (target, source) {
|
875
|
+
if (!ES.TypeIsObject(target)) {
|
876
|
+
throw new TypeError('target must be an object');
|
877
|
+
}
|
878
|
+
return Array.prototype.reduce.call(arguments, function (target, source) {
|
879
|
+
return Object.keys(Object(source)).reduce(function (target, key) {
|
880
|
+
target[key] = source[key];
|
881
|
+
return target;
|
882
|
+
}, target);
|
883
|
+
});
|
884
|
+
},
|
885
|
+
|
886
|
+
is: function (a, b) {
|
887
|
+
return ES.SameValue(a, b);
|
888
|
+
},
|
889
|
+
|
890
|
+
// 19.1.3.9
|
891
|
+
// shim from https://gist.github.com/WebReflection/5593554
|
892
|
+
setPrototypeOf: (function (Object, magic) {
|
893
|
+
var set;
|
894
|
+
|
895
|
+
var checkArgs = function (O, proto) {
|
896
|
+
if (!ES.TypeIsObject(O)) {
|
897
|
+
throw new TypeError('cannot set prototype on a non-object');
|
898
|
+
}
|
899
|
+
if (!(proto === null || ES.TypeIsObject(proto))) {
|
900
|
+
throw new TypeError('can only set prototype to an object or null' + proto);
|
901
|
+
}
|
902
|
+
};
|
903
|
+
|
904
|
+
var setPrototypeOf = function (O, proto) {
|
905
|
+
checkArgs(O, proto);
|
906
|
+
set.call(O, proto);
|
907
|
+
return O;
|
908
|
+
};
|
909
|
+
|
910
|
+
try {
|
911
|
+
// this works already in Firefox and Safari
|
912
|
+
set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set;
|
913
|
+
set.call({}, null);
|
914
|
+
} catch (e) {
|
915
|
+
if (Object.prototype !== {}[magic]) {
|
916
|
+
// IE < 11 cannot be shimmed
|
917
|
+
return;
|
918
|
+
}
|
919
|
+
// probably Chrome or some old Mobile stock browser
|
920
|
+
set = function (proto) {
|
921
|
+
this[magic] = proto;
|
922
|
+
};
|
923
|
+
// please note that this will **not** work
|
924
|
+
// in those browsers that do not inherit
|
925
|
+
// __proto__ by mistake from Object.prototype
|
926
|
+
// in these cases we should probably throw an error
|
927
|
+
// or at least be informed about the issue
|
928
|
+
setPrototypeOf.polyfill = setPrototypeOf(
|
929
|
+
setPrototypeOf({}, null),
|
930
|
+
Object.prototype
|
931
|
+
) instanceof Object;
|
932
|
+
// setPrototypeOf.polyfill === true means it works as meant
|
933
|
+
// setPrototypeOf.polyfill === false means it's not 100% reliable
|
934
|
+
// setPrototypeOf.polyfill === undefined
|
935
|
+
// or
|
936
|
+
// setPrototypeOf.polyfill == null means it's not a polyfill
|
937
|
+
// which means it works as expected
|
938
|
+
// we can even delete Object.prototype.__proto__;
|
939
|
+
}
|
940
|
+
return setPrototypeOf;
|
941
|
+
})(Object, '__proto__')
|
942
|
+
});
|
943
|
+
}
|
944
|
+
|
945
|
+
// Workaround bug in Opera 12 where setPrototypeOf(x, null) doesn't work,
|
946
|
+
// but Object.create(null) does.
|
947
|
+
if (Object.setPrototypeOf && Object.getPrototypeOf &&
|
948
|
+
Object.getPrototypeOf(Object.setPrototypeOf({}, null)) !== null &&
|
949
|
+
Object.getPrototypeOf(Object.create(null)) === null) {
|
950
|
+
(function () {
|
951
|
+
var FAKENULL = Object.create(null);
|
952
|
+
var gpo = Object.getPrototypeOf, spo = Object.setPrototypeOf;
|
953
|
+
Object.getPrototypeOf = function (o) {
|
954
|
+
var result = gpo(o);
|
955
|
+
return result === FAKENULL ? null : result;
|
956
|
+
};
|
957
|
+
Object.setPrototypeOf = function (o, p) {
|
958
|
+
if (p === null) { p = FAKENULL; }
|
959
|
+
return spo(o, p);
|
960
|
+
};
|
961
|
+
Object.setPrototypeOf.polyfill = false;
|
962
|
+
})();
|
963
|
+
}
|
964
|
+
|
965
|
+
try {
|
966
|
+
Object.keys('foo');
|
967
|
+
} catch (e) {
|
968
|
+
var originalObjectKeys = Object.keys;
|
969
|
+
Object.keys = function (obj) {
|
970
|
+
return originalObjectKeys(ES.ToObject(obj));
|
971
|
+
};
|
972
|
+
}
|
973
|
+
|
974
|
+
var MathShims = {
|
975
|
+
acosh: function (value) {
|
976
|
+
value = Number(value);
|
977
|
+
if (Number.isNaN(value) || value < 1) return NaN;
|
978
|
+
if (value === 1) return 0;
|
979
|
+
if (value === Infinity) return value;
|
980
|
+
return Math.log(value + Math.sqrt(value * value - 1));
|
981
|
+
},
|
982
|
+
|
983
|
+
asinh: function (value) {
|
984
|
+
value = Number(value);
|
985
|
+
if (value === 0 || !global_isFinite(value)) {
|
986
|
+
return value;
|
987
|
+
}
|
988
|
+
return value < 0 ? -Math.asinh(-value) : Math.log(value + Math.sqrt(value * value + 1));
|
989
|
+
},
|
990
|
+
|
991
|
+
atanh: function (value) {
|
992
|
+
value = Number(value);
|
993
|
+
if (Number.isNaN(value) || value < -1 || value > 1) {
|
994
|
+
return NaN;
|
995
|
+
}
|
996
|
+
if (value === -1) return -Infinity;
|
997
|
+
if (value === 1) return Infinity;
|
998
|
+
if (value === 0) return value;
|
999
|
+
return 0.5 * Math.log((1 + value) / (1 - value));
|
1000
|
+
},
|
1001
|
+
|
1002
|
+
cbrt: function (value) {
|
1003
|
+
value = Number(value);
|
1004
|
+
if (value === 0) return value;
|
1005
|
+
var negate = value < 0, result;
|
1006
|
+
if (negate) value = -value;
|
1007
|
+
result = Math.pow(value, 1 / 3);
|
1008
|
+
return negate ? -result : result;
|
1009
|
+
},
|
1010
|
+
|
1011
|
+
clz32: function (value) {
|
1012
|
+
// See https://bugs.ecmascript.org/show_bug.cgi?id=2465
|
1013
|
+
value = Number(value);
|
1014
|
+
var number = ES.ToUint32(value);
|
1015
|
+
if (number === 0) {
|
1016
|
+
return 32;
|
1017
|
+
}
|
1018
|
+
return 32 - (number).toString(2).length;
|
1019
|
+
},
|
1020
|
+
|
1021
|
+
cosh: function (value) {
|
1022
|
+
value = Number(value);
|
1023
|
+
if (value === 0) return 1; // +0 or -0
|
1024
|
+
if (Number.isNaN(value)) return NaN;
|
1025
|
+
if (!global_isFinite(value)) return Infinity;
|
1026
|
+
if (value < 0) value = -value;
|
1027
|
+
if (value > 21) return Math.exp(value) / 2;
|
1028
|
+
return (Math.exp(value) + Math.exp(-value)) / 2;
|
1029
|
+
},
|
1030
|
+
|
1031
|
+
expm1: function (value) {
|
1032
|
+
value = Number(value);
|
1033
|
+
if (value === -Infinity) return -1;
|
1034
|
+
if (!global_isFinite(value) || value === 0) return value;
|
1035
|
+
return Math.exp(value) - 1;
|
1036
|
+
},
|
1037
|
+
|
1038
|
+
hypot: function (x, y) {
|
1039
|
+
var anyNaN = false;
|
1040
|
+
var allZero = true;
|
1041
|
+
var anyInfinity = false;
|
1042
|
+
var numbers = [];
|
1043
|
+
Array.prototype.every.call(arguments, function (arg) {
|
1044
|
+
var num = Number(arg);
|
1045
|
+
if (Number.isNaN(num)) {
|
1046
|
+
anyNaN = true;
|
1047
|
+
} else if (num === Infinity || num === -Infinity) {
|
1048
|
+
anyInfinity = true;
|
1049
|
+
} else if (num !== 0) {
|
1050
|
+
allZero = false;
|
1051
|
+
}
|
1052
|
+
if (anyInfinity) {
|
1053
|
+
return false;
|
1054
|
+
} else if (!anyNaN) {
|
1055
|
+
numbers.push(Math.abs(num));
|
1056
|
+
}
|
1057
|
+
return true;
|
1058
|
+
});
|
1059
|
+
if (anyInfinity) return Infinity;
|
1060
|
+
if (anyNaN) return NaN;
|
1061
|
+
if (allZero) return 0;
|
1062
|
+
|
1063
|
+
numbers.sort(function (a, b) { return b - a; });
|
1064
|
+
var largest = numbers[0];
|
1065
|
+
var divided = numbers.map(function (number) { return number / largest; });
|
1066
|
+
var sum = divided.reduce(function (sum, number) { return sum += number * number; }, 0);
|
1067
|
+
return largest * Math.sqrt(sum);
|
1068
|
+
},
|
1069
|
+
|
1070
|
+
log2: function (value) {
|
1071
|
+
return Math.log(value) * Math.LOG2E;
|
1072
|
+
},
|
1073
|
+
|
1074
|
+
log10: function (value) {
|
1075
|
+
return Math.log(value) * Math.LOG10E;
|
1076
|
+
},
|
1077
|
+
|
1078
|
+
log1p: function (value) {
|
1079
|
+
value = Number(value);
|
1080
|
+
if (value < -1 || Number.isNaN(value)) return NaN;
|
1081
|
+
if (value === 0 || value === Infinity) return value;
|
1082
|
+
if (value === -1) return -Infinity;
|
1083
|
+
var result = 0;
|
1084
|
+
var n = 50;
|
1085
|
+
|
1086
|
+
if (value < 0 || value > 1) return Math.log(1 + value);
|
1087
|
+
for (var i = 1; i < n; i++) {
|
1088
|
+
if ((i % 2) === 0) {
|
1089
|
+
result -= Math.pow(value, i) / i;
|
1090
|
+
} else {
|
1091
|
+
result += Math.pow(value, i) / i;
|
1092
|
+
}
|
1093
|
+
}
|
1094
|
+
|
1095
|
+
return result;
|
1096
|
+
},
|
1097
|
+
|
1098
|
+
sign: function (value) {
|
1099
|
+
var number = +value;
|
1100
|
+
if (number === 0) return number;
|
1101
|
+
if (Number.isNaN(number)) return number;
|
1102
|
+
return number < 0 ? -1 : 1;
|
1103
|
+
},
|
1104
|
+
|
1105
|
+
sinh: function (value) {
|
1106
|
+
value = Number(value);
|
1107
|
+
if (!global_isFinite(value) || value === 0) return value;
|
1108
|
+
return (Math.exp(value) - Math.exp(-value)) / 2;
|
1109
|
+
},
|
1110
|
+
|
1111
|
+
tanh: function (value) {
|
1112
|
+
value = Number(value);
|
1113
|
+
if (Number.isNaN(value) || value === 0) return value;
|
1114
|
+
if (value === Infinity) return 1;
|
1115
|
+
if (value === -Infinity) return -1;
|
1116
|
+
return (Math.exp(value) - Math.exp(-value)) / (Math.exp(value) + Math.exp(-value));
|
1117
|
+
},
|
1118
|
+
|
1119
|
+
trunc: function (value) {
|
1120
|
+
var number = Number(value);
|
1121
|
+
return number < 0 ? -Math.floor(-number) : Math.floor(number);
|
1122
|
+
},
|
1123
|
+
|
1124
|
+
imul: function (x, y) {
|
1125
|
+
// taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
|
1126
|
+
x = ES.ToUint32(x);
|
1127
|
+
y = ES.ToUint32(y);
|
1128
|
+
var ah = (x >>> 16) & 0xffff;
|
1129
|
+
var al = x & 0xffff;
|
1130
|
+
var bh = (y >>> 16) & 0xffff;
|
1131
|
+
var bl = y & 0xffff;
|
1132
|
+
// the shift by 0 fixes the sign on the high part
|
1133
|
+
// the final |0 converts the unsigned value into a signed value
|
1134
|
+
return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0);
|
1135
|
+
},
|
1136
|
+
|
1137
|
+
fround: function (x) {
|
1138
|
+
if (x === 0 || x === Infinity || x === -Infinity || Number.isNaN(x)) {
|
1139
|
+
return x;
|
1140
|
+
}
|
1141
|
+
var num = Number(x);
|
1142
|
+
return numberConversion.toFloat32(num);
|
1143
|
+
}
|
1144
|
+
};
|
1145
|
+
defineProperties(Math, MathShims);
|
1146
|
+
|
1147
|
+
if (Math.imul(0xffffffff, 5) !== -5) {
|
1148
|
+
// Safari 6.1, at least, reports "0" for this value
|
1149
|
+
Math.imul = MathShims.imul;
|
1150
|
+
}
|
1151
|
+
|
1152
|
+
// Promises
|
1153
|
+
// Simplest possible implementation; use a 3rd-party library if you
|
1154
|
+
// want the best possible speed and/or long stack traces.
|
1155
|
+
var PromiseShim = (function () {
|
1156
|
+
|
1157
|
+
var Promise, Promise$prototype;
|
1158
|
+
|
1159
|
+
ES.IsPromise = function (promise) {
|
1160
|
+
if (!ES.TypeIsObject(promise)) {
|
1161
|
+
return false;
|
1162
|
+
}
|
1163
|
+
if (!promise._promiseConstructor) {
|
1164
|
+
// _promiseConstructor is a bit more unique than _status, so we'll
|
1165
|
+
// check that instead of the [[PromiseStatus]] internal field.
|
1166
|
+
return false;
|
1167
|
+
}
|
1168
|
+
if (promise._status === undefined) {
|
1169
|
+
return false; // uninitialized
|
1170
|
+
}
|
1171
|
+
return true;
|
1172
|
+
};
|
1173
|
+
|
1174
|
+
// "PromiseCapability" in the spec is what most promise implementations
|
1175
|
+
// call a "deferred".
|
1176
|
+
var PromiseCapability = function (C) {
|
1177
|
+
if (!ES.IsCallable(C)) {
|
1178
|
+
throw new TypeError('bad promise constructor');
|
1179
|
+
}
|
1180
|
+
var capability = this;
|
1181
|
+
var resolver = function (resolve, reject) {
|
1182
|
+
capability.resolve = resolve;
|
1183
|
+
capability.reject = reject;
|
1184
|
+
};
|
1185
|
+
capability.promise = ES.Construct(C, [resolver]);
|
1186
|
+
// see https://bugs.ecmascript.org/show_bug.cgi?id=2478
|
1187
|
+
if (!capability.promise._es6construct) {
|
1188
|
+
throw new TypeError('bad promise constructor');
|
1189
|
+
}
|
1190
|
+
if (!(ES.IsCallable(capability.resolve) &&
|
1191
|
+
ES.IsCallable(capability.reject))) {
|
1192
|
+
throw new TypeError('bad promise constructor');
|
1193
|
+
}
|
1194
|
+
};
|
1195
|
+
|
1196
|
+
// find an appropriate setImmediate-alike
|
1197
|
+
var setTimeout = globals.setTimeout;
|
1198
|
+
var makeZeroTimeout;
|
1199
|
+
if (typeof window !== 'undefined' && ES.IsCallable(window.postMessage)) {
|
1200
|
+
makeZeroTimeout = function () {
|
1201
|
+
// from http://dbaron.org/log/20100309-faster-timeouts
|
1202
|
+
var timeouts = [];
|
1203
|
+
var messageName = "zero-timeout-message";
|
1204
|
+
var setZeroTimeout = function (fn) {
|
1205
|
+
timeouts.push(fn);
|
1206
|
+
window.postMessage(messageName, "*");
|
1207
|
+
};
|
1208
|
+
var handleMessage = function (event) {
|
1209
|
+
if (event.source == window && event.data == messageName) {
|
1210
|
+
event.stopPropagation();
|
1211
|
+
if (timeouts.length === 0) { return; }
|
1212
|
+
var fn = timeouts.shift();
|
1213
|
+
fn();
|
1214
|
+
}
|
1215
|
+
};
|
1216
|
+
window.addEventListener("message", handleMessage, true);
|
1217
|
+
return setZeroTimeout;
|
1218
|
+
};
|
1219
|
+
}
|
1220
|
+
var makePromiseAsap = function () {
|
1221
|
+
// An efficient task-scheduler based on a pre-existing Promise
|
1222
|
+
// implementation, which we can use even if we override the
|
1223
|
+
// global Promise below (in order to workaround bugs)
|
1224
|
+
// https://github.com/Raynos/observ-hash/issues/2#issuecomment-35857671
|
1225
|
+
var P = globals.Promise;
|
1226
|
+
return P && P.resolve && function (task) {
|
1227
|
+
return P.resolve().then(task);
|
1228
|
+
};
|
1229
|
+
};
|
1230
|
+
var enqueue = ES.IsCallable(globals.setImmediate) ?
|
1231
|
+
globals.setImmediate.bind(globals) :
|
1232
|
+
typeof process === 'object' && process.nextTick ? process.nextTick :
|
1233
|
+
makePromiseAsap() ||
|
1234
|
+
(ES.IsCallable(makeZeroTimeout) ? makeZeroTimeout() :
|
1235
|
+
function (task) { setTimeout(task, 0); }); // fallback
|
1236
|
+
|
1237
|
+
var triggerPromiseReactions = function (reactions, x) {
|
1238
|
+
reactions.forEach(function (reaction) {
|
1239
|
+
enqueue(function () {
|
1240
|
+
// PromiseReactionTask
|
1241
|
+
var handler = reaction.handler;
|
1242
|
+
var capability = reaction.capability;
|
1243
|
+
var resolve = capability.resolve;
|
1244
|
+
var reject = capability.reject;
|
1245
|
+
try {
|
1246
|
+
var result = handler(x);
|
1247
|
+
if (result === capability.promise) {
|
1248
|
+
throw new TypeError('self resolution');
|
1249
|
+
}
|
1250
|
+
var updateResult =
|
1251
|
+
updatePromiseFromPotentialThenable(result, capability);
|
1252
|
+
if (!updateResult) {
|
1253
|
+
resolve(result);
|
1254
|
+
}
|
1255
|
+
} catch (e) {
|
1256
|
+
reject(e);
|
1257
|
+
}
|
1258
|
+
});
|
1259
|
+
});
|
1260
|
+
};
|
1261
|
+
|
1262
|
+
var updatePromiseFromPotentialThenable = function (x, capability) {
|
1263
|
+
if (!ES.TypeIsObject(x)) {
|
1264
|
+
return false;
|
1265
|
+
}
|
1266
|
+
var resolve = capability.resolve;
|
1267
|
+
var reject = capability.reject;
|
1268
|
+
try {
|
1269
|
+
var then = x.then; // only one invocation of accessor
|
1270
|
+
if (!ES.IsCallable(then)) { return false; }
|
1271
|
+
then.call(x, resolve, reject);
|
1272
|
+
} catch (e) {
|
1273
|
+
reject(e);
|
1274
|
+
}
|
1275
|
+
return true;
|
1276
|
+
};
|
1277
|
+
|
1278
|
+
var promiseResolutionHandler = function (promise, onFulfilled, onRejected) {
|
1279
|
+
return function (x) {
|
1280
|
+
if (x === promise) {
|
1281
|
+
return onRejected(new TypeError('self resolution'));
|
1282
|
+
}
|
1283
|
+
var C = promise._promiseConstructor;
|
1284
|
+
var capability = new PromiseCapability(C);
|
1285
|
+
var updateResult = updatePromiseFromPotentialThenable(x, capability);
|
1286
|
+
if (updateResult) {
|
1287
|
+
return capability.promise.then(onFulfilled, onRejected);
|
1288
|
+
} else {
|
1289
|
+
return onFulfilled(x);
|
1290
|
+
}
|
1291
|
+
};
|
1292
|
+
};
|
1293
|
+
|
1294
|
+
Promise = function (resolver) {
|
1295
|
+
var promise = this;
|
1296
|
+
promise = emulateES6construct(promise);
|
1297
|
+
if (!promise._promiseConstructor) {
|
1298
|
+
// we use _promiseConstructor as a stand-in for the internal
|
1299
|
+
// [[PromiseStatus]] field; it's a little more unique.
|
1300
|
+
throw new TypeError('bad promise');
|
1301
|
+
}
|
1302
|
+
if (promise._status !== undefined) {
|
1303
|
+
throw new TypeError('promise already initialized');
|
1304
|
+
}
|
1305
|
+
// see https://bugs.ecmascript.org/show_bug.cgi?id=2482
|
1306
|
+
if (!ES.IsCallable(resolver)) {
|
1307
|
+
throw new TypeError('not a valid resolver');
|
1308
|
+
}
|
1309
|
+
promise._status = 'unresolved';
|
1310
|
+
promise._resolveReactions = [];
|
1311
|
+
promise._rejectReactions = [];
|
1312
|
+
|
1313
|
+
var resolve = function (resolution) {
|
1314
|
+
if (promise._status !== 'unresolved') { return; }
|
1315
|
+
var reactions = promise._resolveReactions;
|
1316
|
+
promise._result = resolution;
|
1317
|
+
promise._resolveReactions = undefined;
|
1318
|
+
promise._rejectReactions = undefined;
|
1319
|
+
promise._status = 'has-resolution';
|
1320
|
+
triggerPromiseReactions(reactions, resolution);
|
1321
|
+
};
|
1322
|
+
var reject = function (reason) {
|
1323
|
+
if (promise._status !== 'unresolved') { return; }
|
1324
|
+
var reactions = promise._rejectReactions;
|
1325
|
+
promise._result = reason;
|
1326
|
+
promise._resolveReactions = undefined;
|
1327
|
+
promise._rejectReactions = undefined;
|
1328
|
+
promise._status = 'has-rejection';
|
1329
|
+
triggerPromiseReactions(reactions, reason);
|
1330
|
+
};
|
1331
|
+
try {
|
1332
|
+
resolver(resolve, reject);
|
1333
|
+
} catch (e) {
|
1334
|
+
reject(e);
|
1335
|
+
}
|
1336
|
+
return promise;
|
1337
|
+
};
|
1338
|
+
Promise$prototype = Promise.prototype;
|
1339
|
+
defineProperties(Promise, {
|
1340
|
+
'@@create': function (obj) {
|
1341
|
+
var constructor = this;
|
1342
|
+
// AllocatePromise
|
1343
|
+
// The `obj` parameter is a hack we use for es5
|
1344
|
+
// compatibility.
|
1345
|
+
var prototype = constructor.prototype || Promise$prototype;
|
1346
|
+
obj = obj || create(prototype);
|
1347
|
+
defineProperties(obj, {
|
1348
|
+
_status: undefined,
|
1349
|
+
_result: undefined,
|
1350
|
+
_resolveReactions: undefined,
|
1351
|
+
_rejectReactions: undefined,
|
1352
|
+
_promiseConstructor: undefined
|
1353
|
+
});
|
1354
|
+
obj._promiseConstructor = constructor;
|
1355
|
+
return obj;
|
1356
|
+
}
|
1357
|
+
});
|
1358
|
+
|
1359
|
+
var _promiseAllResolver = function (index, values, capability, remaining) {
|
1360
|
+
var done = false;
|
1361
|
+
return function (x) {
|
1362
|
+
if (done) { return; } // protect against being called multiple times
|
1363
|
+
done = true;
|
1364
|
+
values[index] = x;
|
1365
|
+
if ((--remaining.count) === 0) {
|
1366
|
+
var resolve = capability.resolve;
|
1367
|
+
resolve(values); // call w/ this===undefined
|
1368
|
+
}
|
1369
|
+
};
|
1370
|
+
};
|
1371
|
+
|
1372
|
+
Promise.all = function (iterable) {
|
1373
|
+
var C = this;
|
1374
|
+
var capability = new PromiseCapability(C);
|
1375
|
+
var resolve = capability.resolve;
|
1376
|
+
var reject = capability.reject;
|
1377
|
+
try {
|
1378
|
+
if (!ES.IsIterable(iterable)) {
|
1379
|
+
throw new TypeError('bad iterable');
|
1380
|
+
}
|
1381
|
+
var it = ES.GetIterator(iterable);
|
1382
|
+
var values = [], remaining = { count: 1 };
|
1383
|
+
for (var index = 0; ; index++) {
|
1384
|
+
var next = ES.IteratorNext(it);
|
1385
|
+
if (next.done) {
|
1386
|
+
break;
|
1387
|
+
}
|
1388
|
+
var nextPromise = C.resolve(next.value);
|
1389
|
+
var resolveElement = _promiseAllResolver(
|
1390
|
+
index, values, capability, remaining
|
1391
|
+
);
|
1392
|
+
remaining.count++;
|
1393
|
+
nextPromise.then(resolveElement, capability.reject);
|
1394
|
+
}
|
1395
|
+
if ((--remaining.count) === 0) {
|
1396
|
+
resolve(values); // call w/ this===undefined
|
1397
|
+
}
|
1398
|
+
} catch (e) {
|
1399
|
+
reject(e);
|
1400
|
+
}
|
1401
|
+
return capability.promise;
|
1402
|
+
};
|
1403
|
+
|
1404
|
+
Promise.race = function (iterable) {
|
1405
|
+
var C = this;
|
1406
|
+
var capability = new PromiseCapability(C);
|
1407
|
+
var resolve = capability.resolve;
|
1408
|
+
var reject = capability.reject;
|
1409
|
+
try {
|
1410
|
+
if (!ES.IsIterable(iterable)) {
|
1411
|
+
throw new TypeError('bad iterable');
|
1412
|
+
}
|
1413
|
+
var it = ES.GetIterator(iterable);
|
1414
|
+
while (true) {
|
1415
|
+
var next = ES.IteratorNext(it);
|
1416
|
+
if (next.done) {
|
1417
|
+
// If iterable has no items, resulting promise will never
|
1418
|
+
// resolve; see:
|
1419
|
+
// https://github.com/domenic/promises-unwrapping/issues/75
|
1420
|
+
// https://bugs.ecmascript.org/show_bug.cgi?id=2515
|
1421
|
+
break;
|
1422
|
+
}
|
1423
|
+
var nextPromise = C.resolve(next.value);
|
1424
|
+
nextPromise.then(resolve, reject);
|
1425
|
+
}
|
1426
|
+
} catch (e) {
|
1427
|
+
reject(e);
|
1428
|
+
}
|
1429
|
+
return capability.promise;
|
1430
|
+
};
|
1431
|
+
|
1432
|
+
Promise.reject = function (reason) {
|
1433
|
+
var C = this;
|
1434
|
+
var capability = new PromiseCapability(C);
|
1435
|
+
var reject = capability.reject;
|
1436
|
+
reject(reason); // call with this===undefined
|
1437
|
+
return capability.promise;
|
1438
|
+
};
|
1439
|
+
|
1440
|
+
Promise.resolve = function (v) {
|
1441
|
+
var C = this;
|
1442
|
+
if (ES.IsPromise(v)) {
|
1443
|
+
var constructor = v._promiseConstructor;
|
1444
|
+
if (constructor === C) { return v; }
|
1445
|
+
}
|
1446
|
+
var capability = new PromiseCapability(C);
|
1447
|
+
var resolve = capability.resolve;
|
1448
|
+
resolve(v); // call with this===undefined
|
1449
|
+
return capability.promise;
|
1450
|
+
};
|
1451
|
+
|
1452
|
+
Promise.prototype['catch'] = function (onRejected) {
|
1453
|
+
return this.then(undefined, onRejected);
|
1454
|
+
};
|
1455
|
+
|
1456
|
+
Promise.prototype.then = function (onFulfilled, onRejected) {
|
1457
|
+
var promise = this;
|
1458
|
+
if (!ES.IsPromise(promise)) { throw new TypeError('not a promise'); }
|
1459
|
+
// this.constructor not this._promiseConstructor; see
|
1460
|
+
// https://bugs.ecmascript.org/show_bug.cgi?id=2513
|
1461
|
+
var C = this.constructor;
|
1462
|
+
var capability = new PromiseCapability(C);
|
1463
|
+
if (!ES.IsCallable(onRejected)) {
|
1464
|
+
onRejected = function (e) { throw e; };
|
1465
|
+
}
|
1466
|
+
if (!ES.IsCallable(onFulfilled)) {
|
1467
|
+
onFulfilled = function (x) { return x; };
|
1468
|
+
}
|
1469
|
+
var resolutionHandler =
|
1470
|
+
promiseResolutionHandler(promise, onFulfilled, onRejected);
|
1471
|
+
var resolveReaction =
|
1472
|
+
{ capability: capability, handler: resolutionHandler };
|
1473
|
+
var rejectReaction =
|
1474
|
+
{ capability: capability, handler: onRejected };
|
1475
|
+
switch (promise._status) {
|
1476
|
+
case 'unresolved':
|
1477
|
+
promise._resolveReactions.push(resolveReaction);
|
1478
|
+
promise._rejectReactions.push(rejectReaction);
|
1479
|
+
break;
|
1480
|
+
case 'has-resolution':
|
1481
|
+
triggerPromiseReactions([resolveReaction], promise._result);
|
1482
|
+
break;
|
1483
|
+
case 'has-rejection':
|
1484
|
+
triggerPromiseReactions([rejectReaction], promise._result);
|
1485
|
+
break;
|
1486
|
+
default:
|
1487
|
+
throw new TypeError('unexpected');
|
1488
|
+
}
|
1489
|
+
return capability.promise;
|
1490
|
+
};
|
1491
|
+
|
1492
|
+
return Promise;
|
1493
|
+
})();
|
1494
|
+
// export the Promise constructor.
|
1495
|
+
defineProperties(globals, { Promise: PromiseShim });
|
1496
|
+
// In Chrome 33 (and thereabouts) Promise is defined, but the
|
1497
|
+
// implementation is buggy in a number of ways. Let's check subclassing
|
1498
|
+
// support to see if we have a buggy implementation.
|
1499
|
+
var promiseSupportsSubclassing = supportsSubclassing(globals.Promise, function (S) {
|
1500
|
+
return S.resolve(42) instanceof S;
|
1501
|
+
});
|
1502
|
+
var promiseIgnoresNonFunctionThenCallbacks = (function () {
|
1503
|
+
try {
|
1504
|
+
globals.Promise.reject(42).then(null, 5).then(null, function () {});
|
1505
|
+
return true;
|
1506
|
+
} catch (ex) {
|
1507
|
+
return false;
|
1508
|
+
}
|
1509
|
+
}());
|
1510
|
+
var promiseRequiresObjectContext = (function () {
|
1511
|
+
try { Promise.call(3, function () {}); } catch (e) { return true; }
|
1512
|
+
return false;
|
1513
|
+
}());
|
1514
|
+
if (!promiseSupportsSubclassing || !promiseIgnoresNonFunctionThenCallbacks || !promiseRequiresObjectContext) {
|
1515
|
+
globals.Promise = PromiseShim;
|
1516
|
+
}
|
1517
|
+
|
1518
|
+
// Map and Set require a true ES5 environment
|
1519
|
+
// Their fast path also requires that the environment preserve
|
1520
|
+
// property insertion order, which is not guaranteed by the spec.
|
1521
|
+
var testOrder = function(a) {
|
1522
|
+
var b = Object.keys(a.reduce(function (o, k) {
|
1523
|
+
o[k] = true;
|
1524
|
+
return o;
|
1525
|
+
}, {}));
|
1526
|
+
return a.join(':') === b.join(':');
|
1527
|
+
};
|
1528
|
+
var preservesInsertionOrder = testOrder(['z', 'a', 'bb']);
|
1529
|
+
// some engines (eg, Chrome) only preserve insertion order for string keys
|
1530
|
+
var preservesNumericInsertionOrder = testOrder(['z', 1, 'a', '3', 2]);
|
1531
|
+
|
1532
|
+
if (supportsDescriptors) {
|
1533
|
+
|
1534
|
+
var fastkey = function fastkey(key) {
|
1535
|
+
if (!preservesInsertionOrder) {
|
1536
|
+
return null;
|
1537
|
+
}
|
1538
|
+
var type = typeof key;
|
1539
|
+
if (type === 'string') {
|
1540
|
+
return '$' + key;
|
1541
|
+
} else if (type === 'number') {
|
1542
|
+
// note that -0 will get coerced to "0" when used as a property key
|
1543
|
+
if (!preservesNumericInsertionOrder) {
|
1544
|
+
return 'n' + key;
|
1545
|
+
}
|
1546
|
+
return key;
|
1547
|
+
}
|
1548
|
+
return null;
|
1549
|
+
};
|
1550
|
+
|
1551
|
+
var emptyObject = function emptyObject() {
|
1552
|
+
// accomodate some older not-quite-ES5 browsers
|
1553
|
+
return Object.create ? Object.create(null) : {};
|
1554
|
+
};
|
1555
|
+
|
1556
|
+
var collectionShims = {
|
1557
|
+
Map: (function () {
|
1558
|
+
|
1559
|
+
var empty = {};
|
1560
|
+
|
1561
|
+
function MapEntry(key, value) {
|
1562
|
+
this.key = key;
|
1563
|
+
this.value = value;
|
1564
|
+
this.next = null;
|
1565
|
+
this.prev = null;
|
1566
|
+
}
|
1567
|
+
|
1568
|
+
MapEntry.prototype.isRemoved = function () {
|
1569
|
+
return this.key === empty;
|
1570
|
+
};
|
1571
|
+
|
1572
|
+
function MapIterator(map, kind) {
|
1573
|
+
this.head = map._head;
|
1574
|
+
this.i = this.head;
|
1575
|
+
this.kind = kind;
|
1576
|
+
}
|
1577
|
+
|
1578
|
+
MapIterator.prototype = {
|
1579
|
+
next: function () {
|
1580
|
+
var i = this.i, kind = this.kind, head = this.head, result;
|
1581
|
+
if (this.i === undefined) {
|
1582
|
+
return { value: undefined, done: true };
|
1583
|
+
}
|
1584
|
+
while (i.isRemoved() && i !== head) {
|
1585
|
+
// back up off of removed entries
|
1586
|
+
i = i.prev;
|
1587
|
+
}
|
1588
|
+
// advance to next unreturned element.
|
1589
|
+
while (i.next !== head) {
|
1590
|
+
i = i.next;
|
1591
|
+
if (!i.isRemoved()) {
|
1592
|
+
if (kind === "key") {
|
1593
|
+
result = i.key;
|
1594
|
+
} else if (kind === "value") {
|
1595
|
+
result = i.value;
|
1596
|
+
} else {
|
1597
|
+
result = [i.key, i.value];
|
1598
|
+
}
|
1599
|
+
this.i = i;
|
1600
|
+
return { value: result, done: false };
|
1601
|
+
}
|
1602
|
+
}
|
1603
|
+
// once the iterator is done, it is done forever.
|
1604
|
+
this.i = undefined;
|
1605
|
+
return { value: undefined, done: true };
|
1606
|
+
}
|
1607
|
+
};
|
1608
|
+
addIterator(MapIterator.prototype);
|
1609
|
+
|
1610
|
+
function Map(iterable) {
|
1611
|
+
var map = this;
|
1612
|
+
map = emulateES6construct(map);
|
1613
|
+
if (!map._es6map) {
|
1614
|
+
throw new TypeError('bad map');
|
1615
|
+
}
|
1616
|
+
|
1617
|
+
var head = new MapEntry(null, null);
|
1618
|
+
// circular doubly-linked list.
|
1619
|
+
head.next = head.prev = head;
|
1620
|
+
|
1621
|
+
defineProperties(map, {
|
1622
|
+
_head: head,
|
1623
|
+
_storage: emptyObject(),
|
1624
|
+
_size: 0
|
1625
|
+
});
|
1626
|
+
|
1627
|
+
// Optionally initialize map from iterable
|
1628
|
+
if (iterable !== undefined && iterable !== null) {
|
1629
|
+
var it = ES.GetIterator(iterable);
|
1630
|
+
var adder = map.set;
|
1631
|
+
if (!ES.IsCallable(adder)) { throw new TypeError('bad map'); }
|
1632
|
+
while (true) {
|
1633
|
+
var next = ES.IteratorNext(it);
|
1634
|
+
if (next.done) { break; }
|
1635
|
+
var nextItem = next.value;
|
1636
|
+
if (!ES.TypeIsObject(nextItem)) {
|
1637
|
+
throw new TypeError('expected iterable of pairs');
|
1638
|
+
}
|
1639
|
+
adder.call(map, nextItem[0], nextItem[1]);
|
1640
|
+
}
|
1641
|
+
}
|
1642
|
+
return map;
|
1643
|
+
}
|
1644
|
+
var Map$prototype = Map.prototype;
|
1645
|
+
defineProperties(Map, {
|
1646
|
+
'@@create': function (obj) {
|
1647
|
+
var constructor = this;
|
1648
|
+
var prototype = constructor.prototype || Map$prototype;
|
1649
|
+
obj = obj || create(prototype);
|
1650
|
+
defineProperties(obj, { _es6map: true });
|
1651
|
+
return obj;
|
1652
|
+
}
|
1653
|
+
});
|
1654
|
+
|
1655
|
+
Object.defineProperty(Map.prototype, 'size', {
|
1656
|
+
configurable: true,
|
1657
|
+
enumerable: false,
|
1658
|
+
get: function () {
|
1659
|
+
if (typeof this._size === 'undefined') {
|
1660
|
+
throw new TypeError('size method called on incompatible Map');
|
1661
|
+
}
|
1662
|
+
return this._size;
|
1663
|
+
}
|
1664
|
+
});
|
1665
|
+
|
1666
|
+
defineProperties(Map.prototype, {
|
1667
|
+
get: function (key) {
|
1668
|
+
var fkey = fastkey(key);
|
1669
|
+
if (fkey !== null) {
|
1670
|
+
// fast O(1) path
|
1671
|
+
var entry = this._storage[fkey];
|
1672
|
+
return entry ? entry.value : undefined;
|
1673
|
+
}
|
1674
|
+
var head = this._head, i = head;
|
1675
|
+
while ((i = i.next) !== head) {
|
1676
|
+
if (ES.SameValueZero(i.key, key)) {
|
1677
|
+
return i.value;
|
1678
|
+
}
|
1679
|
+
}
|
1680
|
+
return undefined;
|
1681
|
+
},
|
1682
|
+
|
1683
|
+
has: function (key) {
|
1684
|
+
var fkey = fastkey(key);
|
1685
|
+
if (fkey !== null) {
|
1686
|
+
// fast O(1) path
|
1687
|
+
return typeof this._storage[fkey] !== 'undefined';
|
1688
|
+
}
|
1689
|
+
var head = this._head, i = head;
|
1690
|
+
while ((i = i.next) !== head) {
|
1691
|
+
if (ES.SameValueZero(i.key, key)) {
|
1692
|
+
return true;
|
1693
|
+
}
|
1694
|
+
}
|
1695
|
+
return false;
|
1696
|
+
},
|
1697
|
+
|
1698
|
+
set: function (key, value) {
|
1699
|
+
var head = this._head, i = head, entry;
|
1700
|
+
var fkey = fastkey(key);
|
1701
|
+
if (fkey !== null) {
|
1702
|
+
// fast O(1) path
|
1703
|
+
if (typeof this._storage[fkey] !== 'undefined') {
|
1704
|
+
this._storage[fkey].value = value;
|
1705
|
+
return;
|
1706
|
+
} else {
|
1707
|
+
entry = this._storage[fkey] = new MapEntry(key, value);
|
1708
|
+
i = head.prev;
|
1709
|
+
// fall through
|
1710
|
+
}
|
1711
|
+
}
|
1712
|
+
while ((i = i.next) !== head) {
|
1713
|
+
if (ES.SameValueZero(i.key, key)) {
|
1714
|
+
i.value = value;
|
1715
|
+
return;
|
1716
|
+
}
|
1717
|
+
}
|
1718
|
+
entry = entry || new MapEntry(key, value);
|
1719
|
+
if (ES.SameValue(-0, key)) {
|
1720
|
+
entry.key = +0; // coerce -0 to +0 in entry
|
1721
|
+
}
|
1722
|
+
entry.next = this._head;
|
1723
|
+
entry.prev = this._head.prev;
|
1724
|
+
entry.prev.next = entry;
|
1725
|
+
entry.next.prev = entry;
|
1726
|
+
this._size += 1;
|
1727
|
+
return this;
|
1728
|
+
},
|
1729
|
+
|
1730
|
+
'delete': function (key) {
|
1731
|
+
var head = this._head, i = head;
|
1732
|
+
var fkey = fastkey(key);
|
1733
|
+
if (fkey !== null) {
|
1734
|
+
// fast O(1) path
|
1735
|
+
if (typeof this._storage[fkey] === 'undefined') {
|
1736
|
+
return false;
|
1737
|
+
}
|
1738
|
+
i = this._storage[fkey].prev;
|
1739
|
+
delete this._storage[fkey];
|
1740
|
+
// fall through
|
1741
|
+
}
|
1742
|
+
while ((i = i.next) !== head) {
|
1743
|
+
if (ES.SameValueZero(i.key, key)) {
|
1744
|
+
i.key = i.value = empty;
|
1745
|
+
i.prev.next = i.next;
|
1746
|
+
i.next.prev = i.prev;
|
1747
|
+
this._size -= 1;
|
1748
|
+
return true;
|
1749
|
+
}
|
1750
|
+
}
|
1751
|
+
return false;
|
1752
|
+
},
|
1753
|
+
|
1754
|
+
clear: function () {
|
1755
|
+
this._size = 0;
|
1756
|
+
this._storage = emptyObject();
|
1757
|
+
var head = this._head, i = head, p = i.next;
|
1758
|
+
while ((i = p) !== head) {
|
1759
|
+
i.key = i.value = empty;
|
1760
|
+
p = i.next;
|
1761
|
+
i.next = i.prev = head;
|
1762
|
+
}
|
1763
|
+
head.next = head.prev = head;
|
1764
|
+
},
|
1765
|
+
|
1766
|
+
keys: function () {
|
1767
|
+
return new MapIterator(this, "key");
|
1768
|
+
},
|
1769
|
+
|
1770
|
+
values: function () {
|
1771
|
+
return new MapIterator(this, "value");
|
1772
|
+
},
|
1773
|
+
|
1774
|
+
entries: function () {
|
1775
|
+
return new MapIterator(this, "key+value");
|
1776
|
+
},
|
1777
|
+
|
1778
|
+
forEach: function (callback) {
|
1779
|
+
var context = arguments.length > 1 ? arguments[1] : null;
|
1780
|
+
var it = this.entries();
|
1781
|
+
for (var entry = it.next(); !entry.done; entry = it.next()) {
|
1782
|
+
callback.call(context, entry.value[1], entry.value[0], this);
|
1783
|
+
}
|
1784
|
+
}
|
1785
|
+
});
|
1786
|
+
addIterator(Map.prototype, function () { return this.entries(); });
|
1787
|
+
|
1788
|
+
return Map;
|
1789
|
+
})(),
|
1790
|
+
|
1791
|
+
Set: (function () {
|
1792
|
+
// Creating a Map is expensive. To speed up the common case of
|
1793
|
+
// Sets containing only string or numeric keys, we use an object
|
1794
|
+
// as backing storage and lazily create a full Map only when
|
1795
|
+
// required.
|
1796
|
+
var SetShim = function Set(iterable) {
|
1797
|
+
var set = this;
|
1798
|
+
set = emulateES6construct(set);
|
1799
|
+
if (!set._es6set) {
|
1800
|
+
throw new TypeError('bad set');
|
1801
|
+
}
|
1802
|
+
|
1803
|
+
defineProperties(set, {
|
1804
|
+
'[[SetData]]': null,
|
1805
|
+
_storage: emptyObject()
|
1806
|
+
});
|
1807
|
+
|
1808
|
+
// Optionally initialize map from iterable
|
1809
|
+
if (iterable !== undefined && iterable !== null) {
|
1810
|
+
var it = ES.GetIterator(iterable);
|
1811
|
+
var adder = set.add;
|
1812
|
+
if (!ES.IsCallable(adder)) { throw new TypeError('bad set'); }
|
1813
|
+
while (true) {
|
1814
|
+
var next = ES.IteratorNext(it);
|
1815
|
+
if (next.done) { break; }
|
1816
|
+
var nextItem = next.value;
|
1817
|
+
adder.call(set, nextItem);
|
1818
|
+
}
|
1819
|
+
}
|
1820
|
+
return set;
|
1821
|
+
};
|
1822
|
+
var Set$prototype = SetShim.prototype;
|
1823
|
+
defineProperties(SetShim, {
|
1824
|
+
'@@create': function (obj) {
|
1825
|
+
var constructor = this;
|
1826
|
+
var prototype = constructor.prototype || Set$prototype;
|
1827
|
+
obj = obj || create(prototype);
|
1828
|
+
defineProperties(obj, { _es6set: true });
|
1829
|
+
return obj;
|
1830
|
+
}
|
1831
|
+
});
|
1832
|
+
|
1833
|
+
// Switch from the object backing storage to a full Map.
|
1834
|
+
var ensureMap = function ensureMap(set) {
|
1835
|
+
if (!set['[[SetData]]']) {
|
1836
|
+
var m = set['[[SetData]]'] = new collectionShims.Map();
|
1837
|
+
Object.keys(set._storage).forEach(function (k) {
|
1838
|
+
// fast check for leading '$'
|
1839
|
+
if (k.charCodeAt(0) === 36) {
|
1840
|
+
k = k.slice(1);
|
1841
|
+
} else if (k.charAt(0) === 'n') {
|
1842
|
+
k = +k.slice(1);
|
1843
|
+
} else {
|
1844
|
+
k = +k;
|
1845
|
+
}
|
1846
|
+
m.set(k, k);
|
1847
|
+
});
|
1848
|
+
set._storage = null; // free old backing storage
|
1849
|
+
}
|
1850
|
+
};
|
1851
|
+
|
1852
|
+
Object.defineProperty(SetShim.prototype, 'size', {
|
1853
|
+
configurable: true,
|
1854
|
+
enumerable: false,
|
1855
|
+
get: function () {
|
1856
|
+
if (typeof this._storage === 'undefined') {
|
1857
|
+
// https://github.com/paulmillr/es6-shim/issues/176
|
1858
|
+
throw new TypeError('size method called on incompatible Set');
|
1859
|
+
}
|
1860
|
+
ensureMap(this);
|
1861
|
+
return this['[[SetData]]'].size;
|
1862
|
+
}
|
1863
|
+
});
|
1864
|
+
|
1865
|
+
defineProperties(SetShim.prototype, {
|
1866
|
+
has: function (key) {
|
1867
|
+
var fkey;
|
1868
|
+
if (this._storage && (fkey = fastkey(key)) !== null) {
|
1869
|
+
return !!this._storage[fkey];
|
1870
|
+
}
|
1871
|
+
ensureMap(this);
|
1872
|
+
return this['[[SetData]]'].has(key);
|
1873
|
+
},
|
1874
|
+
|
1875
|
+
add: function (key) {
|
1876
|
+
var fkey;
|
1877
|
+
if (this._storage && (fkey = fastkey(key)) !== null) {
|
1878
|
+
this._storage[fkey] = true;
|
1879
|
+
return;
|
1880
|
+
}
|
1881
|
+
ensureMap(this);
|
1882
|
+
this['[[SetData]]'].set(key, key);
|
1883
|
+
return this;
|
1884
|
+
},
|
1885
|
+
|
1886
|
+
'delete': function (key) {
|
1887
|
+
var fkey;
|
1888
|
+
if (this._storage && (fkey = fastkey(key)) !== null) {
|
1889
|
+
delete this._storage[fkey];
|
1890
|
+
return;
|
1891
|
+
}
|
1892
|
+
ensureMap(this);
|
1893
|
+
return this['[[SetData]]']['delete'](key);
|
1894
|
+
},
|
1895
|
+
|
1896
|
+
clear: function () {
|
1897
|
+
if (this._storage) {
|
1898
|
+
this._storage = emptyObject();
|
1899
|
+
return;
|
1900
|
+
}
|
1901
|
+
return this['[[SetData]]'].clear();
|
1902
|
+
},
|
1903
|
+
|
1904
|
+
keys: function () {
|
1905
|
+
ensureMap(this);
|
1906
|
+
return this['[[SetData]]'].keys();
|
1907
|
+
},
|
1908
|
+
|
1909
|
+
values: function () {
|
1910
|
+
ensureMap(this);
|
1911
|
+
return this['[[SetData]]'].values();
|
1912
|
+
},
|
1913
|
+
|
1914
|
+
entries: function () {
|
1915
|
+
ensureMap(this);
|
1916
|
+
return this['[[SetData]]'].entries();
|
1917
|
+
},
|
1918
|
+
|
1919
|
+
forEach: function (callback) {
|
1920
|
+
var context = arguments.length > 1 ? arguments[1] : null;
|
1921
|
+
var entireSet = this;
|
1922
|
+
ensureMap(this);
|
1923
|
+
this['[[SetData]]'].forEach(function (value, key) {
|
1924
|
+
callback.call(context, key, key, entireSet);
|
1925
|
+
});
|
1926
|
+
}
|
1927
|
+
});
|
1928
|
+
addIterator(SetShim.prototype, function () { return this.values(); });
|
1929
|
+
|
1930
|
+
return SetShim;
|
1931
|
+
})()
|
1932
|
+
};
|
1933
|
+
defineProperties(globals, collectionShims);
|
1934
|
+
|
1935
|
+
if (globals.Map || globals.Set) {
|
1936
|
+
/*
|
1937
|
+
- In Firefox < 23, Map#size is a function.
|
1938
|
+
- In all current Firefox, Set#entries/keys/values & Map#clear do not exist
|
1939
|
+
- https://bugzilla.mozilla.org/show_bug.cgi?id=869996
|
1940
|
+
- In Firefox 24, Map and Set do not implement forEach
|
1941
|
+
- In Firefox 25 at least, Map and Set are callable without "new"
|
1942
|
+
*/
|
1943
|
+
if (
|
1944
|
+
typeof globals.Map.prototype.clear !== 'function' ||
|
1945
|
+
new globals.Set().size !== 0 ||
|
1946
|
+
new globals.Map().size !== 0 ||
|
1947
|
+
typeof globals.Map.prototype.keys !== 'function' ||
|
1948
|
+
typeof globals.Set.prototype.keys !== 'function' ||
|
1949
|
+
typeof globals.Map.prototype.forEach !== 'function' ||
|
1950
|
+
typeof globals.Set.prototype.forEach !== 'function' ||
|
1951
|
+
isCallableWithoutNew(globals.Map) ||
|
1952
|
+
isCallableWithoutNew(globals.Set) ||
|
1953
|
+
!supportsSubclassing(globals.Map, function (M) {
|
1954
|
+
var m = new M([]);
|
1955
|
+
// Firefox 32 is ok with the instantiating the subclass but will
|
1956
|
+
// throw when the map is used.
|
1957
|
+
m.set(42, 42);
|
1958
|
+
return m instanceof M;
|
1959
|
+
})
|
1960
|
+
) {
|
1961
|
+
globals.Map = collectionShims.Map;
|
1962
|
+
globals.Set = collectionShims.Set;
|
1963
|
+
}
|
1964
|
+
}
|
1965
|
+
// Shim incomplete iterator implementations.
|
1966
|
+
addIterator(Object.getPrototypeOf((new globals.Map()).keys()));
|
1967
|
+
addIterator(Object.getPrototypeOf((new globals.Set()).keys()));
|
1968
|
+
}
|
1969
|
+
};
|
1970
|
+
|
1971
|
+
if (typeof define === 'function' && define.amd) {
|
1972
|
+
define(main); // RequireJS
|
1973
|
+
} else {
|
1974
|
+
main(); // CommonJS and <script>
|
1975
|
+
}
|
1976
|
+
})();
|