'use strict'; // var Construct = require('es-abstract/2020/Construct'); var Get = require('es-abstract/2020/Get'); var Set = require('es-abstract/2020/Set'); var SpeciesConstructor = require('es-abstract/2020/SpeciesConstructor'); var ToLength = require('es-abstract/2020/ToLength'); var ToString = require('es-abstract/2020/ToString'); var Type = require('es-abstract/2020/Type'); var flagsGetter = require('regexp.prototype.flags'); var RegExpStringIterator = require('./helpers/RegExpStringIterator'); var OrigRegExp = RegExp; var CreateRegExpStringIterator = function CreateRegExpStringIterator(R, S, global, fullUnicode) { if (Type(S) !== 'String') { throw new TypeError('"S" value must be a String'); } if (Type(global) !== 'Boolean') { throw new TypeError('"global" value must be a Boolean'); } if (Type(fullUnicode) !== 'Boolean') { throw new TypeError('"fullUnicode" value must be a Boolean'); } var iterator = new RegExpStringIterator(R, S, global, fullUnicode); return iterator; }; var supportsConstructingWithFlags = 'flags' in RegExp.prototype; var constructRegexWithFlags = function constructRegex(C, R) { var matcher; // workaround for older engines that lack RegExp.prototype.flags var flags = 'flags' in R ? Get(R, 'flags') : ToString(flagsGetter(R)); if (supportsConstructingWithFlags && typeof flags === 'string') { matcher = new C(R, flags); } else if (C === OrigRegExp) { // workaround for older engines that can not construct a RegExp with flags matcher = new C(R.source, flags); } else { matcher = new C(R, flags); } return { flags: flags, matcher: matcher }; }; var regexMatchAll = function SymbolMatchAll(string) { var R = this; if (Type(R) !== 'Object') { throw new TypeError('"this" value must be an Object'); } var S = ToString(string); var C = SpeciesConstructor(R, OrigRegExp); var tmp = constructRegexWithFlags(C, R); // var flags = ToString(Get(R, 'flags')); var flags = tmp.flags; // var matcher = Construct(C, [R, flags]); var matcher = tmp.matcher; var lastIndex = ToLength(Get(R, 'lastIndex')); Set(matcher, 'lastIndex', lastIndex, true); var global = flags.indexOf('g') > -1; var fullUnicode = flags.indexOf('u') > -1; return CreateRegExpStringIterator(matcher, S, global, fullUnicode); }; var defineP = Object.defineProperty; var gOPD = Object.getOwnPropertyDescriptor; if (defineP && gOPD) { var desc = gOPD(regexMatchAll, 'name'); if (desc && desc.configurable) { defineP(regexMatchAll, 'name', { value: '[Symbol.matchAll]' }); } } module.exports = regexMatchAll;