blob: 3db4b92389eb1b2703f75e87430de3759cda4b8e [file] [log] [blame]
Tim van der Lippe16aca392020-11-13 11:37:13 +00001'use strict';
2
3var hasSymbols = require('has-symbols')();
4var hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol';
5var hasOwnProperty;
6var regexExec;
7var isRegexMarker;
8var badStringifier;
9
10if (hasToStringTag) {
11 hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
12 regexExec = Function.call.bind(RegExp.prototype.exec);
13 isRegexMarker = {};
14
15 var throwRegexMarker = function () {
16 throw isRegexMarker;
17 };
18 badStringifier = {
19 toString: throwRegexMarker,
20 valueOf: throwRegexMarker
21 };
22
23 if (typeof Symbol.toPrimitive === 'symbol') {
24 badStringifier[Symbol.toPrimitive] = throwRegexMarker;
25 }
26}
27
28var toStr = Object.prototype.toString;
29var gOPD = Object.getOwnPropertyDescriptor;
30var regexClass = '[object RegExp]';
31
32module.exports = hasToStringTag
33 // eslint-disable-next-line consistent-return
34 ? function isRegex(value) {
35 if (!value || typeof value !== 'object') {
36 return false;
37 }
38
39 var descriptor = gOPD(value, 'lastIndex');
40 var hasLastIndexDataProperty = descriptor && hasOwnProperty(descriptor, 'value');
41 if (!hasLastIndexDataProperty) {
42 return false;
43 }
44
45 try {
46 regexExec(value, badStringifier);
47 } catch (e) {
48 return e === isRegexMarker;
49 }
50 }
51 : function isRegex(value) {
52 // In older browsers, typeof regex incorrectly returns 'function'
53 if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
54 return false;
55 }
56
57 return toStr.call(value) === regexClass;
58 };