// `Symbol.prototype.description` getter 
 | 
// https://tc39.es/ecma262/#sec-symbol.prototype.description 
 | 
'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var DESCRIPTORS = require('../internals/descriptors'); 
 | 
var globalThis = require('../internals/global-this'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var hasOwn = require('../internals/has-own-property'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var isPrototypeOf = require('../internals/object-is-prototype-of'); 
 | 
var toString = require('../internals/to-string'); 
 | 
var defineBuiltInAccessor = require('../internals/define-built-in-accessor'); 
 | 
var copyConstructorProperties = require('../internals/copy-constructor-properties'); 
 | 
  
 | 
var NativeSymbol = globalThis.Symbol; 
 | 
var SymbolPrototype = NativeSymbol && NativeSymbol.prototype; 
 | 
  
 | 
if (DESCRIPTORS && isCallable(NativeSymbol) && (!('description' in SymbolPrototype) || 
 | 
  // Safari 12 bug 
 | 
  NativeSymbol().description !== undefined 
 | 
)) { 
 | 
  var EmptyStringDescriptionStore = {}; 
 | 
  // wrap Symbol constructor for correct work with undefined description 
 | 
  var SymbolWrapper = function Symbol() { 
 | 
    var description = arguments.length < 1 || arguments[0] === undefined ? undefined : toString(arguments[0]); 
 | 
    var result = isPrototypeOf(SymbolPrototype, this) 
 | 
      // eslint-disable-next-line sonarjs/inconsistent-function-call -- ok 
 | 
      ? new NativeSymbol(description) 
 | 
      // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)' 
 | 
      : description === undefined ? NativeSymbol() : NativeSymbol(description); 
 | 
    if (description === '') EmptyStringDescriptionStore[result] = true; 
 | 
    return result; 
 | 
  }; 
 | 
  
 | 
  copyConstructorProperties(SymbolWrapper, NativeSymbol); 
 | 
  SymbolWrapper.prototype = SymbolPrototype; 
 | 
  SymbolPrototype.constructor = SymbolWrapper; 
 | 
  
 | 
  var NATIVE_SYMBOL = String(NativeSymbol('description detection')) === 'Symbol(description detection)'; 
 | 
  var thisSymbolValue = uncurryThis(SymbolPrototype.valueOf); 
 | 
  var symbolDescriptiveString = uncurryThis(SymbolPrototype.toString); 
 | 
  var regexp = /^Symbol\((.*)\)[^)]+$/; 
 | 
  var replace = uncurryThis(''.replace); 
 | 
  var stringSlice = uncurryThis(''.slice); 
 | 
  
 | 
  defineBuiltInAccessor(SymbolPrototype, 'description', { 
 | 
    configurable: true, 
 | 
    get: function description() { 
 | 
      var symbol = thisSymbolValue(this); 
 | 
      if (hasOwn(EmptyStringDescriptionStore, symbol)) return ''; 
 | 
      var string = symbolDescriptiveString(symbol); 
 | 
      var desc = NATIVE_SYMBOL ? stringSlice(string, 7, -1) : replace(string, regexp, '$1'); 
 | 
      return desc === '' ? undefined : desc; 
 | 
    } 
 | 
  }); 
 | 
  
 | 
  $({ global: true, constructor: true, forced: true }, { 
 | 
    Symbol: SymbolWrapper 
 | 
  }); 
 | 
} 
 |