Version 1
[yaffs-website] / node_modules / core-js / modules / es6.symbol.js
1 'use strict';
2 // ECMAScript 6 symbols shim
3 var global         = require('./_global')
4   , has            = require('./_has')
5   , DESCRIPTORS    = require('./_descriptors')
6   , $export        = require('./_export')
7   , redefine       = require('./_redefine')
8   , META           = require('./_meta').KEY
9   , $fails         = require('./_fails')
10   , shared         = require('./_shared')
11   , setToStringTag = require('./_set-to-string-tag')
12   , uid            = require('./_uid')
13   , wks            = require('./_wks')
14   , wksExt         = require('./_wks-ext')
15   , wksDefine      = require('./_wks-define')
16   , keyOf          = require('./_keyof')
17   , enumKeys       = require('./_enum-keys')
18   , isArray        = require('./_is-array')
19   , anObject       = require('./_an-object')
20   , toIObject      = require('./_to-iobject')
21   , toPrimitive    = require('./_to-primitive')
22   , createDesc     = require('./_property-desc')
23   , _create        = require('./_object-create')
24   , gOPNExt        = require('./_object-gopn-ext')
25   , $GOPD          = require('./_object-gopd')
26   , $DP            = require('./_object-dp')
27   , $keys          = require('./_object-keys')
28   , gOPD           = $GOPD.f
29   , dP             = $DP.f
30   , gOPN           = gOPNExt.f
31   , $Symbol        = global.Symbol
32   , $JSON          = global.JSON
33   , _stringify     = $JSON && $JSON.stringify
34   , PROTOTYPE      = 'prototype'
35   , HIDDEN         = wks('_hidden')
36   , TO_PRIMITIVE   = wks('toPrimitive')
37   , isEnum         = {}.propertyIsEnumerable
38   , SymbolRegistry = shared('symbol-registry')
39   , AllSymbols     = shared('symbols')
40   , OPSymbols      = shared('op-symbols')
41   , ObjectProto    = Object[PROTOTYPE]
42   , USE_NATIVE     = typeof $Symbol == 'function'
43   , QObject        = global.QObject;
44 // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
45 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
46
47 // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
48 var setSymbolDesc = DESCRIPTORS && $fails(function(){
49   return _create(dP({}, 'a', {
50     get: function(){ return dP(this, 'a', {value: 7}).a; }
51   })).a != 7;
52 }) ? function(it, key, D){
53   var protoDesc = gOPD(ObjectProto, key);
54   if(protoDesc)delete ObjectProto[key];
55   dP(it, key, D);
56   if(protoDesc && it !== ObjectProto)dP(ObjectProto, key, protoDesc);
57 } : dP;
58
59 var wrap = function(tag){
60   var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
61   sym._k = tag;
62   return sym;
63 };
64
65 var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function(it){
66   return typeof it == 'symbol';
67 } : function(it){
68   return it instanceof $Symbol;
69 };
70
71 var $defineProperty = function defineProperty(it, key, D){
72   if(it === ObjectProto)$defineProperty(OPSymbols, key, D);
73   anObject(it);
74   key = toPrimitive(key, true);
75   anObject(D);
76   if(has(AllSymbols, key)){
77     if(!D.enumerable){
78       if(!has(it, HIDDEN))dP(it, HIDDEN, createDesc(1, {}));
79       it[HIDDEN][key] = true;
80     } else {
81       if(has(it, HIDDEN) && it[HIDDEN][key])it[HIDDEN][key] = false;
82       D = _create(D, {enumerable: createDesc(0, false)});
83     } return setSymbolDesc(it, key, D);
84   } return dP(it, key, D);
85 };
86 var $defineProperties = function defineProperties(it, P){
87   anObject(it);
88   var keys = enumKeys(P = toIObject(P))
89     , i    = 0
90     , l = keys.length
91     , key;
92   while(l > i)$defineProperty(it, key = keys[i++], P[key]);
93   return it;
94 };
95 var $create = function create(it, P){
96   return P === undefined ? _create(it) : $defineProperties(_create(it), P);
97 };
98 var $propertyIsEnumerable = function propertyIsEnumerable(key){
99   var E = isEnum.call(this, key = toPrimitive(key, true));
100   if(this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return false;
101   return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
102 };
103 var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key){
104   it  = toIObject(it);
105   key = toPrimitive(key, true);
106   if(it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key))return;
107   var D = gOPD(it, key);
108   if(D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key]))D.enumerable = true;
109   return D;
110 };
111 var $getOwnPropertyNames = function getOwnPropertyNames(it){
112   var names  = gOPN(toIObject(it))
113     , result = []
114     , i      = 0
115     , key;
116   while(names.length > i){
117     if(!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META)result.push(key);
118   } return result;
119 };
120 var $getOwnPropertySymbols = function getOwnPropertySymbols(it){
121   var IS_OP  = it === ObjectProto
122     , names  = gOPN(IS_OP ? OPSymbols : toIObject(it))
123     , result = []
124     , i      = 0
125     , key;
126   while(names.length > i){
127     if(has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true))result.push(AllSymbols[key]);
128   } return result;
129 };
130
131 // 19.4.1.1 Symbol([description])
132 if(!USE_NATIVE){
133   $Symbol = function Symbol(){
134     if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');
135     var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
136     var $set = function(value){
137       if(this === ObjectProto)$set.call(OPSymbols, value);
138       if(has(this, HIDDEN) && has(this[HIDDEN], tag))this[HIDDEN][tag] = false;
139       setSymbolDesc(this, tag, createDesc(1, value));
140     };
141     if(DESCRIPTORS && setter)setSymbolDesc(ObjectProto, tag, {configurable: true, set: $set});
142     return wrap(tag);
143   };
144   redefine($Symbol[PROTOTYPE], 'toString', function toString(){
145     return this._k;
146   });
147
148   $GOPD.f = $getOwnPropertyDescriptor;
149   $DP.f   = $defineProperty;
150   require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;
151   require('./_object-pie').f  = $propertyIsEnumerable;
152   require('./_object-gops').f = $getOwnPropertySymbols;
153
154   if(DESCRIPTORS && !require('./_library')){
155     redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
156   }
157
158   wksExt.f = function(name){
159     return wrap(wks(name));
160   }
161 }
162
163 $export($export.G + $export.W + $export.F * !USE_NATIVE, {Symbol: $Symbol});
164
165 for(var symbols = (
166   // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
167   'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
168 ).split(','), i = 0; symbols.length > i; )wks(symbols[i++]);
169
170 for(var symbols = $keys(wks.store), i = 0; symbols.length > i; )wksDefine(symbols[i++]);
171
172 $export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
173   // 19.4.2.1 Symbol.for(key)
174   'for': function(key){
175     return has(SymbolRegistry, key += '')
176       ? SymbolRegistry[key]
177       : SymbolRegistry[key] = $Symbol(key);
178   },
179   // 19.4.2.5 Symbol.keyFor(sym)
180   keyFor: function keyFor(key){
181     if(isSymbol(key))return keyOf(SymbolRegistry, key);
182     throw TypeError(key + ' is not a symbol!');
183   },
184   useSetter: function(){ setter = true; },
185   useSimple: function(){ setter = false; }
186 });
187
188 $export($export.S + $export.F * !USE_NATIVE, 'Object', {
189   // 19.1.2.2 Object.create(O [, Properties])
190   create: $create,
191   // 19.1.2.4 Object.defineProperty(O, P, Attributes)
192   defineProperty: $defineProperty,
193   // 19.1.2.3 Object.defineProperties(O, Properties)
194   defineProperties: $defineProperties,
195   // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
196   getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
197   // 19.1.2.7 Object.getOwnPropertyNames(O)
198   getOwnPropertyNames: $getOwnPropertyNames,
199   // 19.1.2.8 Object.getOwnPropertySymbols(O)
200   getOwnPropertySymbols: $getOwnPropertySymbols
201 });
202
203 // 24.3.2 JSON.stringify(value [, replacer [, space]])
204 $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function(){
205   var S = $Symbol();
206   // MS Edge converts symbol values to JSON as {}
207   // WebKit converts symbol values to JSON as null
208   // V8 throws on boxed symbols
209   return _stringify([S]) != '[null]' || _stringify({a: S}) != '{}' || _stringify(Object(S)) != '{}';
210 })), 'JSON', {
211   stringify: function stringify(it){
212     if(it === undefined || isSymbol(it))return; // IE8 returns string on undefined
213     var args = [it]
214       , i    = 1
215       , replacer, $replacer;
216     while(arguments.length > i)args.push(arguments[i++]);
217     replacer = args[1];
218     if(typeof replacer == 'function')$replacer = replacer;
219     if($replacer || !isArray(replacer))replacer = function(key, value){
220       if($replacer)value = $replacer.call(this, key, value);
221       if(!isSymbol(value))return value;
222     };
223     args[1] = replacer;
224     return _stringify.apply($JSON, args);
225   }
226 });
227
228 // 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
229 $Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
230 // 19.4.3.5 Symbol.prototype[@@toStringTag]
231 setToStringTag($Symbol, 'Symbol');
232 // 20.2.1.9 Math[@@toStringTag]
233 setToStringTag(Math, 'Math', true);
234 // 24.3.3 JSON[@@toStringTag]
235 setToStringTag(global.JSON, 'JSON', true);