From 6dd0e032a1d6327dcf99498a4e458611f0fac313 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Tue, 2 Apr 2024 12:59:05 +0200 Subject: [PATCH] fix(babel-preset): deprecate `looseClassTransform` (#3042) --- .changeset/spotty-guests-explain.md | 5 ++++ .../package.json | 1 + .../src/index.js | 30 +++++++++++++++++-- yarn.lock | 1 + 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 .changeset/spotty-guests-explain.md diff --git a/.changeset/spotty-guests-explain.md b/.changeset/spotty-guests-explain.md new file mode 100644 index 000000000..c1f4b04c4 --- /dev/null +++ b/.changeset/spotty-guests-explain.md @@ -0,0 +1,5 @@ +--- +"@rnx-kit/babel-preset-metro-react-native": patch +--- + +Deprecate `looseClassTransform` diff --git a/packages/babel-preset-metro-react-native/package.json b/packages/babel-preset-metro-react-native/package.json index dc443e00d..cb9710aba 100644 --- a/packages/babel-preset-metro-react-native/package.json +++ b/packages/babel-preset-metro-react-native/package.json @@ -24,6 +24,7 @@ "test": "NODE_OPTIONS=--experimental-vm-modules rnx-kit-scripts test" }, "dependencies": { + "@rnx-kit/console": "^1.0.12", "babel-plugin-const-enum": "^1.0.0" }, "peerDependencies": { diff --git a/packages/babel-preset-metro-react-native/src/index.js b/packages/babel-preset-metro-react-native/src/index.js index c1418549a..5510f0160 100644 --- a/packages/babel-preset-metro-react-native/src/index.js +++ b/packages/babel-preset-metro-react-native/src/index.js @@ -25,6 +25,25 @@ * @typedef {MetroPresetOptions & RnxPresetOptions} PresetOptions */ +/** + * Converts version string to a number. + * @param {string} version + * @returns {number} + */ +function parseVersion(version) { + const [major, minor = 0] = version.split("."); + return Number(major) * 1000 + Number(minor); +} + +/** + * Returns whether Babel implements compiler assumptions. + * @param {ConfigAPI | undefined} api + * @returns {boolean} + */ +function hasCompilerAssumptions(api) { + return Boolean(api?.version && parseVersion(api.version) >= 7013); +} + /** * Returns plugin for transforming `const enum` if necessary. * @@ -36,8 +55,7 @@ function constEnumPlugin() { const { version, } = require("@babel/plugin-transform-typescript/package.json"); - const { [0]: major, [1]: minor } = version.split("."); - if (Number(major) * 1000 + Number(minor) >= 7015) { + if (parseVersion(version) >= 7015) { return []; } } catch (_) { @@ -136,7 +154,7 @@ function overridesFor(transformProfile, env) { * @type {(api?: ConfigAPI, opts?: PresetOptions) => TransformOptions} */ module.exports = ( - _, + api, { additionalPlugins, looseClassTransform, @@ -164,6 +182,12 @@ module.exports = ( }); if (looseClassTransform) { + if (hasCompilerAssumptions(api)) { + const { warn } = require("@rnx-kit/console"); + warn( + "`looseClassTransform` is deprecated — consider migrating to the top level assumptions for more granular control (see https://babeljs.io/docs/babel-plugin-transform-classes#loose)" + ); + } const pluginClasses = require.resolve("@babel/plugin-transform-classes", { paths: [babelPreset], }); diff --git a/yarn.lock b/yarn.lock index 58dcc47fd..1e522a8a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3549,6 +3549,7 @@ __metadata: "@babel/core": "npm:^7.20.0" "@babel/plugin-transform-typescript": "npm:^7.20.0" "@rnx-kit/babel-plugin-import-path-remapper": "npm:*" + "@rnx-kit/console": "npm:^1.0.12" "@rnx-kit/eslint-config": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*"