UNPKG

2.18 kBJavaScriptView Raw
1var _Object$create = require("../core-js/object/create");
2
3var _Object$keys = require("../core-js/object/keys");
4
5var _typeof = require("../helpers/typeof");
6
7var _Symbol$replace = require("../core-js/symbol/replace");
8
9var _WeakMap = require("../core-js/weak-map");
10
11var wrapNativeSuper = require("./wrapNativeSuper");
12
13var getPrototypeOf = require("./getPrototypeOf");
14
15var possibleConstructorReturn = require("./possibleConstructorReturn");
16
17var inherits = require("./inherits");
18
19function _wrapRegExp(re, groups) {
20 module.exports = _wrapRegExp = function _wrapRegExp(re, groups) {
21 return new BabelRegExp(re, groups);
22 };
23
24 var _RegExp = wrapNativeSuper(RegExp);
25
26 var _super = RegExp.prototype;
27
28 var _groups = new _WeakMap();
29
30 function BabelRegExp(re, groups) {
31 var _this = _RegExp.call(this, re);
32
33 _groups.set(_this, groups);
34
35 return _this;
36 }
37
38 inherits(BabelRegExp, _RegExp);
39
40 BabelRegExp.prototype.exec = function (str) {
41 var result = _super.exec.call(this, str);
42
43 if (result) result.groups = buildGroups(result, this);
44 return result;
45 };
46
47 BabelRegExp.prototype[_Symbol$replace] = function (str, substitution) {
48 if (typeof substitution === "string") {
49 var groups = _groups.get(this);
50
51 return _super[_Symbol$replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
52 return "$" + groups[name];
53 }));
54 } else if (typeof substitution === "function") {
55 var _this = this;
56
57 return _super[_Symbol$replace].call(this, str, function () {
58 var args = [];
59 args.push.apply(args, arguments);
60
61 if (_typeof(args[args.length - 1]) !== "object") {
62 args.push(buildGroups(args, _this));
63 }
64
65 return substitution.apply(this, args);
66 });
67 } else {
68 return _super[_Symbol$replace].call(this, str, substitution);
69 }
70 };
71
72 function buildGroups(result, re) {
73 var g = _groups.get(re);
74
75 return _Object$keys(g).reduce(function (groups, name) {
76 groups[name] = result[g[name]];
77 return groups;
78 }, _Object$create(null));
79 }
80
81 return _wrapRegExp.apply(this, arguments);
82}
83
84module.exports = _wrapRegExp;
\No newline at end of file