e6667ae4beb7a33f1b6432c9e6d21d92a99e3997c58ce0cc9d9476ae19c7338e962c2eb03b2c0cb192ece8a310a596d60fcfe7dc364ca1e9d21a8c09057920 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = _wrapRegExp;
  6. var _setPrototypeOf = require("./setPrototypeOf.js");
  7. var _inherits = require("./inherits.js");
  8. function _wrapRegExp() {
  9. exports.default = _wrapRegExp = function (re, groups) {
  10. return new BabelRegExp(re, undefined, groups);
  11. };
  12. var _super = RegExp.prototype;
  13. var _groups = new WeakMap();
  14. function BabelRegExp(re, flags, groups) {
  15. var _this = new RegExp(re, flags);
  16. _groups.set(_this, groups || _groups.get(re));
  17. return (0, _setPrototypeOf.default)(_this, BabelRegExp.prototype);
  18. }
  19. (0, _inherits.default)(BabelRegExp, RegExp);
  20. BabelRegExp.prototype.exec = function (str) {
  21. var result = _super.exec.call(this, str);
  22. if (result) {
  23. result.groups = buildGroups(result, this);
  24. var indices = result.indices;
  25. if (indices) indices.groups = buildGroups(indices, this);
  26. }
  27. return result;
  28. };
  29. BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
  30. if (typeof substitution === "string") {
  31. var groups = _groups.get(this);
  32. return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)(>|$)/g, function (match, name, end) {
  33. if (end === "") {
  34. return match;
  35. } else {
  36. var group = groups[name];
  37. return Array.isArray(group) ? "$" + group.join("$") : typeof group === "number" ? "$" + group : "";
  38. }
  39. }));
  40. } else if (typeof substitution === "function") {
  41. var _this = this;
  42. return _super[Symbol.replace].call(this, str, function () {
  43. var args = arguments;
  44. if (typeof args[args.length - 1] !== "object") {
  45. args = [].slice.call(args);
  46. args.push(buildGroups(args, _this));
  47. }
  48. return substitution.apply(this, args);
  49. });
  50. } else {
  51. return _super[Symbol.replace].call(this, str, substitution);
  52. }
  53. };
  54. function buildGroups(result, re) {
  55. var g = _groups.get(re);
  56. return Object.keys(g).reduce(function (groups, name) {
  57. var i = g[name];
  58. if (typeof i === "number") groups[name] = result[i];else {
  59. var k = 0;
  60. while (result[i[k]] === undefined && k + 1 < i.length) {
  61. k++;
  62. }
  63. groups[name] = result[i[k]];
  64. }
  65. return groups;
  66. }, Object.create(null));
  67. }
  68. return _wrapRegExp.apply(this, arguments);
  69. }
  70. //# sourceMappingURL=wrapRegExp.js.map