123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 'use strict';
- /* eslint-disable es-x/no-string-prototype-matchall -- safe */
- var $ = require('../internals/export');
- var global = require('../internals/global');
- var call = require('../internals/function-call');
- var uncurryThis = require('../internals/function-uncurry-this');
- var createIteratorConstructor = require('../internals/create-iterator-constructor');
- var requireObjectCoercible = require('../internals/require-object-coercible');
- var toLength = require('../internals/to-length');
- var toString = require('../internals/to-string');
- var anObject = require('../internals/an-object');
- var classof = require('../internals/classof-raw');
- var isPrototypeOf = require('../internals/object-is-prototype-of');
- var isRegExp = require('../internals/is-regexp');
- var regExpFlags = require('../internals/regexp-flags');
- var getMethod = require('../internals/get-method');
- var redefine = require('../internals/redefine');
- var fails = require('../internals/fails');
- var wellKnownSymbol = require('../internals/well-known-symbol');
- var speciesConstructor = require('../internals/species-constructor');
- var advanceStringIndex = require('../internals/advance-string-index');
- var regExpExec = require('../internals/regexp-exec-abstract');
- var InternalStateModule = require('../internals/internal-state');
- var IS_PURE = require('../internals/is-pure');
- var MATCH_ALL = wellKnownSymbol('matchAll');
- var REGEXP_STRING = 'RegExp String';
- var REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';
- var setInternalState = InternalStateModule.set;
- var getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);
- var RegExpPrototype = RegExp.prototype;
- var TypeError = global.TypeError;
- var getFlags = uncurryThis(regExpFlags);
- var stringIndexOf = uncurryThis(''.indexOf);
- var un$MatchAll = uncurryThis(''.matchAll);
- var WORKS_WITH_NON_GLOBAL_REGEX = !!un$MatchAll && !fails(function () {
- un$MatchAll('a', /./);
- });
- var $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, $global, fullUnicode) {
- setInternalState(this, {
- type: REGEXP_STRING_ITERATOR,
- regexp: regexp,
- string: string,
- global: $global,
- unicode: fullUnicode,
- done: false
- });
- }, REGEXP_STRING, function next() {
- var state = getInternalState(this);
- if (state.done) return { value: undefined, done: true };
- var R = state.regexp;
- var S = state.string;
- var match = regExpExec(R, S);
- if (match === null) return { value: undefined, done: state.done = true };
- if (state.global) {
- if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);
- return { value: match, done: false };
- }
- state.done = true;
- return { value: match, done: false };
- });
- var $matchAll = function (string) {
- var R = anObject(this);
- var S = toString(string);
- var C, flagsValue, flags, matcher, $global, fullUnicode;
- C = speciesConstructor(R, RegExp);
- flagsValue = R.flags;
- if (flagsValue === undefined && isPrototypeOf(RegExpPrototype, R) && !('flags' in RegExpPrototype)) {
- flagsValue = getFlags(R);
- }
- flags = flagsValue === undefined ? '' : toString(flagsValue);
- matcher = new C(C === RegExp ? R.source : R, flags);
- $global = !!~stringIndexOf(flags, 'g');
- fullUnicode = !!~stringIndexOf(flags, 'u');
- matcher.lastIndex = toLength(R.lastIndex);
- return new $RegExpStringIterator(matcher, S, $global, fullUnicode);
- };
- // `String.prototype.matchAll` method
- // https://tc39.es/ecma262/#sec-string.prototype.matchall
- $({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {
- matchAll: function matchAll(regexp) {
- var O = requireObjectCoercible(this);
- var flags, S, matcher, rx;
- if (regexp != null) {
- if (isRegExp(regexp)) {
- flags = toString(requireObjectCoercible('flags' in RegExpPrototype
- ? regexp.flags
- : getFlags(regexp)
- ));
- if (!~stringIndexOf(flags, 'g')) throw TypeError('`.matchAll` does not allow non-global regexes');
- }
- if (WORKS_WITH_NON_GLOBAL_REGEX) return un$MatchAll(O, regexp);
- matcher = getMethod(regexp, MATCH_ALL);
- if (matcher === undefined && IS_PURE && classof(regexp) == 'RegExp') matcher = $matchAll;
- if (matcher) return call(matcher, regexp, O);
- } else if (WORKS_WITH_NON_GLOBAL_REGEX) return un$MatchAll(O, regexp);
- S = toString(O);
- rx = new RegExp(regexp, 'g');
- return IS_PURE ? call($matchAll, rx, S) : rx[MATCH_ALL](S);
- }
- });
- IS_PURE || MATCH_ALL in RegExpPrototype || redefine(RegExpPrototype, MATCH_ALL, $matchAll);
|