UNPKG

luhn-generator

Version:

A generator of numbers that passes the validation of Luhn algorithm or Luhn formula, also known as the 'modulus 10' or 'mod 10' algorithm

58 lines (51 loc) 1.86 kB
'use strict'; var GetIntrinsic = require('../GetIntrinsic'); var $SyntaxError = GetIntrinsic('%SyntaxError%'); var $TypeError = GetIntrinsic('%TypeError%'); var $preventExtensions = GetIntrinsic('%Object.preventExtensions%'); var $gOPD = require('../helpers/getOwnPropertyDescriptor'); var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%'); var forEach = require('../helpers/forEach'); var DefinePropertyOrThrow = require('./DefinePropertyOrThrow'); var IsAccessorDescriptor = require('./IsAccessorDescriptor'); var ToPropertyDescriptor = require('./ToPropertyDescriptor'); var Type = require('./Type'); // https://www.ecma-international.org/ecma-262/6.0/#sec-setintegritylevel module.exports = function SetIntegrityLevel(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"`'); } if (!$preventExtensions) { throw new $SyntaxError('SetIntegrityLevel requires native `Object.preventExtensions` support'); } var status = $preventExtensions(O); if (!status) { return false; } if (!$gOPN) { throw new $SyntaxError('SetIntegrityLevel requires native `Object.getOwnPropertyNames` support'); } var theKeys = $gOPN(O); if (level === 'sealed') { forEach(theKeys, function (k) { DefinePropertyOrThrow(O, k, { configurable: false }); }); } else if (level === 'frozen') { forEach(theKeys, function (k) { var currentDesc = $gOPD(O, k); if (typeof currentDesc !== 'undefined') { var desc; if (IsAccessorDescriptor(ToPropertyDescriptor(currentDesc))) { desc = { configurable: false }; } else { desc = { configurable: false, writable: false }; } DefinePropertyOrThrow(O, k, desc); } }); } return true; };