| 'use strict'; |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var $gOPD = require('../helpers/getOwnPropertyDescriptor'); |
| var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%'); |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| |
| var every = require('../helpers/every'); |
| |
| var IsDataDescriptor = require('./IsDataDescriptor'); |
| var IsExtensible = require('./IsExtensible'); |
| var ToPropertyDescriptor = require('./ToPropertyDescriptor'); |
| var Type = require('./Type'); |
| |
| // https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel |
| |
| module.exports = function TestIntegrityLevel(O, level) { |
| if (Type(O) !== 'Object') { |
| throw new $TypeError('Assertion failed: Type(O) is not Object'); |
| } |
| if (level !== 'sealed' && level !== 'frozen') { |
| throw new $TypeError('Assertion failed: `level` must be `"sealed"` or `"frozen"`'); |
| } |
| var status = IsExtensible(O); |
| if (status) { |
| return false; |
| } |
| var theKeys = $gOPN(O); |
| return theKeys.length === 0 || every(theKeys, function (k) { |
| var currentDesc = $gOPD(O, k); |
| if (typeof currentDesc !== 'undefined') { |
| if (currentDesc.configurable) { |
| return false; |
| } |
| if (level === 'frozen' && IsDataDescriptor(ToPropertyDescriptor(currentDesc)) && currentDesc.writable) { |
| return false; |
| } |
| } |
| return true; |
| }); |
| }; |