1 | 'use strict';
|
---|
2 | var $ = require('../internals/export');
|
---|
3 | var global = require('../internals/global');
|
---|
4 | var getBuiltIn = require('../internals/get-built-in');
|
---|
5 | var IS_PURE = require('../internals/is-pure');
|
---|
6 | var DESCRIPTORS = require('../internals/descriptors');
|
---|
7 | var NATIVE_SYMBOL = require('../internals/native-symbol');
|
---|
8 | var fails = require('../internals/fails');
|
---|
9 | var has = require('../internals/has');
|
---|
10 | var isArray = require('../internals/is-array');
|
---|
11 | var isObject = require('../internals/is-object');
|
---|
12 | var isSymbol = require('../internals/is-symbol');
|
---|
13 | var anObject = require('../internals/an-object');
|
---|
14 | var toObject = require('../internals/to-object');
|
---|
15 | var toIndexedObject = require('../internals/to-indexed-object');
|
---|
16 | var toPropertyKey = require('../internals/to-property-key');
|
---|
17 | var $toString = require('../internals/to-string');
|
---|
18 | var createPropertyDescriptor = require('../internals/create-property-descriptor');
|
---|
19 | var nativeObjectCreate = require('../internals/object-create');
|
---|
20 | var objectKeys = require('../internals/object-keys');
|
---|
21 | var getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');
|
---|
22 | var getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');
|
---|
23 | var getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');
|
---|
24 | var getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');
|
---|
25 | var definePropertyModule = require('../internals/object-define-property');
|
---|
26 | var propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');
|
---|
27 | var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
|
---|
28 | var redefine = require('../internals/redefine');
|
---|
29 | var shared = require('../internals/shared');
|
---|
30 | var sharedKey = require('../internals/shared-key');
|
---|
31 | var hiddenKeys = require('../internals/hidden-keys');
|
---|
32 | var uid = require('../internals/uid');
|
---|
33 | var wellKnownSymbol = require('../internals/well-known-symbol');
|
---|
34 | var wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');
|
---|
35 | var defineWellKnownSymbol = require('../internals/define-well-known-symbol');
|
---|
36 | var setToStringTag = require('../internals/set-to-string-tag');
|
---|
37 | var InternalStateModule = require('../internals/internal-state');
|
---|
38 | var $forEach = require('../internals/array-iteration').forEach;
|
---|
39 |
|
---|
40 | var HIDDEN = sharedKey('hidden');
|
---|
41 | var SYMBOL = 'Symbol';
|
---|
42 | var PROTOTYPE = 'prototype';
|
---|
43 | var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');
|
---|
44 | var setInternalState = InternalStateModule.set;
|
---|
45 | var getInternalState = InternalStateModule.getterFor(SYMBOL);
|
---|
46 | var ObjectPrototype = Object[PROTOTYPE];
|
---|
47 | var $Symbol = global.Symbol;
|
---|
48 | var $stringify = getBuiltIn('JSON', 'stringify');
|
---|
49 | var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
|
---|
50 | var nativeDefineProperty = definePropertyModule.f;
|
---|
51 | var nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;
|
---|
52 | var nativePropertyIsEnumerable = propertyIsEnumerableModule.f;
|
---|
53 | var AllSymbols = shared('symbols');
|
---|
54 | var ObjectPrototypeSymbols = shared('op-symbols');
|
---|
55 | var StringToSymbolRegistry = shared('string-to-symbol-registry');
|
---|
56 | var SymbolToStringRegistry = shared('symbol-to-string-registry');
|
---|
57 | var WellKnownSymbolsStore = shared('wks');
|
---|
58 | var QObject = global.QObject;
|
---|
59 | // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
|
---|
60 | var USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
|
---|
61 |
|
---|
62 | // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
|
---|
63 | var setSymbolDescriptor = DESCRIPTORS && fails(function () {
|
---|
64 | return nativeObjectCreate(nativeDefineProperty({}, 'a', {
|
---|
65 | get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }
|
---|
66 | })).a != 7;
|
---|
67 | }) ? function (O, P, Attributes) {
|
---|
68 | var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);
|
---|
69 | if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];
|
---|
70 | nativeDefineProperty(O, P, Attributes);
|
---|
71 | if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {
|
---|
72 | nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);
|
---|
73 | }
|
---|
74 | } : nativeDefineProperty;
|
---|
75 |
|
---|
76 | var wrap = function (tag, description) {
|
---|
77 | var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);
|
---|
78 | setInternalState(symbol, {
|
---|
79 | type: SYMBOL,
|
---|
80 | tag: tag,
|
---|
81 | description: description
|
---|
82 | });
|
---|
83 | if (!DESCRIPTORS) symbol.description = description;
|
---|
84 | return symbol;
|
---|
85 | };
|
---|
86 |
|
---|
87 | var $defineProperty = function defineProperty(O, P, Attributes) {
|
---|
88 | if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);
|
---|
89 | anObject(O);
|
---|
90 | var key = toPropertyKey(P);
|
---|
91 | anObject(Attributes);
|
---|
92 | if (has(AllSymbols, key)) {
|
---|
93 | if (!Attributes.enumerable) {
|
---|
94 | if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));
|
---|
95 | O[HIDDEN][key] = true;
|
---|
96 | } else {
|
---|
97 | if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;
|
---|
98 | Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });
|
---|
99 | } return setSymbolDescriptor(O, key, Attributes);
|
---|
100 | } return nativeDefineProperty(O, key, Attributes);
|
---|
101 | };
|
---|
102 |
|
---|
103 | var $defineProperties = function defineProperties(O, Properties) {
|
---|
104 | anObject(O);
|
---|
105 | var properties = toIndexedObject(Properties);
|
---|
106 | var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));
|
---|
107 | $forEach(keys, function (key) {
|
---|
108 | if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);
|
---|
109 | });
|
---|
110 | return O;
|
---|
111 | };
|
---|
112 |
|
---|
113 | var $create = function create(O, Properties) {
|
---|
114 | return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);
|
---|
115 | };
|
---|
116 |
|
---|
117 | var $propertyIsEnumerable = function propertyIsEnumerable(V) {
|
---|
118 | var P = toPropertyKey(V);
|
---|
119 | var enumerable = nativePropertyIsEnumerable.call(this, P);
|
---|
120 | if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;
|
---|
121 | return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;
|
---|
122 | };
|
---|
123 |
|
---|
124 | var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {
|
---|
125 | var it = toIndexedObject(O);
|
---|
126 | var key = toPropertyKey(P);
|
---|
127 | if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;
|
---|
128 | var descriptor = nativeGetOwnPropertyDescriptor(it, key);
|
---|
129 | if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {
|
---|
130 | descriptor.enumerable = true;
|
---|
131 | }
|
---|
132 | return descriptor;
|
---|
133 | };
|
---|
134 |
|
---|
135 | var $getOwnPropertyNames = function getOwnPropertyNames(O) {
|
---|
136 | var names = nativeGetOwnPropertyNames(toIndexedObject(O));
|
---|
137 | var result = [];
|
---|
138 | $forEach(names, function (key) {
|
---|
139 | if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);
|
---|
140 | });
|
---|
141 | return result;
|
---|
142 | };
|
---|
143 |
|
---|
144 | var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {
|
---|
145 | var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;
|
---|
146 | var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));
|
---|
147 | var result = [];
|
---|
148 | $forEach(names, function (key) {
|
---|
149 | if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {
|
---|
150 | result.push(AllSymbols[key]);
|
---|
151 | }
|
---|
152 | });
|
---|
153 | return result;
|
---|
154 | };
|
---|
155 |
|
---|
156 | // `Symbol` constructor
|
---|
157 | // https://tc39.es/ecma262/#sec-symbol-constructor
|
---|
158 | if (!NATIVE_SYMBOL) {
|
---|
159 | $Symbol = function Symbol() {
|
---|
160 | if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');
|
---|
161 | var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]);
|
---|
162 | var tag = uid(description);
|
---|
163 | var setter = function (value) {
|
---|
164 | if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);
|
---|
165 | if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
|
---|
166 | setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));
|
---|
167 | };
|
---|
168 | if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });
|
---|
169 | return wrap(tag, description);
|
---|
170 | };
|
---|
171 |
|
---|
172 | redefine($Symbol[PROTOTYPE], 'toString', function toString() {
|
---|
173 | return getInternalState(this).tag;
|
---|
174 | });
|
---|
175 |
|
---|
176 | redefine($Symbol, 'withoutSetter', function (description) {
|
---|
177 | return wrap(uid(description), description);
|
---|
178 | });
|
---|
179 |
|
---|
180 | propertyIsEnumerableModule.f = $propertyIsEnumerable;
|
---|
181 | definePropertyModule.f = $defineProperty;
|
---|
182 | getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;
|
---|
183 | getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;
|
---|
184 | getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;
|
---|
185 |
|
---|
186 | wrappedWellKnownSymbolModule.f = function (name) {
|
---|
187 | return wrap(wellKnownSymbol(name), name);
|
---|
188 | };
|
---|
189 |
|
---|
190 | if (DESCRIPTORS) {
|
---|
191 | // https://github.com/tc39/proposal-Symbol-description
|
---|
192 | nativeDefineProperty($Symbol[PROTOTYPE], 'description', {
|
---|
193 | configurable: true,
|
---|
194 | get: function description() {
|
---|
195 | return getInternalState(this).description;
|
---|
196 | }
|
---|
197 | });
|
---|
198 | if (!IS_PURE) {
|
---|
199 | redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });
|
---|
200 | }
|
---|
201 | }
|
---|
202 | }
|
---|
203 |
|
---|
204 | $({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {
|
---|
205 | Symbol: $Symbol
|
---|
206 | });
|
---|
207 |
|
---|
208 | $forEach(objectKeys(WellKnownSymbolsStore), function (name) {
|
---|
209 | defineWellKnownSymbol(name);
|
---|
210 | });
|
---|
211 |
|
---|
212 | $({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {
|
---|
213 | // `Symbol.for` method
|
---|
214 | // https://tc39.es/ecma262/#sec-symbol.for
|
---|
215 | 'for': function (key) {
|
---|
216 | var string = $toString(key);
|
---|
217 | if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];
|
---|
218 | var symbol = $Symbol(string);
|
---|
219 | StringToSymbolRegistry[string] = symbol;
|
---|
220 | SymbolToStringRegistry[symbol] = string;
|
---|
221 | return symbol;
|
---|
222 | },
|
---|
223 | // `Symbol.keyFor` method
|
---|
224 | // https://tc39.es/ecma262/#sec-symbol.keyfor
|
---|
225 | keyFor: function keyFor(sym) {
|
---|
226 | if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');
|
---|
227 | if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];
|
---|
228 | },
|
---|
229 | useSetter: function () { USE_SETTER = true; },
|
---|
230 | useSimple: function () { USE_SETTER = false; }
|
---|
231 | });
|
---|
232 |
|
---|
233 | $({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {
|
---|
234 | // `Object.create` method
|
---|
235 | // https://tc39.es/ecma262/#sec-object.create
|
---|
236 | create: $create,
|
---|
237 | // `Object.defineProperty` method
|
---|
238 | // https://tc39.es/ecma262/#sec-object.defineproperty
|
---|
239 | defineProperty: $defineProperty,
|
---|
240 | // `Object.defineProperties` method
|
---|
241 | // https://tc39.es/ecma262/#sec-object.defineproperties
|
---|
242 | defineProperties: $defineProperties,
|
---|
243 | // `Object.getOwnPropertyDescriptor` method
|
---|
244 | // https://tc39.es/ecma262/#sec-object.getownpropertydescriptors
|
---|
245 | getOwnPropertyDescriptor: $getOwnPropertyDescriptor
|
---|
246 | });
|
---|
247 |
|
---|
248 | $({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {
|
---|
249 | // `Object.getOwnPropertyNames` method
|
---|
250 | // https://tc39.es/ecma262/#sec-object.getownpropertynames
|
---|
251 | getOwnPropertyNames: $getOwnPropertyNames,
|
---|
252 | // `Object.getOwnPropertySymbols` method
|
---|
253 | // https://tc39.es/ecma262/#sec-object.getownpropertysymbols
|
---|
254 | getOwnPropertySymbols: $getOwnPropertySymbols
|
---|
255 | });
|
---|
256 |
|
---|
257 | // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
|
---|
258 | // https://bugs.chromium.org/p/v8/issues/detail?id=3443
|
---|
259 | $({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {
|
---|
260 | getOwnPropertySymbols: function getOwnPropertySymbols(it) {
|
---|
261 | return getOwnPropertySymbolsModule.f(toObject(it));
|
---|
262 | }
|
---|
263 | });
|
---|
264 |
|
---|
265 | // `JSON.stringify` method behavior with symbols
|
---|
266 | // https://tc39.es/ecma262/#sec-json.stringify
|
---|
267 | if ($stringify) {
|
---|
268 | var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {
|
---|
269 | var symbol = $Symbol();
|
---|
270 | // MS Edge converts symbol values to JSON as {}
|
---|
271 | return $stringify([symbol]) != '[null]'
|
---|
272 | // WebKit converts symbol values to JSON as null
|
---|
273 | || $stringify({ a: symbol }) != '{}'
|
---|
274 | // V8 throws on boxed symbols
|
---|
275 | || $stringify(Object(symbol)) != '{}';
|
---|
276 | });
|
---|
277 |
|
---|
278 | $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {
|
---|
279 | // eslint-disable-next-line no-unused-vars -- required for `.length`
|
---|
280 | stringify: function stringify(it, replacer, space) {
|
---|
281 | var args = [it];
|
---|
282 | var index = 1;
|
---|
283 | var $replacer;
|
---|
284 | while (arguments.length > index) args.push(arguments[index++]);
|
---|
285 | $replacer = replacer;
|
---|
286 | if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
|
---|
287 | if (!isArray(replacer)) replacer = function (key, value) {
|
---|
288 | if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
|
---|
289 | if (!isSymbol(value)) return value;
|
---|
290 | };
|
---|
291 | args[1] = replacer;
|
---|
292 | return $stringify.apply(null, args);
|
---|
293 | }
|
---|
294 | });
|
---|
295 | }
|
---|
296 |
|
---|
297 | // `Symbol.prototype[@@toPrimitive]` method
|
---|
298 | // https://tc39.es/ecma262/#sec-symbol.prototype-@@toprimitive
|
---|
299 | if (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {
|
---|
300 | createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
|
---|
301 | }
|
---|
302 | // `Symbol.prototype[@@toStringTag]` property
|
---|
303 | // https://tc39.es/ecma262/#sec-symbol.prototype-@@tostringtag
|
---|
304 | setToStringTag($Symbol, SYMBOL);
|
---|
305 |
|
---|
306 | hiddenKeys[HIDDEN] = true;
|
---|