'use strict'; var GetIntrinsic = require('es-abstract/GetIntrinsic'); var has = require('has'); var channel = require('side-channel')(); var $TypeError = GetIntrinsic('%TypeError%'); var SLOT = { assert: function (O, slot) { if (!O || (typeof O !== 'object' && typeof O !== 'function')) { throw new $TypeError('`O` is not an object'); } if (typeof slot !== 'string') { throw new $TypeError('`slot` must be a string'); } channel.assert(O); }, get: function (O, slot) { if (!O || (typeof O !== 'object' && typeof O !== 'function')) { throw new $TypeError('`O` is not an object'); } if (typeof slot !== 'string') { throw new $TypeError('`slot` must be a string'); } var slots = channel.get(O); return slots && slots['$' + slot]; }, has: function (O, slot) { if (!O || (typeof O !== 'object' && typeof O !== 'function')) { throw new $TypeError('`O` is not an object'); } if (typeof slot !== 'string') { throw new $TypeError('`slot` must be a string'); } var slots = channel.get(O); return !!slots && has(slots, '$' + slot); }, set: function (O, slot, V) { if (!O || (typeof O !== 'object' && typeof O !== 'function')) { throw new $TypeError('`O` is not an object'); } if (typeof slot !== 'string') { throw new $TypeError('`slot` must be a string'); } var slots = channel.get(O); if (!slots) { slots = {}; channel.set(O, slots); } slots['$' + slot] = V; } }; if (Object.freeze) { Object.freeze(SLOT); } module.exports = SLOT;