'use strict'; var define = require('define-data-property'); var hasDescriptors = require('has-property-descriptors')(); var functionsHaveConfigurableNames = require('functions-have-names').functionsHaveConfigurableNames(); var $TypeError = require('es-errors/type'); /** @type {import('.')} */ module.exports = function setFunctionName(fn, name) { if (typeof fn !== 'function') { throw new $TypeError('`fn` is not a function'); } var loose = arguments.length > 2 && !!arguments[2]; if (!loose || functionsHaveConfigurableNames) { if (hasDescriptors) { define(/** @type {Parameters[0]} */ (fn), 'name', name, true, true); } else { define(/** @type {Parameters[0]} */ (fn), 'name', name); } } return fn; };