blob: 76b3f88800cda5f38024b06147694ac4db890cae [file] [log] [blame]
'use strict';
var Call = require('es-abstract/2019/Call');
var Get = require('es-abstract/2019/Get');
var GetMethod = require('es-abstract/2019/GetMethod');
var IsRegExp = require('es-abstract/2019/IsRegExp');
var ToString = require('es-abstract/2019/ToString');
var RequireObjectCoercible = require('es-abstract/2019/RequireObjectCoercible');
var callBound = require('es-abstract/helpers/callBound');
var hasSymbols = require('has-symbols')();
var flagsGetter = require('regexp.prototype.flags');
var $indexOf = callBound('String.prototype.indexOf');
var regexpMatchAllPolyfill = require('./polyfill-regexp-matchall');
var getMatcher = function getMatcher(regexp) { // eslint-disable-line consistent-return
var matcherPolyfill = regexpMatchAllPolyfill();
if (hasSymbols && typeof Symbol.matchAll === 'symbol') {
var matcher = GetMethod(regexp, Symbol.matchAll);
if (matcher === RegExp.prototype[Symbol.matchAll] && matcher !== matcherPolyfill) {
return matcherPolyfill;
}
return matcher;
}
// fallback for pre-Symbol.matchAll environments
if (IsRegExp(regexp)) {
return matcherPolyfill;
}
};
module.exports = function matchAll(regexp) {
var O = RequireObjectCoercible(this);
if (typeof regexp !== 'undefined' && regexp !== null) {
var isRegExp = IsRegExp(regexp);
if (isRegExp) {
// workaround for older engines that lack RegExp.prototype.flags
var flags = 'flags' in regexp ? Get(regexp, 'flags') : flagsGetter(regexp);
RequireObjectCoercible(flags);
if ($indexOf(ToString(flags), 'g') < 0) {
throw new TypeError('matchAll requires a global regular expression');
}
}
var matcher = getMatcher(regexp);
if (typeof matcher !== 'undefined') {
return Call(matcher, regexp, [O]);
}
}
var S = ToString(O);
// var rx = RegExpCreate(regexp, 'g');
var rx = new RegExp(regexp, 'g');
return Call(getMatcher(rx), rx, [S]);
};