diff options
Diffstat (limited to 'node_modules/is-regex/index.js')
-rw-r--r-- | node_modules/is-regex/index.js | 70 |
1 files changed, 40 insertions, 30 deletions
diff --git a/node_modules/is-regex/index.js b/node_modules/is-regex/index.js index be6513390..b66d13e31 100644 --- a/node_modules/is-regex/index.js +++ b/node_modules/is-regex/index.js @@ -1,39 +1,49 @@ 'use strict'; -var has = require('has'); -var regexExec = RegExp.prototype.exec; -var gOPD = Object.getOwnPropertyDescriptor; - -var tryRegexExecCall = function tryRegexExec(value) { - try { - var lastIndex = value.lastIndex; - value.lastIndex = 0; - - regexExec.call(value); - return true; - } catch (e) { - return false; - } finally { - value.lastIndex = lastIndex; +var hasSymbols = require('has-symbols')(); +var hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol'; +var regexExec; +var isRegexMarker; +var badStringifier; + +if (hasToStringTag) { + regexExec = Function.call.bind(RegExp.prototype.exec); + isRegexMarker = {}; + + var throwRegexMarker = function () { + throw isRegexMarker; + }; + badStringifier = { + toString: throwRegexMarker, + valueOf: throwRegexMarker + }; + + if (typeof Symbol.toPrimitive === 'symbol') { + badStringifier[Symbol.toPrimitive] = throwRegexMarker; } -}; +} + var toStr = Object.prototype.toString; var regexClass = '[object RegExp]'; -var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol'; -module.exports = function isRegex(value) { - if (!value || typeof value !== 'object') { - return false; - } - if (!hasToStringTag) { - return toStr.call(value) === regexClass; - } +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 { + regexExec(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 tryRegexExecCall(value); -}; + return toStr.call(value) === regexClass; + }; |