regexp-matchall.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. 'use strict';
  2. // var Construct = require('es-abstract/2021/Construct');
  3. var CreateRegExpStringIterator = require('es-abstract/2021/CreateRegExpStringIterator');
  4. var Get = require('es-abstract/2021/Get');
  5. var Set = require('es-abstract/2021/Set');
  6. var SpeciesConstructor = require('es-abstract/2021/SpeciesConstructor');
  7. var ToLength = require('es-abstract/2021/ToLength');
  8. var ToString = require('es-abstract/2021/ToString');
  9. var Type = require('es-abstract/2021/Type');
  10. var flagsGetter = require('regexp.prototype.flags');
  11. var callBound = require('call-bind/callBound');
  12. var $indexOf = callBound('String.prototype.indexOf');
  13. var OrigRegExp = RegExp;
  14. var supportsConstructingWithFlags = 'flags' in RegExp.prototype;
  15. var constructRegexWithFlags = function constructRegex(C, R) {
  16. var matcher;
  17. // workaround for older engines that lack RegExp.prototype.flags
  18. var flags = 'flags' in R ? Get(R, 'flags') : ToString(flagsGetter(R));
  19. if (supportsConstructingWithFlags && typeof flags === 'string') {
  20. matcher = new C(R, flags);
  21. } else if (C === OrigRegExp) {
  22. // workaround for older engines that can not construct a RegExp with flags
  23. matcher = new C(R.source, flags);
  24. } else {
  25. matcher = new C(R, flags);
  26. }
  27. return { flags: flags, matcher: matcher };
  28. };
  29. var regexMatchAll = function SymbolMatchAll(string) {
  30. var R = this;
  31. if (Type(R) !== 'Object') {
  32. throw new TypeError('"this" value must be an Object');
  33. }
  34. var S = ToString(string);
  35. var C = SpeciesConstructor(R, OrigRegExp);
  36. var tmp = constructRegexWithFlags(C, R);
  37. // var flags = ToString(Get(R, 'flags'));
  38. var flags = tmp.flags;
  39. // var matcher = Construct(C, [R, flags]);
  40. var matcher = tmp.matcher;
  41. var lastIndex = ToLength(Get(R, 'lastIndex'));
  42. Set(matcher, 'lastIndex', lastIndex, true);
  43. var global = $indexOf(flags, 'g') > -1;
  44. var fullUnicode = $indexOf(flags, 'u') > -1;
  45. return CreateRegExpStringIterator(matcher, S, global, fullUnicode);
  46. };
  47. var defineP = Object.defineProperty;
  48. var gOPD = Object.getOwnPropertyDescriptor;
  49. if (defineP && gOPD) {
  50. var desc = gOPD(regexMatchAll, 'name');
  51. if (desc && desc.configurable) {
  52. defineP(regexMatchAll, 'name', { value: '[Symbol.matchAll]' });
  53. }
  54. }
  55. module.exports = regexMatchAll;