'use strict'; var GetIntrinsic = require('get-intrinsic'); var $TypeError = GetIntrinsic('%TypeError%'); var Call = require('./Call'); var Get = require('./Get'); var IsCallable = require('./IsCallable'); var Type = require('./Type'); var inspect = require('object-inspect'); // https://262.ecma-international.org/8.0/#sec-ordinarytoprimitive module.exports = function OrdinaryToPrimitive(O, hint) { if (Type(O) !== 'Object') { throw new $TypeError('Assertion failed: Type(O) is not Object'); } if (/* Type(hint) !== 'String' || */ hint !== 'string' && hint !== 'number') { throw new $TypeError('Assertion failed: `hint` must be "string" or "number"'); } var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString']; for (var i = 0; i < methodNames.length; i += 1) { var name = methodNames[i]; var method = Get(O, name); if (IsCallable(method)) { var result = Call(method, O); if (Type(result) !== 'Object') { return result; } } } throw new $TypeError('No primitive value for ' + inspect(O)); };