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