'use strict'; 
 | 
var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection'); 
 | 
var globalThis = require('../internals/global-this'); 
 | 
var isObject = require('../internals/is-object'); 
 | 
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); 
 | 
var hasOwn = require('../internals/has-own-property'); 
 | 
var shared = require('../internals/shared-store'); 
 | 
var sharedKey = require('../internals/shared-key'); 
 | 
var hiddenKeys = require('../internals/hidden-keys'); 
 | 
  
 | 
var OBJECT_ALREADY_INITIALIZED = 'Object already initialized'; 
 | 
var TypeError = globalThis.TypeError; 
 | 
var WeakMap = globalThis.WeakMap; 
 | 
var set, get, has; 
 | 
  
 | 
var enforce = function (it) { 
 | 
  return has(it) ? get(it) : set(it, {}); 
 | 
}; 
 | 
  
 | 
var getterFor = function (TYPE) { 
 | 
  return function (it) { 
 | 
    var state; 
 | 
    if (!isObject(it) || (state = get(it)).type !== TYPE) { 
 | 
      throw new TypeError('Incompatible receiver, ' + TYPE + ' required'); 
 | 
    } return state; 
 | 
  }; 
 | 
}; 
 | 
  
 | 
if (NATIVE_WEAK_MAP || shared.state) { 
 | 
  var store = shared.state || (shared.state = new WeakMap()); 
 | 
  /* eslint-disable no-self-assign -- prototype methods protection */ 
 | 
  store.get = store.get; 
 | 
  store.has = store.has; 
 | 
  store.set = store.set; 
 | 
  /* eslint-enable no-self-assign -- prototype methods protection */ 
 | 
  set = function (it, metadata) { 
 | 
    if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); 
 | 
    metadata.facade = it; 
 | 
    store.set(it, metadata); 
 | 
    return metadata; 
 | 
  }; 
 | 
  get = function (it) { 
 | 
    return store.get(it) || {}; 
 | 
  }; 
 | 
  has = function (it) { 
 | 
    return store.has(it); 
 | 
  }; 
 | 
} else { 
 | 
  var STATE = sharedKey('state'); 
 | 
  hiddenKeys[STATE] = true; 
 | 
  set = function (it, metadata) { 
 | 
    if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED); 
 | 
    metadata.facade = it; 
 | 
    createNonEnumerableProperty(it, STATE, metadata); 
 | 
    return metadata; 
 | 
  }; 
 | 
  get = function (it) { 
 | 
    return hasOwn(it, STATE) ? it[STATE] : {}; 
 | 
  }; 
 | 
  has = function (it) { 
 | 
    return hasOwn(it, STATE); 
 | 
  }; 
 | 
} 
 | 
  
 | 
module.exports = { 
 | 
  set: set, 
 | 
  get: get, 
 | 
  has: has, 
 | 
  enforce: enforce, 
 | 
  getterFor: getterFor 
 | 
}; 
 |