From 3ff60cc0130a457e00e06f2730edb750cacb1819 Mon Sep 17 00:00:00 2001 From: Rob Hogan <2590098+robhogan@users.noreply.github.com> Date: Thu, 29 Oct 2026 10:33:01 +0000 Subject: [PATCH] Babel preset: Stop lowering named capturing groups for Hermes V1 Since #59580, a `u` regex with a named backreference directly followed by a digit fails Hermes compilation with `Invalid regular expression: Invalid escape`. `@babel/plugin-transform-named-capturing-groups-regex` rewrites `\k` as a numbered backreference without guarding a following digit, so `/(?.)\k1/u` becomes `/(.)\11/u`, a reference to group 11. Without the `u` flag, `\11` reads as a legacy octal escape, so non-`u` regexes compile but silently match the wrong thing. Hermes V1 supports named capturing groups natively, so the Hermes profiles stop lowering them, except for regexes that repeat a group name across alternatives, which Hermes doesn't support. Those still go through `@babel/plugin-transform-duplicate-named-capturing-groups-regex`. The `hermes-legacy` and `default` profiles keep the transform. Changelog: [General][Fixed] - Babel preset: Hermes V1 profiles no longer lower named capturing groups, fixing named backreferences followed by a digit --- .../react-native-babel-preset/package.json | 1 + .../__fixtures__/output/hermes-canary-dev.js | 9 +------ .../__fixtures__/output/hermes-canary-prod.js | 9 +------ .../hermes-stable-dev-preserve-async.js | 9 +------ ...ermes-stable-dev-preserve-block-scoping.js | 9 +------ ...ermes-stable-dev-preserve-class-private.js | 9 +------ ...ermes-stable-dev-preserve-destructuring.js | 9 +------ .../__fixtures__/output/hermes-stable-dev.js | 9 +------ ...-stable-prod-no-import-export-transform.js | 9 +------ .../__fixtures__/output/hermes-stable-prod.js | 9 +------ .../__fixtures__/output/no-babel-runtime.js | 9 +------ .../output/no-import-export-transform.js | 9 +------ .../output/with-babel-runtime-version.js | 7 +---- .../src/__tests__/transform-snapshot-test.js | 27 +++++++++++++++++-- .../src/configs/main.js | 17 +++++++++--- 15 files changed, 52 insertions(+), 99 deletions(-) diff --git a/packages/react-native-babel-preset/package.json b/packages/react-native-babel-preset/package.json index 13339db83765..331804f758ea 100644 --- a/packages/react-native-babel-preset/package.json +++ b/packages/react-native-babel-preset/package.json @@ -38,6 +38,7 @@ "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", "@babel/plugin-transform-flow-strip-types": "^7.25.2", "@babel/plugin-transform-modules-commonjs": "^7.24.8", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-dev.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-dev.js index f83cf11e1ad8..88cbf969d869 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-dev.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-dev.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -52,7 +50,6 @@ var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); var _jsxFileName = "/absolute/path/to/input.js"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -170,11 +167,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-prod.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-prod.js index 6fca4ae5e231..a2d295fe7a31 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-prod.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-canary-prod.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -51,7 +49,6 @@ var React = _react; var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -169,11 +166,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-async.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-async.js index 9a8c016f2891..fad95034dc71 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-async.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-async.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); var _react = _interopRequireWildcard(require("react")); @@ -49,7 +47,6 @@ var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); var _jsxFileName = "/absolute/path/to/input.js"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -153,11 +150,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-block-scoping.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-block-scoping.js index 606baf3d7ae4..421a25af37a8 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-block-scoping.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-block-scoping.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -52,7 +50,6 @@ var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); var _jsxFileName = "/absolute/path/to/input.js"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -170,11 +167,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - const regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + const regex = /(?\d{4})-(?\d{2})-(?\d{2})/; const match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-class-private.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-class-private.js index e55e53b67c87..071666e3aa61 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-class-private.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-class-private.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator")); var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator")); @@ -50,7 +48,6 @@ var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); var _jsxFileName = "/absolute/path/to/input.js"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } class Counter { #count = 0; static #instances = 0; @@ -156,11 +153,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-destructuring.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-destructuring.js index cf848bfe1c93..2890a554498b 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-destructuring.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev-preserve-destructuring.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -52,7 +50,6 @@ var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); var _jsxFileName = "/absolute/path/to/input.js"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -170,11 +167,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev.js index a7e009f818e7..da72ba231ce6 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-dev.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -52,7 +50,6 @@ var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); var _jsxFileName = "/absolute/path/to/input.js"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -170,11 +167,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod-no-import-export-transform.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod-no-import-export-transform.js index 8feaab05bc0b..01fea75517b7 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod-no-import-export-transform.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod-no-import-export-transform.js @@ -17,14 +17,11 @@ * - Options: {"dev":false,"unstable_transformProfile":"hermes-stable","disableImportExportTransform":true} */ -import _inherits from "@babel/runtime/helpers/inherits"; -import _setPrototypeOf from "@babel/runtime/helpers/setPrototypeOf"; import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase"; import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey"; import _awaitAsyncGenerator from "@babel/runtime/helpers/awaitAsyncGenerator"; import _wrapAsyncGenerator from "@babel/runtime/helpers/wrapAsyncGenerator"; -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } import * as React from 'react'; import { useEffect, useState } from 'react'; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; @@ -142,11 +139,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod.js index acf98b8fcada..3733535f42a9 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/hermes-stable-prod.js @@ -39,8 +39,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); -var _setPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/setPrototypeOf")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -51,7 +49,6 @@ var React = _react; var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), (0, _setPrototypeOf2.default)(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return (0, _inherits2.default)(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } var _count = (0, _classPrivateFieldLooseKey2.default)("count"); var _instances = (0, _classPrivateFieldLooseKey2.default)("instances"); var _increment = (0, _classPrivateFieldLooseKey2.default)("increment"); @@ -169,11 +166,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-babel-runtime.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-babel-runtime.js index e8a2d0845af6..ffa084c83561 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-babel-runtime.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-babel-runtime.js @@ -43,9 +43,6 @@ var React = _react; var _jsxRuntime = require("react/jsx-runtime"); var _dataUtils = require("./data-utils"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } -function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); } -function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } function _classPrivateFieldLooseBase(e, t) { if (!{}.hasOwnProperty.call(e, t)) throw new TypeError("attempted to use private field on non-instance"); return e; } @@ -173,11 +170,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-import-export-transform.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-import-export-transform.js index 4f903ac434b4..f40bc8a323cc 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-import-export-transform.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/no-import-export-transform.js @@ -17,14 +17,11 @@ * - Options: {"dev":false,"disableImportExportTransform":true} */ -import _inherits from "@babel/runtime/helpers/inherits"; -import _setPrototypeOf from "@babel/runtime/helpers/setPrototypeOf"; import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _classPrivateFieldLooseBase from "@babel/runtime/helpers/classPrivateFieldLooseBase"; import _classPrivateFieldLooseKey from "@babel/runtime/helpers/classPrivateFieldLooseKey"; import _awaitAsyncGenerator from "@babel/runtime/helpers/awaitAsyncGenerator"; import _wrapAsyncGenerator from "@babel/runtime/helpers/wrapAsyncGenerator"; -function _wrapRegExp() { _wrapRegExp = function (e, r) { return new BabelRegExp(e, void 0, r); }; var e = RegExp.prototype, r = new WeakMap(); function BabelRegExp(e, t, p) { var o = RegExp(e, t); return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype); } function buildGroups(e, t) { var p = r.get(t); return Object.keys(p).reduce(function (r, t) { var o = p[t]; if ("number" == typeof o) r[t] = e[o];else { for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++; r[t] = e[o[i]]; } return r; }, Object.create(null)); } return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) { var t = e.exec.call(this, r); if (t) { t.groups = buildGroups(t, this); var p = t.indices; p && (p.groups = buildGroups(p, this)); } return t; }, BabelRegExp.prototype[Symbol.replace] = function (t, p) { if ("string" == typeof p) { var o = r.get(this); return e[Symbol.replace].call(this, t, p.replace(/\$<([^>]+)(>|$)/g, function (e, r, t) { if ("" === t) return e; var p = o[r]; return Array.isArray(p) ? "$" + p.join("$") : "number" == typeof p ? "$" + p : ""; })); } if ("function" == typeof p) { var i = this; return e[Symbol.replace].call(this, t, function () { var e = arguments; return "object" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e); }); } return e[Symbol.replace].call(this, t, p); }, _wrapRegExp.apply(this, arguments); } import * as React from 'react'; import { useEffect, useState } from 'react'; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; @@ -142,11 +139,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = _wrapRegExp(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/with-babel-runtime-version.js b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/with-babel-runtime-version.js index 8a3aa5a780f9..35ea760c4a9e 100644 --- a/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/with-babel-runtime-version.js +++ b/packages/react-native-babel-preset/src/__tests__/__fixtures__/output/with-babel-runtime-version.js @@ -40,7 +40,6 @@ exports.parseDate = parseDate; exports.processUser = processUser; exports.safeJsonParse = safeJsonParse; exports.sumPairs = sumPairs; -var _wrapRegExp2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapRegExp")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseBase")); var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey")); @@ -167,11 +166,7 @@ function sumPairs(pairs) { return total; } function parseDate(dateString) { - var regex = (0, _wrapRegExp2.default)(/(\d{4})-(\d{2})-(\d{2})/, { - year: 1, - month: 2, - day: 3 - }); + var regex = /(?\d{4})-(?\d{2})-(?\d{2})/; var match = dateString.match(regex); if (match?.groups) { return { diff --git a/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js b/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js index ce821e690332..94d59b940666 100644 --- a/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js +++ b/packages/react-native-babel-preset/src/__tests__/transform-snapshot-test.js @@ -477,9 +477,32 @@ describe('react-native-babel-preset transform snapshots', () => { expect(result).not.toContain('/u'); }); - it('handles named capturing groups in regex', () => { + it('preserves named capturing groups with hermes-stable profile', () => { + const code = `const match = str.match(/(?.)\\k1/u);`; + const result = transformCode(code, { + dev: false, + unstable_transformProfile: 'hermes-stable', + }); + expect(result).toContain('/(?.)\\k1/u'); + expect(result).not.toContain('_wrapRegExp'); + }); + + it('transforms duplicate named capturing groups with hermes-stable profile', () => { + const code = `const match = str.match(/(?\\d{4})-\\d\\d|\\d\\d-(?\\d{4})/);`; + const result = transformCode(code, { + dev: false, + unstable_transformProfile: 'hermes-stable', + }); + expect(result).toContain('_wrapRegExp'); + expect(result).not.toContain('?'); + }); + + it('transforms named capturing groups with hermes-legacy profile', () => { const code = `const match = str.match(/(?\\d{4})-(?\\d{2})/);`; - const result = transformCode(code, {dev: false}); + const result = transformCode(code, { + dev: false, + unstable_transformProfile: 'hermes-legacy', + }); expect(result).toContain('_wrapRegExp'); }); diff --git a/packages/react-native-babel-preset/src/configs/main.js b/packages/react-native-babel-preset/src/configs/main.js index 70da8361dc96..546894560144 100644 --- a/packages/react-native-babel-preset/src/configs/main.js +++ b/packages/react-native-babel-preset/src/configs/main.js @@ -123,6 +123,10 @@ const getPreset = (src, options, babel) => { // escapes, which Babel would otherwise expand into explicit character ranges. const preserveUnicodeRegex = isHermesProfile; + // Hermes V1 supports named capturing groups natively, except for a name + // repeated across alternatives, i.e. `/(?\d{4})-\d\d|\d\d-(?\d{4})/`. + const preserveNamedCapturingGroups = isHermesProfile; + // Private fields can only be preserved when the surrounding class syntax is // also preserved. Babel's class transform requires the private transforms. const preserveClassPrivate = @@ -206,9 +210,16 @@ const getPreset = (src, options, babel) => { extraPlugins.push([require('@babel/plugin-transform-classes')]); } - extraPlugins.push([ - require('@babel/plugin-transform-named-capturing-groups-regex'), - ]); + if (preserveNamedCapturingGroups) { + // Lowers only regexes that repeat a group name. + extraPlugins.push([ + require('@babel/plugin-transform-duplicate-named-capturing-groups-regex'), + ]); + } else { + extraPlugins.push([ + require('@babel/plugin-transform-named-capturing-groups-regex'), + ]); + } if (!preserveDestructuring) { extraPlugins.push([