blob: 19780f4b50a57002eabb65eecfaa6e6b70aefde3 [file] [log] [blame]
Tim van der Lippe16aca392020-11-13 11:37:13 +00001'use strict';
2
Tim van der Lippe2c891972021-07-29 16:22:50 +01003var callBound = require('call-bind/callBound');
Tim van der Lippebc3a0b72021-11-08 15:22:37 +00004var hasToStringTag = require('has-tostringtag/shams')();
Tim van der Lippe2c891972021-07-29 16:22:50 +01005var has;
6var $exec;
Tim van der Lippe16aca392020-11-13 11:37:13 +00007var isRegexMarker;
8var badStringifier;
9
10if (hasToStringTag) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010011 has = callBound('Object.prototype.hasOwnProperty');
12 $exec = callBound('RegExp.prototype.exec');
Tim van der Lippe16aca392020-11-13 11:37:13 +000013 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
Tim van der Lippe2c891972021-07-29 16:22:50 +010028var $toString = callBound('Object.prototype.toString');
Tim van der Lippe16aca392020-11-13 11:37:13 +000029var 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');
Tim van der Lippe2c891972021-07-29 16:22:50 +010040 var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
Tim van der Lippe16aca392020-11-13 11:37:13 +000041 if (!hasLastIndexDataProperty) {
42 return false;
43 }
44
45 try {
Tim van der Lippe2c891972021-07-29 16:22:50 +010046 $exec(value, badStringifier);
Tim van der Lippe16aca392020-11-13 11:37:13 +000047 } 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
Tim van der Lippe2c891972021-07-29 16:22:50 +010057 return $toString(value) === regexClass;
Tim van der Lippe16aca392020-11-13 11:37:13 +000058 };