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.
70 lines
2.0 KiB
70 lines
2.0 KiB
2 years ago
|
var NATIVE_WEAK_MAP = require('../internals/native-weak-map');
|
||
|
var global = require('../internals/global');
|
||
|
var uncurryThis = require('../internals/function-uncurry-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 = 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 TypeError('Incompatible receiver, ' + TYPE + ' required');
|
||
|
} return state;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
if (NATIVE_WEAK_MAP || shared.state) {
|
||
|
var store = shared.state || (shared.state = new WeakMap());
|
||
|
var wmget = uncurryThis(store.get);
|
||
|
var wmhas = uncurryThis(store.has);
|
||
|
var wmset = uncurryThis(store.set);
|
||
|
set = function (it, metadata) {
|
||
|
if (wmhas(store, it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);
|
||
|
metadata.facade = it;
|
||
|
wmset(store, it, metadata);
|
||
|
return metadata;
|
||
|
};
|
||
|
get = function (it) {
|
||
|
return wmget(store, it) || {};
|
||
|
};
|
||
|
has = function (it) {
|
||
|
return wmhas(store, 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
|
||
|
};
|