blob: 80a2d335f9a813053a7a25692538ee016c740887 [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');
4var hasSymbols = require('has-symbols/shams')();
5var hasToStringTag = hasSymbols && !!Symbol.toStringTag;
6var has;
7var $exec;
Tim van der Lippe16aca392020-11-13 11:37:13 +00008var isRegexMarker;
9var badStringifier;
10
11if (hasToStringTag) {
Tim van der Lippe2c891972021-07-29 16:22:50 +010012 has = callBound('Object.prototype.hasOwnProperty');
13 $exec = callBound('RegExp.prototype.exec');
Tim van der Lippe16aca392020-11-13 11:37:13 +000014 isRegexMarker = {};
15
16 var throwRegexMarker = function () {
17 throw isRegexMarker;
18 };
19 badStringifier = {
20 toString: throwRegexMarker,
21 valueOf: throwRegexMarker
22 };
23
24 if (typeof Symbol.toPrimitive === 'symbol') {
25 badStringifier[Symbol.toPrimitive] = throwRegexMarker;
26 }
27}
28
Tim van der Lippe2c891972021-07-29 16:22:50 +010029var $toString = callBound('Object.prototype.toString');
Tim van der Lippe16aca392020-11-13 11:37:13 +000030var gOPD = Object.getOwnPropertyDescriptor;
31var regexClass = '[object RegExp]';
32
33module.exports = hasToStringTag
34 // eslint-disable-next-line consistent-return
35 ? function isRegex(value) {
36 if (!value || typeof value !== 'object') {
37 return false;
38 }
39
40 var descriptor = gOPD(value, 'lastIndex');
Tim van der Lippe2c891972021-07-29 16:22:50 +010041 var hasLastIndexDataProperty = descriptor && has(descriptor, 'value');
Tim van der Lippe16aca392020-11-13 11:37:13 +000042 if (!hasLastIndexDataProperty) {
43 return false;
44 }
45
46 try {
Tim van der Lippe2c891972021-07-29 16:22:50 +010047 $exec(value, badStringifier);
Tim van der Lippe16aca392020-11-13 11:37:13 +000048 } catch (e) {
49 return e === isRegexMarker;
50 }
51 }
52 : function isRegex(value) {
53 // In older browsers, typeof regex incorrectly returns 'function'
54 if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
55 return false;
56 }
57
Tim van der Lippe2c891972021-07-29 16:22:50 +010058 return $toString(value) === regexClass;
Tim van der Lippe16aca392020-11-13 11:37:13 +000059 };