From 2d259f93be24a5db30a2d6696f2f941e5a2c816c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 4 Sep 2019 23:14:21 -0400 Subject: [PATCH 1/4] fix: transform name capturing regex once --- .../src/index.js | 3 ++- .../test/fixtures/runtime/issue-10393.js | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js b/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js index 042d16de9d4d..099bcfdc4e84 100644 --- a/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js @@ -28,9 +28,10 @@ export default function({ types: t }, options) { namedCapturingGroups && Object.keys(namedCapturingGroups).length > 0 ) { + const oldPattern = node.pattern; node.pattern = result.getSource(); - if (runtime && !isRegExpTest(path)) { + if (runtime && !isRegExpTest(path) && node.pattern !== oldPattern) { path.replaceWith( t.callExpression(this.addHelper("wrapRegExp"), [ node, diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js new file mode 100644 index 000000000000..5aee96bee734 --- /dev/null +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js @@ -0,0 +1,7 @@ +const regex = /(?<=a)(?[a]+?)/ + +const result = regex.exec("aa"); + +expect(result.groups).toEqual({ + a: "a" +}); From e5d5f293373b06909353198483af73797aaa0187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 5 Sep 2019 09:17:52 -0400 Subject: [PATCH 2/4] refactor: early return when pattern contains only lookbehind --- .../src/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js b/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js index 099bcfdc4e84..d646101852e0 100644 --- a/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/src/index.js @@ -12,7 +12,7 @@ export default function({ types: t }, options) { visitor: { RegExpLiteral(path) { const node = path.node; - if (node.pattern.indexOf("(?<") === -1) { + if (!/\(\?<(?![=!])/.test(node.pattern)) { // Return early if there are no named groups. // The .indexOf check may have false positives (e.g. /\(? 0 ) { - const oldPattern = node.pattern; node.pattern = result.getSource(); - if (runtime && !isRegExpTest(path) && node.pattern !== oldPattern) { + if (runtime && !isRegExpTest(path)) { path.replaceWith( t.callExpression(this.addHelper("wrapRegExp"), [ node, From 009bcec6cdf29a77406d2db5ac30cba58df75fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 5 Sep 2019 09:30:52 -0400 Subject: [PATCH 3/4] chore: simplify test regex --- .../test/fixtures/runtime/issue-10393.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js index 5aee96bee734..e12e576b6b0c 100644 --- a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js @@ -1,4 +1,4 @@ -const regex = /(?<=a)(?[a]+?)/ +const regex = /(?<=a)(?[a])/ const result = regex.exec("aa"); From 11971dddcc7e6cad77748fc4d99db3f3c7180ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 5 Sep 2019 10:12:52 -0400 Subject: [PATCH 4/4] chore: run test on >=8.0.0 --- .../fixtures/runtime/{issue-10393.js => issue-10393/exec.js} | 0 .../test/fixtures/runtime/issue-10393/options.json | 3 +++ 2 files changed, 3 insertions(+) rename packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/{issue-10393.js => issue-10393/exec.js} (100%) create mode 100644 packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393/options.json diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393/exec.js similarity index 100% rename from packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393.js rename to packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393/exec.js diff --git a/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393/options.json b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393/options.json new file mode 100644 index 000000000000..2454c2169cf8 --- /dev/null +++ b/packages/babel-plugin-transform-named-capturing-groups-regex/test/fixtures/runtime/issue-10393/options.json @@ -0,0 +1,3 @@ +{ + "minNodeVersion": "8.0.0" +}