diff --git a/babel.config.js b/babel.config.js index a9b0a70a897..e70c85612eb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -27,46 +27,6 @@ function traceTransformer() { }; } -/** - * Setting targets to node 20 to reduce JS bundle size - * It is also recommended by babel: - * https://babeljs.io/docs/options#no-targets - */ -const defaultPresetsForWeb = ['@babel/preset-react', ['@babel/preset-env', {targets: {node: 20}}], '@babel/preset-flow', '@babel/preset-typescript']; -const defaultPluginsForWeb = [ - ['babel-plugin-react-compiler', ReactCompilerConfig], // must run first! - // Adding the commonjs: true option to react-native-web plugin can cause styling conflicts - ['react-native-web'], - - '@babel/transform-runtime', - '@babel/plugin-proposal-class-properties', - ['@babel/plugin-transform-object-rest-spread', {useBuiltIns: true, loose: true}], - - // We use `@babel/plugin-transform-class-properties` for transforming ReactNative libraries and do not use it for our own - // source code transformation as we do not use class property assignment. - '@babel/plugin-transform-class-properties', - '@babel/plugin-proposal-export-namespace-from', - // Keep it last - 'react-native-worklets/plugin', - '@babel/plugin-transform-export-namespace-from', -]; - -defaultPluginsForWeb.push([ - '@fullstory/babel-plugin-annotate-react', - { - native: true, - }, -]); - -if (process.env.DEBUG_BABEL_TRACE) { - defaultPluginsForWeb.push(traceTransformer); -} - -const web = { - presets: defaultPresetsForWeb, - plugins: defaultPluginsForWeb, -}; - const metro = { presets: [require('@react-native/babel-preset')], plugins: [ @@ -181,13 +141,12 @@ module.exports = (api) => { } // For `react-native` (iOS/Android) caller will be "metro" - // For the web build (Rspack) caller will be "babel-loader" // For jest, it will be babel-jest - // For `storybook` there won't be any config at all so we must give default argument of an empty object + // The web build and Storybook (Rsbuild) don't call into this file at all const runningIn = api.caller((args = {}) => args.name); if (!process.env.KNIP) { console.debug(' - running in: ', runningIn); } - return ['metro', 'babel-jest'].includes(runningIn) ? metro : web; + return ['metro', 'babel-jest'].includes(runningIn) ? metro : {}; }; diff --git a/config/eslint/eslint.config.mjs b/config/eslint/eslint.config.mjs index 01e5e3fc2a6..35211984149 100644 --- a/config/eslint/eslint.config.mjs +++ b/config/eslint/eslint.config.mjs @@ -534,6 +534,14 @@ const config = defineConfig([ }, }, + // Rspack loaders receive their `this` from the bundler, and it's standard practice to use it + { + files: ['config/rsbuild/loaders/*-loader.mjs'], + rules: { + 'no-invalid-this': 'off', + }, + }, + { files: ['**/en.ts', '**/es.ts'], rules: { diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index eff56e32e3c..a433a09d9c4 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -2321,5 +2321,6 @@ "../../tests/utils/getIsUsingFakeTimers.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../rsbuild/CustomVersionFilePlugin.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../rsbuild/ModuleInitTimingPlugin.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../rsbuild/loaders/fullstory-annotation-loader.mjs" "rulesdir/no-negated-variables" 1 "../rsbuild/rsbuild.common.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../rspack/RspackPreloadPlugin.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 diff --git a/config/rsbuild/loaders/fullstory-annotation-loader.mjs b/config/rsbuild/loaders/fullstory-annotation-loader.mjs new file mode 100644 index 00000000000..6008eb913d5 --- /dev/null +++ b/config/rsbuild/loaders/fullstory-annotation-loader.mjs @@ -0,0 +1,42 @@ +/** + * Thin wrapper around the upstream @fullstory/babel-plugin-annotate-react plugin, invoked directly via @babel/core rather than + * going through babel-loader. + * + * It is an optimization. Two filters skip Babel entirely when a file cannot possibly contain JSX: + * - `.ts` files: TypeScript's grammar disallows JSX syntax outside `.tsx` + * - All other extensions (.tsx, .jsx, .js): fall back to a `source.includes('<')`, a quick check for JSX + */ + +import babel from '@babel/core'; +import path from 'node:path'; + +export default function fullstoryAnnotationLoader(source) { + const ext = path.extname(this.resourcePath); + if (ext === '.ts') { + return source; + } + if (!source.includes('<')) { + return source; + } + + const callback = this.async(); + babel.transform( + source, + { + babelrc: false, + configFile: false, + filename: this.resourcePath, + plugins: [['@fullstory/babel-plugin-annotate-react', {native: true, reactCompiler: true}]], + parserOpts: {plugins: ['jsx', 'typescript']}, + sourceMaps: !!this.sourceMap, + }, + (error, result) => { + if (error) { + callback(error); + return; + } + callback(null, result.code, result.map ?? undefined); + }, + ); + return undefined; +} diff --git a/config/rsbuild/loaders/oxc-react-compiler-loader.mjs b/config/rsbuild/loaders/oxc-react-compiler-loader.mjs new file mode 100644 index 00000000000..e36b63ee359 --- /dev/null +++ b/config/rsbuild/loaders/oxc-react-compiler-loader.mjs @@ -0,0 +1,78 @@ +/** + * Thin wrapper around oxc-transform that adds React Compiler support while + * demoting non-fatal React Compiler diagnostics from hard build errors to + * webpack warnings. + * + * This works around oxc-project/oxc#23587 (fixed in a future + * release), which caused the build to fail instead of bailing out on components + * that violate the Rules of React — the same behaviour as babel-plugin-react-compiler. + * We need the workaround for now until a new oxc release containing the fix adds back `reactCompiler`. + */ + +import path from 'node:path'; +import {transform} from 'oxc-transform'; + +function getLang(ext) { + if (ext === 'tsx') { + return 'tsx'; + } + if (ext === 'ts') { + return 'ts'; + } + // JSX is legal syntax in plain .js files too (both rules that route here match .js and .jsx + // identically), so .js gets the same JSX-enabled parser as .jsx rather than a stricter one. + return 'jsx'; +} + +export default async function oxcReactCompilerLoader(source) { + const callback = this.async(); + try { + const options = this.getOptions() || {}; + const sourceMaps = options.sourcemap !== undefined ? options.sourcemap : !!this.sourceMap; + + const resourcePath = this.resourcePath; + const ext = path.extname(resourcePath).slice(1); + const lang = getLang(ext); + + const transformOptions = { + lang, + target: options.target, + jsx: options.jsx, + reactCompiler: options.reactCompiler, + sourcemap: sourceMaps, + cwd: this.rootContext, + }; + + let result = await transform(resourcePath, source, transformOptions); + + // Demote React Compiler diagnostics to webpack warnings instead of + // hard errors (workaround for oxc-project/oxc#23587). + const rcErrors = (result.errors || []).filter((e) => e.message && e.message.includes('[ReactCompiler]')); + const fatalErrors = (result.errors || []).filter((e) => !e.message?.includes('[ReactCompiler]')); + + for (const e of rcErrors) { + this.emitWarning(new Error(`oxc-react-compiler-loader: ${e.message}`)); + } + + if (fatalErrors.length > 0) { + const msg = fatalErrors.map((e) => `${e.message}${e.codeframe ? `\n${e.codeframe}` : ''}`).join('\n\n'); + callback(new Error(`Oxc transform errors:\n${msg}`)); + return; + } + + // A React Compiler error makes oxc-transform bail out + // of the whole transform and return empty code, not just skip the optimization. + // Re-run without the compiler to fall back to plain JSX/TS transform output. + if (!result.code && rcErrors.length > 0) { + result = await transform(resourcePath, source, {...transformOptions, reactCompiler: false}); + } + + if (sourceMaps && result.map) { + callback(null, result.code, result.map); + } else { + callback(null, result.code); + } + } catch (err) { + callback(err); + } +} diff --git a/config/rsbuild/loaders/worklets-loader.mjs b/config/rsbuild/loaders/worklets-loader.mjs new file mode 100644 index 00000000000..b777b963d36 --- /dev/null +++ b/config/rsbuild/loaders/worklets-loader.mjs @@ -0,0 +1,35 @@ +/** + * Thin wrapper around react-native-worklets/plugin that skips babel entirely for the ~97.5% of files that don't contain worklets. + */ + +import babel from '@babel/core'; + +function referencesWorklet(source) { + return source.includes('react-native-reanimated') || source.includes('worklet'); +} + +export default function workletsLoader(source) { + if (!referencesWorklet(source)) { + return source; + } + + const callback = this.async(); + babel.transform( + source, + { + babelrc: false, + configFile: false, + filename: this.resourcePath, + plugins: ['react-native-worklets/plugin'], + sourceMaps: !!this.sourceMap, + }, + (error, result) => { + if (error) { + callback(error); + return; + } + callback(null, result.code, result.map ?? undefined); + }, + ); + return undefined; +} diff --git a/config/rsbuild/rsbuild.common.ts b/config/rsbuild/rsbuild.common.ts index 72e831d0202..bc870aa6322 100644 --- a/config/rsbuild/rsbuild.common.ts +++ b/config/rsbuild/rsbuild.common.ts @@ -2,7 +2,6 @@ import type {RsbuildConfig} from '@rsbuild/core'; import type {DefinePluginOptions, RspackPluginInstance, SwcJsMinimizerRspackPluginOptions} from '@rspack/core'; import {GenerateSW} from '@aaroon/workbox-rspack-plugin'; -import {pluginBabel} from '@rsbuild/plugin-babel'; import {pluginSvgr} from '@rsbuild/plugin-svgr'; import {RsdoctorRspackPlugin} from '@rsdoctor/rspack-plugin'; import {rspack} from '@rspack/core'; @@ -39,38 +38,56 @@ function getCurrentBranchName(): string { const localBranchName = getCurrentBranchName(); +/** + * React Compiler + react-native-worklets loaders. + */ +function getOxcAndWorkletsLoaders() { + return [ + {loader: path.resolve(dirname, './loaders/worklets-loader.mjs')}, + { + loader: path.resolve(dirname, './loaders/oxc-react-compiler-loader.mjs'), + options: { + reactCompiler: {target: '19', panicThreshold: 'none'}, + target: 'node20', + jsx: {runtime: 'automatic'}, + }, + }, + ]; +} + /** * These RN packages ship non-transpiled JSX and rely on the "react-native" import (aliased to - * react-native-web below), so they need to go through the same babel-loader pipeline as our own - * source rather than being treated as opaque, already-built node_modules. + * react-native-web below), so they need to go through the same OXC transform pipeline as our own + * source rather than being treated as opaque. */ -const includeModules = new RegExp( - `node_modules/(?!(${[ - 'react-native-reanimated', - 'react-native-worklets', - 'react-native-picker-select', - 'react-native-web', - 'react-native-webview', - '@react-native-picker', - '@react-navigation/material-top-tabs', - '@react-navigation/native', - '@react-navigation/native-stack', - '@react-navigation/stack', - 'react-native-gesture-handler', - 'react-native-google-places-autocomplete', - 'react-native-qrcode-svg', - 'react-native-view-shot', - '@react-native/assets', - 'expo', - 'expo-audio', - 'expo-video', - 'expo-image', - 'expo-image-manipulator', - 'expo-modules-core', - 'victory-native', - '@shopify/react-native-skia', - ].join('|')})/).*|\\.native\\.(js|jsx|ts|tsx)$`, -); +const INCLUDED_NODE_MODULES = [ + 'react-native-reanimated', + 'react-native-worklets', + 'react-native-picker-select', + 'react-native-web', + 'react-native-webview', + '@react-native-picker', + '@react-navigation/material-top-tabs', + '@react-navigation/native', + '@react-navigation/native-stack', + '@react-navigation/stack', + 'react-native-gesture-handler', + 'react-native-google-places-autocomplete', + 'react-native-qrcode-svg', + 'react-native-view-shot', + '@react-native/assets', + 'expo', + 'expo-audio', + 'expo-video', + 'expo-image', + 'expo-image-manipulator', + 'expo-modules-core', + 'victory-native', + '@shopify/react-native-skia', +]; + +// Matches node_modules paths that are in the allowlist above +const includedNodeModulesRegex = new RegExp(`node_modules/(${INCLUDED_NODE_MODULES.join('|')})`); const environmentToLogoSuffixMap: Record = { production: '-dark', @@ -114,7 +131,7 @@ function getDefineValues(file: string): DefinePluginOptions { /** * Config shared between the main app build (below) and Storybook (via - * `.storybook/rsbuild.config.ts`): source defines, module resolution, and the SVG/babel loader + * `.storybook/rsbuild.config.ts`): source defines, module resolution, and the SVG/OXC transform * pipeline. Deliberately excludes anything that assumes a single-page `web/index.html` app shell * (HTML template, service worker, Sentry release upload, static asset copying), since Storybook * manages its own HTML/output and isn't a deployable release of the app. @@ -162,18 +179,17 @@ const getSharedConfiguration = ({file = '.env'}: Environment): RsbuildConfig => svgrOptions: {exportType: 'default'}, exclude: /node_modules/, }), - pluginBabel({ - include: /\.(js|ts)x?$/, - exclude: [includeModules], - babelLoaderOptions: { - configFile: path.resolve(dirname, '../../babel.config.js'), - babelrc: false, - presets: [], - plugins: [], - }, - }), ], tools: { + // Skip default .js loader that strips JSX/TypeScript and breaks Fullstory/React Compiler transforms we add later via rules + bundlerChain: (chain) => { + chain.module + .rule('js') + .oneOf('js') + .exclude.add((resourcePath: string) => !resourcePath.includes('node_modules')) + .add(includedNodeModulesRegex) + .end(); + }, rspack: (config, {addRules}) => { // canvaskit-wasm and expo's getBundleUrl.web.ts reference __filename/__dirname, which don't // exist in a browser bundle. Rspack's default ('warn-mock') mocks them to a fixed value but @@ -187,8 +203,21 @@ const getSharedConfiguration = ({file = '.env'}: Environment): RsbuildConfig => }; // We can ignore the "module not installed" warning from lottie-react-native because we // are not using the library for JSON format of Lottie animations. + // We also ignore React Compiler errors - they're deliberately warnings, not errors. + // eslint-disable-next-line no-param-reassign + config.ignoreWarnings = [...(config.ignoreWarnings ?? []), /lottie-react-native\/lib\/module\/LottieView\/index\.web\.js/, /oxc-react-compiler-loader:/]; + + // Cache rules: + // - Onyx and react-native-live-markdown can be modified on the fly, changes to other node_modules are not reflected live + // - Applies to `dev`, `build`, and Storybook alike // eslint-disable-next-line no-param-reassign - config.ignoreWarnings = [...(config.ignoreWarnings ?? []), /lottie-react-native\/lib\/module\/LottieView\/index\.web\.js/]; + config.cache ??= {type: 'persistent'}; + if (typeof config.cache === 'object' && config.cache.type === 'persistent') { + // eslint-disable-next-line no-param-reassign + config.cache.snapshot = { + managedPaths: [/([\\/]node_modules[\\/](?!react-native-onyx|@expensify\/react-native-live-markdown))/], + }; + } // eslint-disable-next-line no-param-reassign config.resolve ??= {}; @@ -234,6 +263,27 @@ const getSharedConfiguration = ({file = '.env'}: Environment): RsbuildConfig => resolve: {fullySpecified: false}, include: [path.resolve(dirname, '../../node_modules/react-native-tab-view/lib/module/TabView.js')], }, + // App source files (React Compiler enabled). + { + test: /\.(js|ts)x?$/, + // Exclude ALL node_modules (including the included-node_modules allowlist, handled below). + exclude: [/node_modules/, /\.native\.(js|jsx|ts|tsx)$/], + use: [ + ...getOxcAndWorkletsLoaders(), + // Fullstory annotation. + { + loader: path.resolve(dirname, './loaders/fullstory-annotation-loader.mjs'), + }, + ], + }, + // Included node_modules: Same OXC + React Compiler pass as app source above, + // minus the Fullstory pass, which only makes sense for our own components. + { + test: /\.(js|ts)x?$/, + include: [includedNodeModulesRegex], + exclude: [/\.native\.(js|jsx|ts|tsx)$/], + use: getOxcAndWorkletsLoaders(), + }, ]); return config; @@ -368,6 +418,7 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment): }, }, tools: { + bundlerChain: shared.tools?.bundlerChain, rspack: (config, utils) => { // `sharedRspackTool`'s declared return type includes `Promise` because // that's a valid shape for `tools.rspack` in general, but `getSharedConfiguration`'s own @@ -500,4 +551,4 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment): }; export default getCommonConfiguration; -export {getDefineValues, getSharedConfiguration, includeModules}; +export {getDefineValues, getSharedConfiguration}; diff --git a/config/rsbuild/rsbuild.config.ts b/config/rsbuild/rsbuild.config.ts index 227c9a46049..167f72fc5fe 100644 --- a/config/rsbuild/rsbuild.config.ts +++ b/config/rsbuild/rsbuild.config.ts @@ -37,7 +37,15 @@ export default defineConfig(async ({command}) => { const common: RsbuildConfig = getCommonConfiguration({file: envFile, platform: 'web'}); if (!isDevServer) { - return common; + return { + ...common, + performance: { + ...common.performance, + // Invalidate the persistent cache (enabled in rsbuild.common.ts) if this config file + // itself changes, same as the dev-server branch below. + buildCache: {buildDependencies: [filename]}, + }, + }; } const port = await portfinder.getPortPromise({port: BASE_PORT}); @@ -92,16 +100,6 @@ export default defineConfig(async ({command}) => { // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion const afterCommon = (typeof commonRspackTool === 'function' ? (commonRspackTool(config, utils) ?? config) : config) as typeof config; - // A list of paths rspack trusts would not be modified while rspack is running. - // Onyx and react-native-live-markdown can be modified on the fly, changes to other - // node_modules would not be reflected live. - afterCommon.cache ??= {type: 'persistent'}; - if (typeof afterCommon.cache === 'object' && afterCommon.cache.type === 'persistent') { - afterCommon.cache.snapshot = { - managedPaths: [/([\\/]node_modules[\\/](?!react-native-onyx|@expensify\/react-native-live-markdown))/], - }; - } - afterCommon.plugins ??= []; afterCommon.plugins.push(new ReactRefreshRspackPlugin()); diff --git a/knip.json b/knip.json index 4ce56e311fb..f4154648c2e 100644 --- a/knip.json +++ b/knip.json @@ -8,7 +8,7 @@ "src/HybridAppHandler.tsx", "scripts/**/*.{js,ts}", "web/proxy.ts", - "config/rsbuild/**/*.{js,mjs,ts}", + "config/rsbuild/**/*.{js,mjs,cjs,ts}", ".github/scripts/**/*.ts", ".github/actions/javascript/**/*.ts", ".storybook/**/*.{js,ts,tsx}", @@ -58,9 +58,12 @@ "lodash", "@babel/plugin-proposal-private-methods", "@babel/plugin-proposal-private-property-in-object", + "@babel/plugin-transform-export-namespace-from", "babel-plugin-module-resolver", + "babel-plugin-react-compiler", "babel-plugin-transform-remove-console", "@fullstory/babel-plugin-react-native", + "@fullstory/babel-plugin-annotate-react", "eslint-config-airbnb-typescript", "eslint-config-prettier", "eslint-plugin-storybook", @@ -70,7 +73,9 @@ "bun", "shellcheck", "patch-package", - "diff-so-fancy" + "diff-so-fancy", + "oxc-webpack-loader", + "@babel/plugin-proposal-class-properties" ], "ignoreBinaries": ["metro-symbolicate", "mkcert"] } diff --git a/package-lock.json b/package-lock.json index ca2667209c0..353d9169af8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -157,20 +157,13 @@ "@babel/core": "^7.25.2", "@babel/parser": "^7.22.16", "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/preset-env": "^7.25.3", - "@babel/preset-flow": "^7.12.13", - "@babel/preset-react": "^7.10.4", - "@babel/preset-typescript": "^7.21.5", "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", "@callstack/reassure-compare": "^1.0.0-rc.4", "@dword-design/eslint-plugin-import-alias": "^5.0.0", - "@fullstory/babel-plugin-annotate-react": "^2.3.2", + "@fullstory/babel-plugin-annotate-react": "^2.4.0", "@fullstory/babel-plugin-react-native": "^1.5.2", "@jest/globals": "^29.7.0", "@ngneat/falso": "^7.1.1", @@ -189,7 +182,6 @@ "@rock-js/plugin-metro": "0.13.4", "@rock-js/provider-s3": "0.13.4", "@rsbuild/core": "^2.1.4", - "@rsbuild/plugin-babel": "^2.0.1", "@rsbuild/plugin-svgr": "^2.0.5", "@rsdoctor/rspack-plugin": "^1.5.17", "@rspack/core": "^2.1.2", @@ -230,8 +222,7 @@ "@welldone-software/why-did-you-render": "7.0.1", "babel-jest": "29.7.0", "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260422", - "babel-plugin-react-native-web": "^0.18.7", + "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260507", "babel-plugin-transform-remove-console": "^6.9.4", "babel-preset-expo": "^56.0.15", "bun": "^1.3.14", @@ -270,6 +261,8 @@ "nitrogen": "0.35.0", "onchange": "^7.1.0", "openai": "^6.16.0", + "oxc-transform": "0.136.0", + "oxc-webpack-loader": "^1.0.2", "oxfmt": "^0.55.0", "patch-package": "^8.1.0-canary.1", "peggy": "^4.0.3", @@ -2277,21 +2270,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "dev": true, @@ -2411,17 +2389,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.26.0", "license": "MIT", @@ -3619,25 +3586,6 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/preset-react": { - "version": "7.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.23.3", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.23.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-typescript": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", @@ -9230,9 +9178,9 @@ } }, "node_modules/@fullstory/babel-plugin-annotate-react": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@fullstory/babel-plugin-annotate-react/-/babel-plugin-annotate-react-2.3.2.tgz", - "integrity": "sha512-s6TAsAivWcP32fNOAwmEW6LdjE+gjCOlf4ILrqMdVS8EDJeHf51s1tO+teQkY3XiOY4QziYu0eR9TeoRfyqOQw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@fullstory/babel-plugin-annotate-react/-/babel-plugin-annotate-react-2.4.0.tgz", + "integrity": "sha512-ALBMsGR86Yg/+22UOUCB0MSFlXNVkxE8az9ZxOOE/bO1FXCjC4/7cpFTqk2rkLA0nyde1j+Cbydb8oXNr3ZjHA==", "license": "MIT", "engines": { "node": ">=16.20.2", @@ -12180,6 +12128,382 @@ "win32" ] }, + "node_modules/@oxc-transform/binding-android-arm-eabi": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm-eabi/-/binding-android-arm-eabi-0.136.0.tgz", + "integrity": "sha512-zWyz4qFxPXplAgPMTr02oIAuN/8/DbONjj8/xYp2r6n6N2wnWWZuEAMNMixu+DJuA0BcMmAaHlIhjKAgyfFuXw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-android-arm64": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.136.0.tgz", + "integrity": "sha512-WyR+ZOAHaMsGSANAeluwfTEL+1u4mvWYtW3FANKROgMxwJeASZzU0zHtH7Cmms0ORbp+0SVUViNQ4Hht4XbkAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-darwin-arm64": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.136.0.tgz", + "integrity": "sha512-NPWct7Cft+Ekm7/qIwfnKwCqWY72nb/l1Mm2Izozry5wRRjBs+dyMB8Z+m6iQSVfQRIWsu3jy45Of6Zef32K9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-darwin-x64": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.136.0.tgz", + "integrity": "sha512-i+6lFZR070hG7+BfNUZS9sBfgf1t+NLYWS6IquoXyoV+QDAiCOf/UDPDqOjkKDgQQmGZ3qWzL+WEeH1GlYMO+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-freebsd-x64": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.136.0.tgz", + "integrity": "sha512-fPgYtBata14S53LeuhowbBYNIJ3SJwk1Aw3ear+j7F9gLpiWIkL4e8gOma8SCgOLtTOMbYdOyKk13KDFAqoMGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.136.0.tgz", + "integrity": "sha512-irYpUBJnMxQr62MHWe1y3Oefb4FSF9+/ZiO6efMmh6FVPYlbh6bcQi/t+eG2KORMsf9YLt3qh5dmdfpQbiAIWA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm-musleabihf": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.136.0.tgz", + "integrity": "sha512-luUqj3eHnT5GyfK88O0HIXcnnURAn62KvcONEBs7zNje/At5Vides2Rx5NuT1X/cvSWLqR8yknBz2UMwVQeqyw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm64-gnu": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.136.0.tgz", + "integrity": "sha512-WdxFWJAE3PvJMrekaKYzmx2Abr6YVeJGOjyMI1iTiSeMJdazXKqH5sWR7td4BWTQ1ZSkd2FptuhDPVhVGElfYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-arm64-musl": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.136.0.tgz", + "integrity": "sha512-rFHkHUQIz/KgAQDZgiFGFj2OQiL+csw+tDI5aCrFY3v9RTUiQRkaxXcjGgV6gMhdEd81357vw6K3xucVmRP+cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-ppc64-gnu": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.136.0.tgz", + "integrity": "sha512-B86BlWTVD68V3T78/gp17etSPvjLWVN6WJDexZzMzOP92hzVdK8c6KT8mL8a+UY3RlSUwsquVfxtHv2Z1tYLtw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-riscv64-gnu": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.136.0.tgz", + "integrity": "sha512-lIVizI3eTCPuk9NBFYaHArxoJ0/LC1e4hipcIateeofUNOEXqehfkVwrMI07k4DAW/2ya/ZnUVgaLY+x4wg+NA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-riscv64-musl": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.136.0.tgz", + "integrity": "sha512-80igJtLGGWYp5qK3pS3/jAqD/m4jre0Fwu3YXHyHSIj197os9qIy3pn4NN35rogE4pVV4/mcx4SmqB3DsG51bA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-s390x-gnu": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.136.0.tgz", + "integrity": "sha512-SNAHfIhq8TjaxiTV1jFZwFReP49E9nwOalEcIh5xs4O6UAiy8I6QYuve2vTuJrvKNOkIse6RotUzywirkoV6Pg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-x64-gnu": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.136.0.tgz", + "integrity": "sha512-HXMySHa9hcPsYf2byqUEKixrsBakGvYWpA9I3r7R00Zs2OJu7foPsVIYfQeP8jhvNpactigBpptWvXM3E64Jcw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-linux-x64-musl": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.136.0.tgz", + "integrity": "sha512-d2NQ3HMV6cltpJpJ6y9ENY37+6CQcY6/tuPLY1BzGmsdVVvajwu7uIbyWz56GZDiPf2pow+j2qDSCb0xy6VyvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-openharmony-arm64": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-openharmony-arm64/-/binding-openharmony-arm64-0.136.0.tgz", + "integrity": "sha512-ZDDZvFWEIhAo+BXeoAcF+kswaHA2j6DgYmnsVxXgoKaJp5LpMMbK8stqX80KJbydpT+ik02nvy5XMSSfY9LTbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-wasm32-wasi": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.136.0.tgz", + "integrity": "sha512-EFNYyWFmj4wF7K7+c9DsPQCTAFfiTVNasJ4X0ZuwjPNQUcV161z5YXeZJepgqDicqdmWCsRqJP4NPsngiWWJRw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.5" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-transform/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-transform/binding-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@oxc-transform/binding-win32-arm64-msvc": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.136.0.tgz", + "integrity": "sha512-jyRyFVci/T6hMtCIPCCkW/ZFYhK989hXFy27aLUnyvdJYAaMlq2h7lahh/MkTNv0ll5hokXWwQ3Hwak8EeSXoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-win32-ia32-msvc": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.136.0.tgz", + "integrity": "sha512-jdmNkL0+vLYvaSVVtbs39eaVHDqPFRSTWCksC7hADlZWlKlp93fE291scodjNMIOObC/ABOc5jf95JY3/qJzSg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxc-transform/binding-win32-x64-msvc": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.136.0.tgz", + "integrity": "sha512-cPmcOHoAyfYxH0OKYP54fiu8SJudF9RBoI9QFcnBttEOSdmapOU+dDO7pvuvcbUY5rLZMek8OZi2r9fA/jwZ4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@oxfmt/binding-android-arm-eabi": { "version": "0.55.0", "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.55.0.tgz", @@ -13943,30 +14267,6 @@ } } }, - "node_modules/@rsbuild/plugin-babel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rsbuild/plugin-babel/-/plugin-babel-2.0.1.tgz", - "integrity": "sha512-PkKWwQDm6Ll3emj9vrq4DYpob9XYonsgkuo4o9lY3ySNmK18+bKUCzPQkqrsMaJi+h1wDwFH/XnMGlIRS//dCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.29.7", - "@babel/plugin-proposal-decorators": "^7.29.7", - "@babel/plugin-transform-class-properties": "^7.29.7", - "@babel/preset-typescript": "^7.29.7", - "@types/babel__core": "^7.20.5", - "babel-loader": "10.1.1", - "reduce-configs": "^1.1.2" - }, - "peerDependencies": { - "@rsbuild/core": "^2.0.0" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - } - } - }, "node_modules/@rsbuild/plugin-check-syntax": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@rsbuild/plugin-check-syntax/-/plugin-check-syntax-1.6.1.tgz", @@ -20175,32 +20475,6 @@ "node": ">=8" } }, - "node_modules/babel-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz", - "integrity": "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0 || ^8.0.0-beta.1", - "@rspack/core": "^1.0.0 || ^2.0.0-0", - "webpack": ">=5.61.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, "node_modules/babel-plugin-add-module-exports": { "version": "1.0.4", "dev": true, @@ -20328,19 +20602,14 @@ } }, "node_modules/babel-plugin-react-compiler": { - "version": "0.0.0-experimental-a1856f3-20260422", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-a1856f3-20260422.tgz", - "integrity": "sha512-rYwQFX52TaZk2lJZNLp2V9jun1sSJZEBAW5S4Rjt8mnOjEtz5Cab/7yjG4ZLBWuofgWiqSb6laPVkhBpYd0n4w==", + "version": "0.0.0-experimental-a1856f3-20260507", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-a1856f3-20260507.tgz", + "integrity": "sha512-NH/o9ojGrQ5xQhkLry8KulKssfWuM68myEGVUpIJhExt1/WVWBOTBPSPGiSRoJtfB9yP8Kj4UXZpLXKFCXineg==", "license": "MIT", "dependencies": { "@babel/types": "^7.26.0" } }, - "node_modules/babel-plugin-react-native-web": { - "version": "0.18.12", - "dev": true, - "license": "MIT" - }, "node_modules/babel-plugin-syntax-hermes-parser": { "version": "0.33.3", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz", @@ -33922,6 +34191,52 @@ "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, + "node_modules/oxc-transform": { + "version": "0.136.0", + "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.136.0.tgz", + "integrity": "sha512-7mVjRVgUAFl2OKCQMFjWmfrdx5Hcr20VQBLHm/SS/a/JJalal8gRVH2AoPymp9h5efJjB3REukK662aWJk4MsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxc-transform/binding-android-arm-eabi": "0.136.0", + "@oxc-transform/binding-android-arm64": "0.136.0", + "@oxc-transform/binding-darwin-arm64": "0.136.0", + "@oxc-transform/binding-darwin-x64": "0.136.0", + "@oxc-transform/binding-freebsd-x64": "0.136.0", + "@oxc-transform/binding-linux-arm-gnueabihf": "0.136.0", + "@oxc-transform/binding-linux-arm-musleabihf": "0.136.0", + "@oxc-transform/binding-linux-arm64-gnu": "0.136.0", + "@oxc-transform/binding-linux-arm64-musl": "0.136.0", + "@oxc-transform/binding-linux-ppc64-gnu": "0.136.0", + "@oxc-transform/binding-linux-riscv64-gnu": "0.136.0", + "@oxc-transform/binding-linux-riscv64-musl": "0.136.0", + "@oxc-transform/binding-linux-s390x-gnu": "0.136.0", + "@oxc-transform/binding-linux-x64-gnu": "0.136.0", + "@oxc-transform/binding-linux-x64-musl": "0.136.0", + "@oxc-transform/binding-openharmony-arm64": "0.136.0", + "@oxc-transform/binding-wasm32-wasi": "0.136.0", + "@oxc-transform/binding-win32-arm64-msvc": "0.136.0", + "@oxc-transform/binding-win32-ia32-msvc": "0.136.0", + "@oxc-transform/binding-win32-x64-msvc": "0.136.0" + } + }, + "node_modules/oxc-webpack-loader": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/oxc-webpack-loader/-/oxc-webpack-loader-1.0.2.tgz", + "integrity": "sha512-rLdHfhM4Ir8psAYVIjYpGDjkTqk+SqsUWTRClA9/DnPjZQtzauCHITXzT6KcNAU8OdpHW9U+LYIeigWe2+7LkQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "oxc-transform": "^0.115.0 || ^0.131.0 || ^0.132.0 || ^0.133.0 || ^0.134.0 || ^0.135.0 || ^0.138.0", + "webpack": ">=5" + } + }, "node_modules/oxfmt": { "version": "0.55.0", "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.55.0.tgz", diff --git a/package.json b/package.json index 8c22696bb13..2945f72f124 100644 --- a/package.json +++ b/package.json @@ -230,20 +230,13 @@ "@babel/core": "^7.25.2", "@babel/parser": "^7.22.16", "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", - "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/preset-env": "^7.25.3", - "@babel/preset-flow": "^7.12.13", - "@babel/preset-react": "^7.10.4", - "@babel/preset-typescript": "^7.21.5", "@babel/traverse": "^7.22.20", - "@babel/types": "^7.22.19", "@callstack/reassure-compare": "^1.0.0-rc.4", "@dword-design/eslint-plugin-import-alias": "^5.0.0", - "@fullstory/babel-plugin-annotate-react": "^2.3.2", + "@fullstory/babel-plugin-annotate-react": "^2.4.0", "@fullstory/babel-plugin-react-native": "^1.5.2", "@jest/globals": "^29.7.0", "@ngneat/falso": "^7.1.1", @@ -262,7 +255,6 @@ "@rock-js/plugin-metro": "0.13.4", "@rock-js/provider-s3": "0.13.4", "@rsbuild/core": "^2.1.4", - "@rsbuild/plugin-babel": "^2.0.1", "@rsbuild/plugin-svgr": "^2.0.5", "@rsdoctor/rspack-plugin": "^1.5.17", "@rspack/core": "^2.1.2", @@ -303,8 +295,7 @@ "@welldone-software/why-did-you-render": "7.0.1", "babel-jest": "29.7.0", "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260422", - "babel-plugin-react-native-web": "^0.18.7", + "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260507", "babel-plugin-transform-remove-console": "^6.9.4", "babel-preset-expo": "^56.0.15", "bun": "^1.3.14", @@ -343,6 +334,8 @@ "nitrogen": "0.35.0", "onchange": "^7.1.0", "openai": "^6.16.0", + "oxc-transform": "0.136.0", + "oxc-webpack-loader": "^1.0.2", "oxfmt": "^0.55.0", "patch-package": "^8.1.0-canary.1", "peggy": "^4.0.3", @@ -372,7 +365,6 @@ "@typescript-eslint/eslint-plugin": "8.58.1", "@typescript-eslint/parser": "8.58.1", "mapbox-gl": "^3.24.0", - "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260422", "braces": "3.0.3", "yargs": "17.7.2", "yargs-parser": "21.1.1", @@ -392,6 +384,7 @@ "path-to-regexp": "0.1.10", "send": "0.19.0", "regexpu-core": "6.4.0", + "babel-plugin-react-compiler": "0.0.0-experimental-a1856f3-20260507", "react": "19.2.3", "react-dom": "19.2.3", "eslint-config-expensify": { @@ -422,6 +415,9 @@ }, "@sentry/react-native": { "expo": "56.0.8" + }, + "oxc-webpack-loader": { + "oxc-transform": "0.136.0" } }, "expo": {