| 'use strict'; |
| |
| var callBound = require('call-bind/callBound'); |
| var hasSymbols = require('has-symbols/shams')(); |
| var hasToStringTag = hasSymbols && !!Symbol.toStringTag; |
| var has; |
| var $exec; |
| var isRegexMarker; |
| var badStringifier; |
| |
| if (hasToStringTag) { |
| has = callBound('Object.prototype.hasOwnProperty'); |
| $exec = callBound('RegExp.prototype.exec'); |
| isRegexMarker = {}; |
| |
| var throwRegexMarker = function () { |
| throw isRegexMarker; |
| }; |
| badStringifier = { |
| toString: throwRegexMarker, |
| valueOf: throwRegexMarker |
| }; |
| |
| if (typeof Symbol.toPrimitive === 'symbol') { |
| badStringifier[Symbol.toPrimitive] = throwRegexMarker; |
| } |
| } |
| |
| var $toString = callBound('Object.prototype.toString'); |
| var gOPD = Object.getOwnPropertyDescriptor; |
| var regexClass = '[object RegExp]'; |
| |
| module.exports = hasToStringTag |
| // eslint-disable-next-line consistent-return |
| ? function isRegex(value) { |
| if (!value || typeof value !== 'object') { |
| return false; |
| } |
| |
| var descriptor = gOPD(value, 'lastIndex'); |
| var hasLastIndexDataProperty = descriptor && has(descriptor, 'value'); |
| if (!hasLastIndexDataProperty) { |
| return false; |
| } |
| |
| try { |
| $exec(value, badStringifier); |
| } catch (e) { |
| return e === isRegexMarker; |
| } |
| } |
| : function isRegex(value) { |
| // In older browsers, typeof regex incorrectly returns 'function' |
| if (!value || (typeof value !== 'object' && typeof value !== 'function')) { |
| return false; |
| } |
| |
| return $toString(value) === regexClass; |
| }; |