From a0e20ac5df7f41cd586e52f2fa568d8f8d92f6c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 26 Apr 2021 23:39:32 +0200 Subject: [PATCH] Simplify the `wrapRegExp` helper for named groups (#13201) --- .eslintrc.cjs | 2 + .../babel-helpers/src/helpers-generated.js | 8 ++ packages/babel-helpers/src/helpers.js | 73 ------------------- .../babel-helpers/src/helpers/wrapRegExp.js | 65 +++++++++++++++++ packages/babel-runtime-corejs2/package.json | 18 ++--- packages/babel-runtime-corejs3/package.json | 18 ++--- packages/babel-runtime/package.json | 18 ++--- 7 files changed, 102 insertions(+), 100 deletions(-) create mode 100644 packages/babel-helpers/src/helpers/wrapRegExp.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs index ca286559d9..0d49b275c6 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -116,6 +116,8 @@ module.exports = { rules: { "no-var": "off", "comma-dangle": "off", + "no-func-assign": "off", + "import/no-extraneous-dependencies": "off", }, }, { diff --git a/packages/babel-helpers/src/helpers-generated.js b/packages/babel-helpers/src/helpers-generated.js index b1e6e4e358..c3e523a7c1 100755 --- a/packages/babel-helpers/src/helpers-generated.js +++ b/packages/babel-helpers/src/helpers-generated.js @@ -29,3 +29,11 @@ const _typeof = { '\nexport default function _typeof(obj) {\n "@babel/helpers - typeof";\n if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj &&\n typeof Symbol === "function" &&\n obj.constructor === Symbol &&\n obj !== Symbol.prototype\n ? "symbol"\n : typeof obj;\n };\n }\n return _typeof(obj);\n}\n', ), }; + +export const wrapRegExp = { + minVersion: "7.2.6", + ast: () => + template.program.ast( + '\nimport setPrototypeOf from "setPrototypeOf";\nimport inherits from "inherits";\nexport default function _wrapRegExp() {\n _wrapRegExp = function (re, groups) {\n return new BabelRegExp(re, undefined, groups);\n };\n var _super = RegExp.prototype;\n var _groups = new WeakMap();\n function BabelRegExp(re, flags, groups) {\n var _this = new RegExp(re, flags);\n \n _groups.set(_this, groups || _groups.get(re));\n return setPrototypeOf(_this, BabelRegExp.prototype);\n }\n inherits(BabelRegExp, RegExp);\n BabelRegExp.prototype.exec = function (str) {\n var result = _super.exec.call(this, str);\n if (result) result.groups = buildGroups(result, this);\n return result;\n };\n BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {\n if (typeof substitution === "string") {\n var groups = _groups.get(this);\n return _super[Symbol.replace].call(\n this,\n str,\n substitution.replace(/\\$<([^>]+)>/g, function (_, name) {\n return "$" + groups[name];\n })\n );\n } else if (typeof substitution === "function") {\n var _this = this;\n return _super[Symbol.replace].call(this, str, function () {\n var args = arguments;\n \n if (typeof args[args.length - 1] !== "object") {\n args = [].slice.call(args);\n args.push(buildGroups(args, _this));\n }\n return substitution.apply(this, args);\n });\n } else {\n return _super[Symbol.replace].call(this, str, substitution);\n }\n };\n function buildGroups(result, re) {\n \n \n var g = _groups.get(re);\n return Object.keys(g).reduce(function (groups, name) {\n groups[name] = result[g[name]];\n return groups;\n }, Object.create(null));\n }\n return _wrapRegExp.apply(this, arguments);\n}\n', + ), +}; diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 269c23440c..12f21bcecc 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -2021,76 +2021,3 @@ if (!process.env.BABEL_8_BREAKING) { } `; } - -helpers.wrapRegExp = helper("7.2.6")` - import wrapNativeSuper from "wrapNativeSuper"; - import getPrototypeOf from "getPrototypeOf"; - import possibleConstructorReturn from "possibleConstructorReturn"; - import inherits from "inherits"; - - export default function _wrapRegExp(re, groups) { - _wrapRegExp = function(re, groups) { - return new BabelRegExp(re, undefined, groups); - }; - - var _RegExp = wrapNativeSuper(RegExp); - var _super = RegExp.prototype; - var _groups = new WeakMap(); - - function BabelRegExp(re, flags, groups) { - var _this = _RegExp.call(this, re, flags); - // if the regex is recreated with 'g' flag - _groups.set(_this, groups || _groups.get(re)); - return _this; - } - inherits(BabelRegExp, _RegExp); - - BabelRegExp.prototype.exec = function(str) { - var result = _super.exec.call(this, str); - if (result) result.groups = buildGroups(result, this); - return result; - }; - BabelRegExp.prototype[Symbol.replace] = function(str, substitution) { - if (typeof substitution === "string") { - var groups = _groups.get(this); - return _super[Symbol.replace].call( - this, - str, - substitution.replace(/\\$<([^>]+)>/g, function(_, name) { - return "$" + groups[name]; - }) - ); - } else if (typeof substitution === "function") { - var _this = this; - return _super[Symbol.replace].call( - this, - str, - function() { - var args = []; - args.push.apply(args, arguments); - if (typeof args[args.length - 1] !== "object") { - // Modern engines already pass result.groups as the last arg. - args.push(buildGroups(args, _this)); - } - return substitution.apply(this, args); - } - ); - } else { - return _super[Symbol.replace].call(this, str, substitution); - } - } - - function buildGroups(result, re) { - // NOTE: This function should return undefined if there are no groups, - // but in that case Babel doesn't add the wrapper anyway. - - var g = _groups.get(re); - return Object.keys(g).reduce(function(groups, name) { - groups[name] = result[g[name]]; - return groups; - }, Object.create(null)); - } - - return _wrapRegExp.apply(this, arguments); - } -`; diff --git a/packages/babel-helpers/src/helpers/wrapRegExp.js b/packages/babel-helpers/src/helpers/wrapRegExp.js new file mode 100644 index 0000000000..d8e110af26 --- /dev/null +++ b/packages/babel-helpers/src/helpers/wrapRegExp.js @@ -0,0 +1,65 @@ +/* @minVersion 7.2.6 */ + +import setPrototypeOf from "setPrototypeOf"; +import inherits from "inherits"; + +export default function _wrapRegExp() { + _wrapRegExp = function (re, groups) { + return new BabelRegExp(re, undefined, groups); + }; + + var _super = RegExp.prototype; + var _groups = new WeakMap(); + + function BabelRegExp(re, flags, groups) { + var _this = new RegExp(re, flags); + // if the regex is recreated with 'g' flag + _groups.set(_this, groups || _groups.get(re)); + return setPrototypeOf(_this, BabelRegExp.prototype); + } + inherits(BabelRegExp, RegExp); + + BabelRegExp.prototype.exec = function (str) { + var result = _super.exec.call(this, str); + if (result) result.groups = buildGroups(result, this); + return result; + }; + BabelRegExp.prototype[Symbol.replace] = function (str, substitution) { + if (typeof substitution === "string") { + var groups = _groups.get(this); + return _super[Symbol.replace].call( + this, + str, + substitution.replace(/\$<([^>]+)>/g, function (_, name) { + return "$" + groups[name]; + }) + ); + } else if (typeof substitution === "function") { + var _this = this; + return _super[Symbol.replace].call(this, str, function () { + var args = arguments; + // Modern engines already pass result.groups returned by exec() as the last arg. + if (typeof args[args.length - 1] !== "object") { + args = [].slice.call(args); + args.push(buildGroups(args, _this)); + } + return substitution.apply(this, args); + }); + } else { + return _super[Symbol.replace].call(this, str, substitution); + } + }; + + function buildGroups(result, re) { + // NOTE: This function should return undefined if there are no groups, + // but in that case Babel doesn't add the wrapper anyway. + + var g = _groups.get(re); + return Object.keys(g).reduce(function (groups, name) { + groups[name] = result[g[name]]; + return groups; + }, Object.create(null)); + } + + return _wrapRegExp.apply(this, arguments); +} diff --git a/packages/babel-runtime-corejs2/package.json b/packages/babel-runtime-corejs2/package.json index 78672d7451..df25bd36d8 100644 --- a/packages/babel-runtime-corejs2/package.json +++ b/packages/babel-runtime-corejs2/package.json @@ -45,6 +45,15 @@ "./helpers/typeof.js" ], "./helpers/esm/typeof": "./helpers/esm/typeof.js", + "./helpers/wrapRegExp": [ + { + "node": "./helpers/wrapRegExp.js", + "import": "./helpers/esm/wrapRegExp.js", + "default": "./helpers/wrapRegExp.js" + }, + "./helpers/wrapRegExp.js" + ], + "./helpers/esm/wrapRegExp": "./helpers/esm/wrapRegExp.js", "./helpers/asyncIterator": [ { "node": "./helpers/asyncIterator.js", @@ -801,15 +810,6 @@ "./helpers/classPrivateMethodSet.js" ], "./helpers/esm/classPrivateMethodSet": "./helpers/esm/classPrivateMethodSet.js", - "./helpers/wrapRegExp": [ - { - "node": "./helpers/wrapRegExp.js", - "import": "./helpers/esm/wrapRegExp.js", - "default": "./helpers/wrapRegExp.js" - }, - "./helpers/wrapRegExp.js" - ], - "./helpers/esm/wrapRegExp": "./helpers/esm/wrapRegExp.js", "./package": "./package.json", "./package.json": "./package.json", "./regenerator": "./regenerator/index.js", diff --git a/packages/babel-runtime-corejs3/package.json b/packages/babel-runtime-corejs3/package.json index debff3348b..249ecaa49d 100644 --- a/packages/babel-runtime-corejs3/package.json +++ b/packages/babel-runtime-corejs3/package.json @@ -44,6 +44,15 @@ "./helpers/typeof.js" ], "./helpers/esm/typeof": "./helpers/esm/typeof.js", + "./helpers/wrapRegExp": [ + { + "node": "./helpers/wrapRegExp.js", + "import": "./helpers/esm/wrapRegExp.js", + "default": "./helpers/wrapRegExp.js" + }, + "./helpers/wrapRegExp.js" + ], + "./helpers/esm/wrapRegExp": "./helpers/esm/wrapRegExp.js", "./helpers/asyncIterator": [ { "node": "./helpers/asyncIterator.js", @@ -800,15 +809,6 @@ "./helpers/classPrivateMethodSet.js" ], "./helpers/esm/classPrivateMethodSet": "./helpers/esm/classPrivateMethodSet.js", - "./helpers/wrapRegExp": [ - { - "node": "./helpers/wrapRegExp.js", - "import": "./helpers/esm/wrapRegExp.js", - "default": "./helpers/wrapRegExp.js" - }, - "./helpers/wrapRegExp.js" - ], - "./helpers/esm/wrapRegExp": "./helpers/esm/wrapRegExp.js", "./package": "./package.json", "./package.json": "./package.json", "./regenerator": "./regenerator/index.js", diff --git a/packages/babel-runtime/package.json b/packages/babel-runtime/package.json index 564a9357ce..4f22ae307f 100644 --- a/packages/babel-runtime/package.json +++ b/packages/babel-runtime/package.json @@ -44,6 +44,15 @@ "./helpers/typeof.js" ], "./helpers/esm/typeof": "./helpers/esm/typeof.js", + "./helpers/wrapRegExp": [ + { + "node": "./helpers/wrapRegExp.js", + "import": "./helpers/esm/wrapRegExp.js", + "default": "./helpers/wrapRegExp.js" + }, + "./helpers/wrapRegExp.js" + ], + "./helpers/esm/wrapRegExp": "./helpers/esm/wrapRegExp.js", "./helpers/asyncIterator": [ { "node": "./helpers/asyncIterator.js", @@ -800,15 +809,6 @@ "./helpers/classPrivateMethodSet.js" ], "./helpers/esm/classPrivateMethodSet": "./helpers/esm/classPrivateMethodSet.js", - "./helpers/wrapRegExp": [ - { - "node": "./helpers/wrapRegExp.js", - "import": "./helpers/esm/wrapRegExp.js", - "default": "./helpers/wrapRegExp.js" - }, - "./helpers/wrapRegExp.js" - ], - "./helpers/esm/wrapRegExp": "./helpers/esm/wrapRegExp.js", "./package": "./package.json", "./package.json": "./package.json", "./regenerator": "./regenerator/index.js",