| '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 | 
| }; |