| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | // ES2015 Symbol polyfill for environments that do not (or partially) support it'use strict';var d              = require('d')  , validateSymbol = require('./validate-symbol')  , create = Object.create, defineProperties = Object.defineProperties  , defineProperty = Object.defineProperty, objPrototype = Object.prototype  , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create(null)  , isNativeSafe;if (typeof Symbol === 'function') {	NativeSymbol = Symbol;	try {		String(NativeSymbol());		isNativeSafe = true;	} catch (ignore) {}}var generateName = (function () {	var created = create(null);	return function (desc) {		var postfix = 0, name, ie11BugWorkaround;		while (created[desc + (postfix || '')]) ++postfix;		desc += (postfix || '');		created[desc] = true;		name = '@@' + desc;		defineProperty(objPrototype, name, d.gs(null, function (value) {			// For IE11 issue see:			// https://connect.microsoft.com/IE/feedbackdetail/view/1928508/			//    ie11-broken-getters-on-dom-objects			// https://github.com/medikoo/es6-symbol/issues/12			if (ie11BugWorkaround) return;			ie11BugWorkaround = true;			defineProperty(this, name, d(value));			ie11BugWorkaround = false;		}));		return name;	};}());// Internal constructor (not one exposed) for creating Symbol instances.// This one is used to ensure that `someSymbol instanceof Symbol` always return falseHiddenSymbol = function Symbol(description) {	if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');	return SymbolPolyfill(description);};// Exposed `Symbol` constructor// (returns instances of HiddenSymbol)module.exports = SymbolPolyfill = function Symbol(description) {	var symbol;	if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');	if (isNativeSafe) return NativeSymbol(description);	symbol = create(HiddenSymbol.prototype);	description = (description === undefined ? '' : String(description));	return defineProperties(symbol, {		__description__: d('', description),		__name__: d('', generateName(description))	});};defineProperties(SymbolPolyfill, {	for: d(function (key) {		if (globalSymbols[key]) return globalSymbols[key];		return (globalSymbols[key] = SymbolPolyfill(String(key)));	}),	keyFor: d(function (s) {		var key;		validateSymbol(s);		for (key in globalSymbols) if (globalSymbols[key] === s) return key;	}),	// To ensure proper interoperability with other native functions (e.g. Array.from)	// fallback to eventual native implementation of given symbol	hasInstance: d('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),	isConcatSpreadable: d('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||		SymbolPolyfill('isConcatSpreadable')),	iterator: d('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),	match: d('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),	replace: d('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),	search: d('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),	species: d('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),	split: d('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),	toPrimitive: d('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),	toStringTag: d('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),	unscopables: d('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))});// Internal tweaks for real symbol producerdefineProperties(HiddenSymbol.prototype, {	constructor: d(SymbolPolyfill),	toString: d('', function () { return this.__name__; })});// Proper implementation of methods exposed on Symbol.prototype// They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototypedefineProperties(SymbolPolyfill.prototype, {	toString: d(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),	valueOf: d(function () { return validateSymbol(this); })});defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d('', function () {	var symbol = validateSymbol(this);	if (typeof symbol === 'symbol') return symbol;	return symbol.toString();}));defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d('c', 'Symbol'));// Proper implementaton of toPrimitive and toStringTag for returned symbol instancesdefineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,	d('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));// Note: It's important to define `toPrimitive` as last one, as some implementations// implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)// And that may invoke error in definition flow:// See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,	d('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
 |