regexp-matchall.js
2.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
'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;