UNPKG

1.55 kBJavaScriptView Raw
1var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
2var global = require('../internals/global');
3var isObject = require('../internals/is-object');
4var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
5var objectHas = require('../internals/has');
6var sharedKey = require('../internals/shared-key');
7var hiddenKeys = require('../internals/hidden-keys');
8
9var WeakMap = global.WeakMap;
10var set, get, has;
11
12var enforce = function (it) {
13 return has(it) ? get(it) : set(it, {});
14};
15
16var getterFor = function (TYPE) {
17 return function (it) {
18 var state;
19 if (!isObject(it) || (state = get(it)).type !== TYPE) {
20 throw TypeError('Incompatible receiver, ' + TYPE + ' required');
21 } return state;
22 };
23};
24
25if (NATIVE_WEAK_MAP) {
26 var store = new WeakMap();
27 var wmget = store.get;
28 var wmhas = store.has;
29 var wmset = store.set;
30 set = function (it, metadata) {
31 wmset.call(store, it, metadata);
32 return metadata;
33 };
34 get = function (it) {
35 return wmget.call(store, it) || {};
36 };
37 has = function (it) {
38 return wmhas.call(store, it);
39 };
40} else {
41 var STATE = sharedKey('state');
42 hiddenKeys[STATE] = true;
43 set = function (it, metadata) {
44 createNonEnumerableProperty(it, STATE, metadata);
45 return metadata;
46 };
47 get = function (it) {
48 return objectHas(it, STATE) ? it[STATE] : {};
49 };
50 has = function (it) {
51 return objectHas(it, STATE);
52 };
53}
54
55module.exports = {
56 set: set,
57 get: get,
58 has: has,
59 enforce: enforce,
60 getterFor: getterFor
61};