You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							71 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							71 lines
						
					
					
						
							2.0 KiB
						
					
					
				| 'use strict'; | |
| var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection'); | |
| var global = require('../internals/global'); | |
| 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 = global.TypeError; | |
| var WeakMap = global.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 | |
| };
 |